From e208788690c40fb629c62208801fcccbde46115c Mon Sep 17 00:00:00 2001 From: Pablo Andres-Martinez <104848389+PabloAndresCQ@users.noreply.github.com> Date: Fri, 29 Sep 2023 12:38:29 +0100 Subject: [PATCH] Feature/mps logger (#32) * Created new general.py file for logger and cutensornet handle. Updated copyright comment. * Added debugging and info logging messages. * Improved messages * Updated Jupyter notebook with example of logger. --- examples/mps_tutorial.ipynb | 1199 ++++++++++++++++- pytket/extensions/cutensornet/general.py | 42 + pytket/extensions/cutensornet/mps/__init__.py | 6 +- pytket/extensions/cutensornet/mps/mps.py | 58 +- pytket/extensions/cutensornet/mps/mps_gate.py | 38 +- pytket/extensions/cutensornet/mps/mps_mpo.py | 40 +- .../extensions/cutensornet/mps/simulation.py | 56 +- .../cutensornet/tensor_network_convert.py | 29 +- 8 files changed, 1395 insertions(+), 73 deletions(-) create mode 100644 pytket/extensions/cutensornet/general.py diff --git a/examples/mps_tutorial.ipynb b/examples/mps_tutorial.ipynb index 984adfe4..f1a2a555 100644 --- a/examples/mps_tutorial.ipynb +++ b/examples/mps_tutorial.ipynb @@ -97,7 +97,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-f6589290-2356-4b8d-a825-fc39b4059b95" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-e13d14af-9a4e-4029-8388-8fb18c773bf6" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["q", [0]], ["q", [1]]], "op": {"type": "CZ"}}, {"args": [["q", [2]]], "op": {"type": "H"}}, {"args": [["q", [3]], ["q", [4]]], "op": {"type": "CX"}}, {"args": [["q", [0]]], "op": {"params": ["0.2"], "type": "Ry"}}, {"args": [["q", [2]], ["q", [1]]], "op": {"params": ["0.3", "0.5", "0.7"], "type": "TK2"}}, {"args": [["q", [4]], ["q", [3]]], "op": {"params": ["0.1"], "type": "ZZPhase"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["q", [0]], ["q", [0]]], [["q", [1]], ["q", [1]]], [["q", [2]], ["q", [2]]], [["q", [3]], ["q", [3]]], [["q", [4]], ["q", [4]]]], "phase": "0.0", "qubits": [["q", [0]], ["q", [1]], ["q", [2]], ["q", [3]], ["q", [4]]]}</div>\n", " </div>\n", @@ -107,7 +107,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "f6589290-2356-4b8d-a825-fc39b4059b95";\n", + " const circuitRendererUid = "e13d14af-9a4e-4029-8388-8fb18c773bf6";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -285,7 +285,7 @@ "outputs": [ { "data": { - "image/png": "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TEFBgbp166ZFixZVOk9CQoKysrJcw6pVq+qwQgAA4Mmq9a6lmjJw4EANHDjwovP4+PgoMjKyjioCAABW4vFtZJKTkxUeHq4OHTpo/PjxOn78+EXndzqdysvLcxsAAED95NFBJiEhQcuXL9fGjRv1wgsvKCUlRQMHDlRxcXGlyyQmJsput7uG2NjYOqwYAADUJZthGIbZRUiSzWbT2rVrNXTo0Ern+de//qW2bdvqiy++UL9+/Sqcx+l0yul0uj7n5eUpNjZWDodDwcHBNV02AACoBXl5ebLb7Zf8/fboKzIXatOmjZo1a6aDBw9WOo+Pj4+Cg4PdBgAAUD9ZKsgcPXpUx48fV1RUlNmlAAAAD2DqU0v5+fluV1fS09O1c+dOhYaGKjQ0VHPmzNHw4cMVGRmpQ4cO6cknn1S7du00YMAAE6sGAACewtQgs337dt12222uz1OnTpUkjR49WosXL9auXbv01ltv6dSpU4qOjlb//v01d+5c+fj4mFUyAADwIB7T2Le2VLWxEAAA8Bz1srEvAADA+QgyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAskwNMl999ZUGDx6s6Oho2Ww2ffDBB27TDcPQM888o6ioKPn5+Sk+Pl4HDhwwp1gAAOBxTA0yBQUF6tatmxYtWlTh9BdffFELFy7U66+/ri1btiggIEADBgxQYWFhHVcKAAA8UWMzv3zgwIEaOHBghdMMw9D8+fM1c+ZMDRkyRJK0fPlyRURE6IMPPtB9991Xl6UCAAAP5LFtZNLT05Wdna34+HjXOLvdrl69eik1NbXS5ZxOp/Ly8twGAABQP3lskMnOzpYkRUREuI2PiIhwTatIYmKi7Ha7a4iNja3VOgEAgHk8NshU14wZM+RwOFxDZmam2SUBAIBa4rFBJjIyUpKUk5PjNj4nJ8c1rSI+Pj4KDg52GwAAQP3ksUGmdevWioyM1MaNG13j8vLytGXLFsXFxZlYGQAA8BSmPrWUn5+v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", + "image/png": "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GzdOJ06c0EMPPaTMzEx16dJFK1assGaMGQAA4JccpqyhBmuIrKwsuVwuud1uhYeHW10OAEBSbm6uUlJS1LRp07P+CAQ129mOg8p8f1s+zgwAAMC5IMwAAABbI8wAAFBDDB8+XH/84x+tLuO8I8wAAFAJw4cPl8PhKPFKTEy0ujS9+OKLWrhwodVlSCoa9PaDDz44L5/l179mAgCgVLluKe+Y5GpUcpr7sOQMrdYn3icmJmrBggVebVYO2FpQUCCHwyGXq/r67M84MwMAsJdct7ToT9LCfpL7R+9p7h+L2hf9qWi+auJ0OhUdHe31atCggVatWqXAwEB9+eWXnnlnzJihCy+8UGlpaZKkXr16afTo0Ro9erTq16+viIgIPfHEE17Pb8rPz9e4cePUqFEjhYSEqEuXLl4D4i1cuFD169fXRx99pNatW8vpdOrgwYMlLjP16tVLDz/8sJKSktSgQQNFRUVp7ty5ysnJ0d13362wsDA1b95cn376qVf/du/erX79+ik0NFRRUVEaMmSIfv31V6/1PvLIIxo3bpwaNmyo6OhoTZ482TO9SZMmkqRbbrlFDofD8766EGYAAPaSd0zK+UXKPCAtvPH3QOP+seh95oGi6XnHzntpvXr1UlJSkoYMGSK3261vv/1WEydO1Lx587wezfPGG2/oggsu0Pr16zV79mzNnDlT8+fP90y/++679fXXX2vx4sXavn27br31ViUmJmrfvn2eeY4fP65p06Zp/vz52rVrlyIjI0ut6Y033tCFF16oDRs26OGHH9aDDz6oW2+9Vd26ddOWLVvUp08fDRkyRMePH5dU9JDKnj176oorrtCmTZu0fPly/fzzz7rttttKrDckJETr16/X9OnT9dRTTyk5OVmSPA+QXrBggdLS0kp9oHSVMjWc2+02kozb7ba6FADA/5w4ccLs3r3bnDhxwrcV/JZqzKx2xjwZXvTfg+u83/+WWrUFn2bYsGEmICDAhISEeL2eeuopY4wxeXl55sorrzS33Xabufzyy829997rtXzPnj3NZZddZgoLCz1t48ePN5dddpkxxpjvv//eOBwOc/jwYa/lrr/+ejNhwgRjjDELFiwwksy2bdtK1DZgwACvz7rmmms870+dOmVCQkLMkCFDPG1paWlGkvnmm2+MMcZMmjTJJCQkeK03NTXVSDJ79+4tdb3GGHPVVVeZ8ePHe95LMkuXLi1jKxY523FQme9v7pkBANiPK04a/vHvZ2JeTyhqb9CkqN0VV60ff+211+rVV1/1amvYsKEkKTAwUIsWLVK7du3UuHFjzZo1q8TyV199tRwOh+d9165dNWPGDBUUFGjLli0yxqhVq1Zey+Tl5Ski4vcnhAcGBqpdu3bl1nr6PAEBAYqIiFDbtm09bcUPb87IyJBU9CDolStXKjQ0tMS6fvjhB09dZ352TEyMZx3nG2EGAGBPrjjplrm/Bxmp6H01Bxmp6FmCLVq0KHP62rVrJUlHjx7V0aNHFRISUuF1FxYWKiAgQJs3b1ZAQIDXtNMDRlBQkFcgKkvdunW93jscDq+24nUUFhZ6/tu/f/9SH+p8+qWy0tZbvI7zjTADALAn94/S0vu925bef17OzJzNDz/8oDFjxmjevHl67733NHToUH3++eeqU+f321TXrVvntcy6devUsmVLBQQE6Morr1RBQYEyMjLUvXv3812+OnTooH//+99q0qSJLrjA95hQt25dFRQUVGFlZeMGYACA/Zx+s2+DJtKIFUX/PfOm4GqSl5en9PR0r9evv/6qgoICDRkyRAkJCbr77ru1YMEC7dy5UzNmzPBaPjU1VWPHjtXevXv1zjvv6KWXXtKjjz4qSWrVqpXuuusuDR06VEuWLFFKSoo2btyo559/Xp988km19kuSRo0apaNHj2rQoEHasGGD9u/frxUrVmjEiBGVCidNmjTR559/rvT0dGVmZlZjxYQZAIDduA97B5nhH0sXdyn6r1egOVxtJSxfvlwxMTFer2uuuUbPPvusDhw4oLlz50qSoqOjNX/+fD3xxBPatm2bZ/mhQ4fqxIkT6ty5s0aNGqWHH35Y99//+1mmBQsWaOjQoXrsscd0ySWX6Oabb9b69esVHx9fbX0qFhsbq6+//loFBQXq06eP2rRpo0cffVQul8vr7FJ5ZsyYoeTkZMXHx+vKK6+sxop5ajYAwALn9NTs4nFmcn4peUmp+IxNyEXS4H9X68B5vurVq5euuOKKUm8Mrm2q6qnZ3DMDALCXeq6ioFLaCMCuOGn4J9U+AjD8C2EGAGA/9Vxlh5XSHnGAGo0wAwDAeXT6YwlQNbgBGAAA2BphBgBgmRr+GxSUo6r2P2EGAHDeFY8eW/xwQ9ROxfv/zNGEK4t7ZgAA511AQIDq16/veZZPcHBwhYbmR81gjNHx48eVkZGh+vXrl3hsQ2URZgAAloiOjpYkyx5OCOvVr1/fcxycC8IMAMASDodDMTExioyM1MmTJ60uB+dZ3bp1z/mMTDHCDADAUgEBAVX2pYbaiRuAAQCArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArVkaZl599VW1a9dO4eHhCg8PV9euXfXpp596phtjNHnyZMXGxiooKEi9evXSrl27LKwYAAD4G0vDTFxcnJ577jlt2rRJmzZt0nXXXacBAwZ4Asv06dP1wgsvaM6cOdq4caOio6PVu3dvZWdnW1k2AADwIw5jjLG6iNM1bNhQf//73zVixAjFxsYqKSlJ48ePlyTl5eUpKipKzz//vEaOHFmh9WVlZcnlcsntdis8PLw6SwcAAFWkMt/ffnPPTEFBgRYvXqycnBx17dpVKSkpSk9PV0JCgmcep9Opnj17au3atWWuJy8vT1lZWV4vAABQc1keZnbs2KHQ0FA5nU498MADWrp0qVq3bq309HRJUlRUlNf8UVFRnmmlmTZtmlwul+cVHx9frfUDAABrWR5mLrnkEm3btk3r1q3Tgw8+qGHDhmn37t2e6Q6Hw2t+Y0yJttNNmDBBbrfb80pNTa222gEAgPUusLqAwMBAtWjRQpLUqVMnbdy4US+++KLnPpn09HTFxMR45s/IyChxtuZ0TqdTTqezeosGAAB+w/IzM2cyxigvL09NmzZVdHS0kpOTPdPy8/O1evVqdevWzcIKAQCAP7H0zMxf//pX9e3bV/Hx8crOztbixYu1atUqLV++XA6HQ0lJSZo6dapatmypli1baurUqQoODtadd95pZdkAAMCPWBpmfv75Zw0ZMkRpaWlyuVxq166dli9frt69e0uSxo0bpxMnTuihhx5SZmamunTpohUrVigsLMzKsgEAgB/xu3FmqhrjzAAAYD+2HGcGAADAF4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABgaz6FmdTUVP3444+e9xs2bFBSUpLmzp1bZYUBAABUhE9h5s4779TKlSslSenp6erdu7c2bNigv/71r3rqqaeqtEAAAICz8SnM7Ny5U507d5Ykvffee2rTpo3Wrl2rt99+WwsXLqzK+gAAAM7KpzBz8uRJOZ1OSdJnn32mm2++WZJ06aWXKi0treqqAwAAKIdPYebyyy/XP/7xD3355ZdKTk5WYmKiJOmnn35SRERElRYIAABwNj6Fmeeff16vvfaaevXqpUGDBql9+/aSpGXLlnkuPwEAAJwPDmOM8WXBgoICZWVlqUGDBp62AwcOKDg4WJGRkVVW4LnKysqSy+WS2+1WeHi41eUAAIAKqMz3t8/jzBhjtHnzZr322mvKzs6WJAUGBio4ONjXVQIAAFTaBb4sdPDgQSUmJurQoUPKy8tT7969FRYWpunTpys3N1f/+Mc/qrpOAACAUvl0ZubRRx9Vp06dlJmZqaCgIE/7Lbfcos8//7zKigMAACiPT2dmvvrqK3399dcKDAz0am/cuLEOHz5cJYUBAABUhE9nZgoLC1VQUFCi/ccff1RYWNg5FwUAAFBRPoWZ3r17a9asWZ73DodDx44d05NPPql+/fpVVW0AAADl8umn2T/99JOuvfZaBQQEaN++ferUqZP27dunCy+8UGvWrOGn2QAA4JxU5vvbp3tmYmNjtW3bNr3zzjvasmWLCgsLdc899+iuu+7yuiEYAACguvk8aJ5dcGYGAAD7qZYzM8uWLatwAcUPngQAAKhuFQ4zf/zjHys0n8PhKPWXTgAAANWhwmGmsLCwOusAAADwic/PZgIAAPAHPoeZzz//XDfddJOaN2+uFi1a6KabbtJnn31WlbUBAACUy6cwM2fOHCUmJiosLEyPPvqoHnnkEYWHh6tfv36aM2dOVdcIAABQJp9+mt2oUSNNmDBBo0eP9mp/+eWX9eyzz+qnn36qsgLPFT/NBgDAfirz/e3TmZmsrCwlJiaWaE9ISFBWVpYvqwQAAPCJT2Hm5ptv1tKlS0u0/+c//1H//v3PuSgAAICK8ulxBpdddpmeffZZrVq1Sl27dpUkrVu3Tl9//bUee+wxzZ492zPvI488UjWVAgAAlMKne2aaNm1asZU7HNq/f3+li6pK3DMDAID9VPuDJlNSUnwq7EzTpk3TkiVL9P/+3/9TUFCQunXrpueff16XXHKJZx5jjKZMmaK5c+cqMzNTXbp00csvv6zLL7+8SmoAAAD2ZumgeatXr9aoUaO0bt06JScn69SpU0pISFBOTo5nnunTp+uFF17QnDlztHHjRkVHR6t3797Kzs62sHIAAOAvfLrMZIzR+++/r5UrVyojI6PEow6WLFniUzG//PKLIiMjtXr1avXo0UPGGMXGxiopKUnjx4+XJOXl5SkqKkrPP/+8Ro4cWe46ucwEAID9VPtPsx999FENGTJEKSkpCg0Nlcvl8nr5yu12S5IaNmwoqehyVnp6uhISEjzzOJ1O9ezZU2vXri11HXl5ecrKyvJ6AQCAmsune2YWLVqkJUuWqF+/flVWiDFGY8eO1TXXXKM2bdpIktLT0yVJUVFRXvNGRUXp4MGDpa5n2rRpmjJlSpXVBQAA/JtPZ2ZcLpeaNWtWpYWMHj1a27dv1zvvvFNimsPh8HpvjCnRVmzChAlyu92eV2pqapXWCQAA/ItPYWby5MmaMmWKTpw4USVFPPzww1q2bJlWrlypuLg4T3t0dLSk38/QFMvIyChxtqaY0+lUeHi41wsAANRcPoWZW2+9VZmZmYqMjFTbtm3VoUMHr1dFGWM0evRoLVmyRF988UWJ8WuaNm2q6OhoJScne9ry8/O1evVqdevWzZfSAQBADePTPTPDhw/X5s2bNXjwYEVFRZV5yac8o0aN0ttvv63//Oc/CgsL85yBcblcCgoKksPhUFJSkqZOnaqWLVuqZcuWmjp1qoKDg3XnnXf69JkAAKBm8emn2SEhIfrvf/+ra6655tw+vIwQtGDBAg0fPlzS74Pmvfbaa16D5hXfJFwefpoNAID9VOb726cwc+mll+q9995Tu3btfC7yfCHMAABgP9U+zsyMGTM0btw4HThwwJfFAQAAqoxP98wMHjxYx48fV/PmzRUcHKy6det6TT969GiVFAcAAFAen8LMrFmzqrgMAAAA3/gUZoYNG1bVdQAAAPjEpzBzuhMnTujkyZNebdxoCwAAzhefbgDOycnR6NGjFRkZqdDQUDVo0MDrBQAAcL74FGbGjRunL774Qq+88oqcTqfmz5+vKVOmKDY2Vm+++WZV1wgAAFAmny4zffjhh3rzzTfVq1cvjRgxQt27d1eLFi3UuHFjvfXWW7rrrruquk4AAIBS+XRm5ujRo57nKIWHh3t+in3NNddozZo1VVcdAABAOXwKM82aNfMMmNe6dWu99957korO2NSvX7+qagMAACiXT2Hm7rvv1rfffitJmjBhgufemTFjxugvf/lLlRYIAABwNj49m+lMhw4d0qZNm9S8eXO1b9++KuqqMjybCQAA+6m2ZzOtX79en376qVfbm2++qZ49e+qBBx7Qyy+/rLy8vMpXDAAA4KNKhZnJkydr+/btnvc7duzQPffcoxtuuEETJkzQhx9+qGnTplV5kQAAAGWpVJjZtm2brr/+es/7xYsXq0uXLpo3b57GjBmj2bNne24GBgAAOB8qFWYyMzMVFRXleb969WolJiZ63l911VVKTU2tuuoAAADKUakwExUVpZSUFElSfn6+tmzZoq5du3qmZ2dnq27dulVbIQAAwFlUKswkJibq8ccf15dffqkJEyYoODhY3bt390zfvn27mjdvXuVFAgAAlKVSjzN45plnNHDgQPXs2VOhoaF64403FBgY6Jn++uuvKyEhocqLBAAAKItP48y43W6FhoYqICDAq/3o0aMKDQ31CjhWY5wZAADspzLf3z49aNLlcpXa3rBhQ19WBwAA4DOfHmcAAADgLwgzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggz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7Fjde++9uuGGG/Tcc8/phx9+KPPzKjPvrbfeqhMnTqhZs2a67777tHTpUp06deqs/SkoKNCzzz6rdu3aKSIiQqGhoVqxYoVXvaXZvHmzVq5cqdDQUM/r0ksvlST98MMPat++va6//nq1bdtWt956q+bNm6fMzMyzrhNA1SDMADirkJAQtWjRQi1atFDnzp31z3/+Uzk5OZo3b54kad26dbrjjjvUt29fffTRR9q6dasmTpyo/Px8zzomT56sXbt26cYbb9QXX3yh1q1ba+nSpaV+XmXmjY+P1969e/Xyyy8rKChIDz30kHr06OF1v86ZZsyYoZkzZ2rcuHH64osvtG3bNvXp08er3tIUFhaqf//+nmBX/Nq3b5969OihgIAAJScn69NPP1Xr1q310ksv6ZJLLlFKSkp5mxjAOSLMAKgUh8OhOnXq6MSJE5Kkr7/+Wo0bN9bEiRPVqVMntWzZ0uusTbFWrVppzJgxWrFihQYOHKgFCxaU+RmVmTcoKEg333yzZs+erVWrVumbb77Rjh07JEmBgYEqKCjwmv/LL7/UgAEDNHjwYLVv317NmjXTvn37vOYpbbkOHTpo165datKkiSfcFb9CQkI82+YPf/iDpkyZoq1btyowMLDMIAag6hBmAJxVXl6e0tPTlZ6erj179ujhhx/WsWPH1L9/f0lSixYtdOjQIS1evFg//PCDZs+e7fUFfuLECY0ePVqrVq3SwYMH9fXXX2vjxo267LLLSnxWZeaVin4J9c9//lM7d+7U/v379a9//UtBQUFq3LixpKJxZtasWaPDhw97fnXUokULJScna+3atdqzZ49Gjhyp9PR0r/U2adJE69ev14EDB/Trr7+qsLBQo0aN0tGjRzVo0CBt2LBB+/fv14oVKzRixAgVFBRo/fr1mjp1qjZt2qRDhw5pyZIl+uWXX8qsHUAVsvqmHQD+a9iwYUaS5xUWFmauuuoq8/7773vN95e//MVERESY0NBQc/vtt5uZM2d6burNy8szd9xxh4mPjzeBgYEmNjbWjB492pw4ccIY430DcHnznmnp0qWmS5cuJjw83ISEhJirr77afPbZZ57p33zzjWnXrp1xOp2m+K+7I0eOmAEDBpjQ0FATGRlpnnjiCTN06FAzYMAAz3J79+41V199tQkKCjKSTEpKijHGmO+++87ccsstpn79+iYoKMhceumlJikpyRQWFprdu3ebPn36mIsuusg4nU7TqlUr89JLL1XBXgBQHocx/G4QAADYF5eZAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArf1/hYs84yYwXkgAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -473,7 +473,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-827efb1f-a27d-49d8-83f1-beb6c80c4a56" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-067d69bc-bdde-4810-ac70-5b0fe1129460" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["q", [1]]], "op": {"type": "H"}}, {"args": [["q", [2]], ["q", [3]]], "op": {"params": ["0.3"], "type": "ZZPhase"}}, {"args": [["q", [4]]], "op": {"params": ["0.8"], "type": "Ry"}}, {"args": [["q", [0]], ["q", [1]]], "op": {"type": "CX"}}, {"args": [["q", [3]], ["q", [4]]], "op": {"type": "CZ"}}, {"args": [["q", [1]], ["q", [2]]], "op": {"params": ["0.7"], "type": "XXPhase"}}, {"args": [["q", [1]], ["q", [4]]], "op": {"params": ["0.1", "0.2", "0.4"], "type": "TK2"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["q", [0]], ["q", [0]]], [["q", [1]], ["q", [1]]], [["q", [2]], ["q", [2]]], [["q", [3]], ["q", [3]]], [["q", [4]], ["q", [4]]]], "phase": "0.0", "qubits": [["q", [0]], ["q", [1]], ["q", [2]], ["q", [3]], ["q", [4]]]}</div>\n", " </div>\n", @@ -483,7 +483,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "827efb1f-a27d-49d8-83f1-beb6c80c4a56";\n", + " const circuitRendererUid = "067d69bc-bdde-4810-ac70-5b0fe1129460";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -601,7 +601,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-63c69977-1f18-4780-a1c9-c5ffc874f18e" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-87b5c904-f430-4e00-b6c6-601952b6581f" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["node", [1]]], "op": {"params": ["0.8"], "type": "Ry"}}, {"args": [["node", [3]]], "op": {"type": "H"}}, {"args": [["node", [0]], ["node", [1]]], "op": {"type": "SWAP"}}, {"args": [["node", [4]], ["node", [3]]], "op": {"type": "CX"}}, {"args": [["node", [2]], ["node", [1]]], "op": {"params": ["0.3"], "type": "ZZPhase"}}, {"args": [["node", [1]], ["node", [0]]], "op": {"type": "CZ"}}, {"args": [["node", [3]], ["node", [2]]], "op": {"params": ["0.7"], "type": "XXPhase"}}, {"args": [["node", [3]], ["node", [2]]], "op": {"type": "SWAP"}}, {"args": [["node", [2]], ["node", [1]]], "op": {"type": "SWAP"}}, {"args": [["node", [1]], ["node", [0]]], "op": {"params": ["0.1", "0.2", "0.4"], "type": "TK2"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["node", [0]], ["node", [0]]], [["node", [1]], ["node", [1]]], [["node", [2]], ["node", [2]]], [["node", [3]], ["node", [3]]], [["node", [4]], ["node", [4]]]], "phase": "0.0", "qubits": [["node", [0]], ["node", [1]], ["node", [2]], ["node", [3]], ["node", [4]]]}</div>\n", " </div>\n", @@ -611,7 +611,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "63c69977-1f18-4780-a1c9-c5ffc874f18e";\n", + " const circuitRendererUid = "87b5c904-f430-4e00-b6c6-601952b6581f";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -774,10 +774,10 @@ "output_type": "stream", "text": [ "Time taken by approximate contraction with bound chi:\n", - "4.64 seconds\n", + "1.47 seconds\n", "\n", "Lower bound of the fidelity:\n", - "0.3834\n" + "0.3587\n" ] } ], @@ -811,10 +811,10 @@ "output_type": "stream", "text": [ "Time taken by approximate contraction with fixed truncation fidelity:\n", - "10.03 seconds\n", + "2.62 seconds\n", "\n", "Lower bound of the fidelity:\n", - "0.9367\n" + "0.9334\n" ] } ], @@ -866,8 +866,8 @@ "output_type": "stream", "text": [ "MPSxGate\n", - "\tTime taken: 4.71 seconds\n", - "\tLower bound of the fidelity: 0.3834\n" + "\tTime taken: 1.35 seconds\n", + "\tLower bound of the fidelity: 0.3589\n" ] } ], @@ -892,8 +892,8 @@ "output_type": "stream", "text": [ "MPSxMPO, default parameters\n", - "\tTime taken: 22.58 seconds\n", - "\tLower bound of the fidelity: 0.4275\n" + "\tTime taken: 12.6 seconds\n", + "\tLower bound of the fidelity: 0.3847\n" ] } ], @@ -918,8 +918,8 @@ "output_type": "stream", "text": [ "MPSxMPO, custom parameters\n", - "\tTime taken: 31.27 seconds\n", - "\tLower bound of the fidelity: 0.4603\n" + "\tTime taken: 22.52 seconds\n", + "\tLower bound of the fidelity: 0.3977\n" ] } ], @@ -940,13 +940,1174 @@ "source": [ "**Note**: `MPSxMPO` also admits truncation policy in terms of `truncation_fidelity` instead of `chi`." ] + }, + { + "cell_type": "markdown", + "id": "d1e0091f-e258-472f-aef5-bec2ad215e56", + "metadata": {}, + "source": [ + "# Using the logger" + ] + }, + { + "cell_type": "markdown", + "id": "7607b5bd-f332-4d97-963b-2a163d3fb194", + "metadata": {}, + "source": [ + "You can request a verbose log to be produced during simulation, by assigning the `loglevel` argument when calling `simulate`. Currently, two log levels are supported (other than default, which is silent): \n", + "- `logging.INFO` will print information about progress percent, memory currently occupied by the MPS and current fidelity. Additionally, some high level information of the current stage of the simulation is provided, such as when `MPSxMPO` is applying optimisation sweeps.\n", + "- `logging.DEBUG` provides all of the messages from the loglevel above plus detailed information of the current operation being carried out and the values of important variables.\n", + "\n", + "**Note**: Due to technical issues with the `logging` module and Jupyter notebooks we need to reload the `logging` module. When working with python scripts and command line, just doing `import logging` is enough." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "eb152bf3-a065-47bb-bc3e-2adb49277881", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from importlib import reload # Not needed in Python 2\n", + "import logging\n", + "reload(logging)" + ] + }, + { + "cell_type": "markdown", + "id": "fd8d8c7f-dcd2-40f9-940f-8dc8cfb31fac", + "metadata": {}, + "source": [ + "An example of the use of `logging.INFO` is provided below. " + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "318073fc-2ef4-492e-8c5a-1ba1ba0b7733", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[14:01:12] Simulation (INFO) - Ordering the gates in the circuit to reduce canonicalisation overhead.\n", + "[14:01:12] Simulation (INFO) - Running simulation...\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00067138671875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=1.0\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00067138671875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000762939453125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344604\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000762939453125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000823974609375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00091552734375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00103759765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00128173828125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:12] MPS (INFO) - Fidelity before optimisation=0.9990283071344602\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9997023479978765\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9997024059075587\n", + "[14:01:12] MPS (INFO) - Final fidelity after optimisation=0.9997024059075587\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00128173828125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0013427734375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00146484375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.001708984375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0020751953125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00262451171875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00274658203125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00299072265625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00347900390625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00396728515625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9993396700769984\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0048828125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9984418366672726\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9978683217610371\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9978683217610371\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:12] MPS (INFO) - Fidelity before optimisation=0.9978683217610371\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.99809024854532\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9981132810448355\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9981209535027262\n", + "[14:01:12] MPS (INFO) - Final fidelity after optimisation=0.9981209535027262\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005950927734375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006072998046875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006317138671875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006805419921875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027261\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.007049560546875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.997423409781103\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.008392333984375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.997423409781103\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.009765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9969717765474623\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01123046875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.996255622087102\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.996255622087102\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01171875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 23%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0118408203125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:12] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0120849609375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:13] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0125732421875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0130615234375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9955811734143832\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.01373291015625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9954580715406015\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0150146484375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9954129745430442\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.01708984375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9946104246997917\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0211181640625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.993986081692407\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:13] MPS (INFO) - Fidelity before optimisation=0.9932754206084036\n", + "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948146155456611\n", + "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948360895424706\n", + "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948431533380159\n", + "[14:01:13] MPS (INFO) - Final fidelity after optimisation=0.9948431533380159\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380159\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02398681640625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380159\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02410888671875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02435302734375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02484130859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02484130859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948396534426794\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0257568359375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9946407082338863\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.026947021484375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9939915775333915\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02850341796875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9930726984365036\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.029144287109375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9925894686689639\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.030609130859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9922594965497078\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.036590576171875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161947\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161949\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038482666015625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038604736328125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038848876953125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.039337158203125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.040069580078125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9914013449577964\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.04107666015625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9909200464032397\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.04278564453125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9909200464032397\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.045379638671875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9904815074905157\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.049224853515625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9895385170678038\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.054351806640625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9893005128956965\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.059844970703125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.98888820372519\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.068878173828125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9879401995661465\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9870682591461779\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", + "[14:01:14] Simulation (INFO) - Progress... 43%\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:14] MPS (INFO) - Fidelity before optimisation=0.9870682591461779\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885243877420532\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885675777883345\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732146\n", + "[14:01:14] MPS (INFO) - Final fidelity after optimisation=0.9885807735732146\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075897216796875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076019287109375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076019287109375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076263427734375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076629638671875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732145\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:14] MPS (INFO) - Fidelity before optimisation=0.9885807735732145\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732146\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732127\n", + "[14:01:14] MPS (INFO) - Final fidelity after optimisation=0.9885807735732127\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076629638671875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732127\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077117919921875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732127\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077117919921875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885437435962636\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077850341796875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.079193115234375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.080902099609375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.083343505859375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9872256262985958\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08380126953125\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9867042570373467\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08624267578125\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9860074263824546\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08868408203125\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9857877466399374\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.09307861328125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9853289590697893\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.09674072265625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9847593868171541\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.10498046875\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9839376637463282\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.110107421875\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.983070631353325\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.12353515625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9820965437215268\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.13287353515625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9813700217282061\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.15484619140625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9806263554164852\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.16436767578125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9796957281177572\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.190460205078125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9787753802493907\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.204498291015625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9779191475648064\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.227935791015625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9770858154529012\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.250579833984375\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9763732931498061\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.298919677734375\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.975569858851943\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.302093505859375\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.97482766334186\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.334991455078125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.334991455078125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892826\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.340118408203125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9735596675843919\n", + "[14:01:15] Simulation (INFO) - Progress... 66%\n", + "[14:01:15] Simulation (INFO) - Progress... 66%\n", + "[14:01:15] Simulation (INFO) - Progress... 66%\n", + "[14:01:15] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:15] MPS (INFO) - Fidelity before optimisation=0.9735596675843919\n", + "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:15] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9843516935412071\n", + "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:15] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9848064428508081\n", + "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9849304313856563\n", + "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9849873035247502\n", + "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9850185604266666\n", + "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9850377284486574\n", + "[14:01:16] MPS (INFO) - Final fidelity after optimisation=0.9850377284486574\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.3406982421875\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9844304521445316\n", + "[14:01:16] Simulation (INFO) - Progress... 66%\n", + "[14:01:16] Simulation (INFO) - Progress... 66%\n", + "[14:01:16] Simulation (INFO) - Progress... 66%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.341339111328125\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9836453925132829\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.344635009765625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9827521125621543\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.352752685546875\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9819763508005264\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.366485595703125\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9810077310496189\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.394256591796875\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9802244249339466\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4154052734375\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9793217534714646\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4249267578125\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9783526934928921\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4468994140625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9773801381930487\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.49566650390625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9764511340458201\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] Simulation (INFO) - Progress... 73%\n", + "[14:01:16] Simulation (INFO) - Progress... 73%\n", + "[14:01:16] Simulation (INFO) - Progress... 73%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 73%\n", + "[14:01:17] Simulation (INFO) - Progress... 73%\n", + "[14:01:17] Simulation (INFO) - Progress... 73%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.513641357421875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.513641357421875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51556396484375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9748529131568249\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51556396484375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9748529131568249\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51983642578125\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9742120807068472\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:17] MPS (INFO) - Fidelity before optimisation=0.9742120807068472\n", + "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.975134847725609\n", + "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9751851737337295\n", + "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9752028508364771\n", + "[14:01:17] MPS (INFO) - Final fidelity after optimisation=0.9752028508364771\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.522216796875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9747413039963226\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.530548095703125\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9737709267327275\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.542144775390625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9730980087583336\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.555572509765625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.972274693739747\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.58514404296875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9714008152517145\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.5892333984375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9705196501761234\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.63214111328125\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9697148601428947\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.65301513671875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9688374595301655\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.731292724609375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9679729595082353\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.756011962890625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9670817720186894\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.851715087890625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9662304487130915\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.903900146484375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.96530121346801\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] Simulation (INFO) - Progress... 83%\n", + "[14:01:17] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.074066162109375\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9644645141858508\n", + "[14:01:18] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.13128662109375\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.963576178040663\n", + "[14:01:18] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.375518798828125\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9627241232539026\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.4351806640625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9617990818895198\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.738677978515625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9610190784537106\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877096\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75701904296875\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75701904296875\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75872802734375\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9596341716247032\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] Simulation (INFO) - Progress... 90%\n", + "[14:01:18] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:18] MPS (INFO) - Fidelity before optimisation=0.9596341716247032\n", + "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9700420977488123\n", + "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9703519467112257\n", + "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704374405302711\n", + "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:19] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704739545165699\n", + "[14:01:19] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:19] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704925687713485\n", + "[14:01:19] MPS (INFO) - Final fidelity after optimisation=0.9704925687713485\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.75872802734375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9704925687713485\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.765777587890625\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9696216444258031\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.77117919921875\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9696216444258033\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.79656982421875\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9687315620521755\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.84222412109375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9679596222596152\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.870208740234375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9670763677407406\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.940521240234375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9661194670712572\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.999114990234375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9652231632846195\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.234954833984375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9642981707017143\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] Simulation (INFO) - Progress... 97%\n", + "[14:01:19] Simulation (INFO) - Progress... 97%\n", + "[14:01:19] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:19] MPS (INFO) - Fidelity before optimisation=0.9633776196448067\n", + "[14:01:19] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.967414171617126\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.967533278009993\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9675675092087742\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9675846146681976\n", + "[14:01:20] MPS (INFO) - Final fidelity after optimisation=0.9675846146681976\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", + "[14:01:20] Simulation (INFO) - Progress... 97%\n", + "[14:01:20] Simulation (INFO) - Progress... 97%\n", + "[14:01:20] Simulation (INFO) - Progress... 97%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", + "[14:01:20] Simulation (INFO) - Progress... 97%\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.34918212890625\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9667630952362768\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.34918212890625\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9667630952362768\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.3427734375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9659837340863052\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.3427734375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9659837340863054\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:20] MPS (INFO) - Fidelity before optimisation=0.9659837340863054\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659853689734507\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659862268998962\n", + "[14:01:20] MPS (INFO) - Final fidelity after optimisation=0.9659862268998962\n", + "[14:01:20] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:20] MPS (INFO) - Fidelity before optimisation=0.9659862268998962\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:21] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.965986226899895\n", + "[14:01:21] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:21] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659862268998954\n", + "[14:01:21] MPS (INFO) - Final fidelity after optimisation=0.9659862268998954\n", + "[14:01:21] Simulation (INFO) - Simulation completed.\n", + "[14:01:21] Simulation (INFO) - Final MPS size=2.3427734375 MiB\n", + "[14:01:21] Simulation (INFO) - Final MPS fidelity=0.9659862268998954\n" + ] + } + ], + "source": [ + "with CuTensorNetHandle() as libhandle:\n", + " simulate(libhandle, circuit, ContractionAlg.MPSxMPO, truncation_fidelity=0.999, loglevel=logging.INFO)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d4a14fe-2ea2-435b-836a-acf9587faad7", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "py-cuquantum-23.06.0-mypich-py3.9", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "py-cuquantum-23.06.0-mypich-py3.9" + "name": "python3" }, "language_info": { "codemirror_mode": { diff --git a/pytket/extensions/cutensornet/general.py b/pytket/extensions/cutensornet/general.py new file mode 100644 index 00000000..efa80aa8 --- /dev/null +++ b/pytket/extensions/cutensornet/general.py @@ -0,0 +1,42 @@ +# Copyright 2019-2023 Quantinuum +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +## +# http://www.apache.org/licenses/LICENSE-2.0 +## +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +from logging import Logger + + +def set_logger( + logger_name: str, + level: int = logging.WARNING, + fmt: str = "[%(asctime)s] %(name)s (%(levelname)s) - %(message)s", +) -> Logger: + """Initialises and configures a logger object. + + Args: + logger_name: Name for the logger object. + level: Logger output level. + fmt: Logger output format. + + Returns: + New configured logger object. + """ + logger = logging.getLogger(logger_name) + logger.setLevel(level) + logger.propagate = False + if not logger.handlers: + handler = logging.StreamHandler() + handler.setLevel(level) + formatter = logging.Formatter(fmt, datefmt="%H:%M:%S") + handler.setFormatter(formatter) + logger.addHandler(handler) + return logger diff --git a/pytket/extensions/cutensornet/mps/__init__.py b/pytket/extensions/cutensornet/mps/__init__.py index dd3abfc7..7eee1b05 100644 --- a/pytket/extensions/cutensornet/mps/__init__.py +++ b/pytket/extensions/cutensornet/mps/__init__.py @@ -1,11 +1,11 @@ -# Copyright 2019 Cambridge Quantum Computing +# Copyright 2019-2023 Quantinuum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +## # http://www.apache.org/licenses/LICENSE-2.0 -# +## # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 3430b5ed..be6c9bc0 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -1,11 +1,11 @@ -# Copyright 2019 Cambridge Quantum Computing +# Copyright 2019-2023 Quantinuum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +## # http://www.apache.org/licenses/LICENSE-2.0 -# +## # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import annotations # type: ignore import warnings +import logging from typing import Any, Optional, Union from enum import Enum @@ -33,6 +34,8 @@ from pytket.circuit import Command, Op, OpType, Qubit from pytket.pauli import Pauli, QubitPauliString +from pytket.extensions.cutensornet.general import set_logger + # An alias so that `intptr_t` from CuQuantum's API (which is not available in # base python) has some meaningful type name. Handle = int @@ -111,6 +114,7 @@ def __init__( chi: Optional[int] = None, truncation_fidelity: Optional[float] = None, float_precision: Optional[Union[np.float32, np.float64]] = None, + loglevel: int = logging.WARNING, ): """Initialise an MPS on the computational state ``|0>``. @@ -139,6 +143,7 @@ def __init__( choose from ``numpy`` types: ``np.float64`` or ``np.float32``. Complex numbers are represented using two of such ``float`` numbers. Default is ``np.float64``. + loglevel: Internal logger output level. Raises: ValueError: If less than two qubits are provided. @@ -173,6 +178,7 @@ def __init__( ) self._lib = libhandle + self._logger = set_logger("MPS", level=loglevel) ####################################### # Initialise the MPS with a |0> state # @@ -225,6 +231,15 @@ def is_valid(self) -> bool: ds_ok = set(self.canonical_form.keys()) == set(range(len(self))) ds_ok = ds_ok and set(self.qubit_position.values()) == set(range(len(self))) + # Debugger logging + self._logger.debug( + "Checking validity of MPS... " + f"chi_ok={chi_ok}, " + f"phys_ok={phys_ok}, " + f"shape_ok={shape_ok}, " + f"ds_ok={ds_ok}" + ) + return chi_ok and phys_ok and shape_ok and ds_ok def apply_gate(self, gate: Command) -> MPS: @@ -258,6 +273,7 @@ def apply_gate(self, gate: Command) -> MPS: "Gates can only be applied to tensors with physical" + " bond dimension of 2." ) + self._logger.debug(f"Applying gate {gate}") if len(positions) == 1: self._apply_1q_gate(positions[0], gate.op) @@ -283,6 +299,7 @@ def apply_gate(self, gate: Command) -> MPS: "Gates must act on only 1 or 2 qubits! " + f"This is not satisfied by {gate}." ) + return self def canonicalise(self, l_pos: int, r_pos: int) -> None: @@ -298,11 +315,15 @@ def canonicalise(self, l_pos: int, r_pos: int) -> None: r_pos: The position of the rightmost tensor that is not to be canonicalised. """ + self._logger.debug(f"Start canonicalisation... l_pos={l_pos}, r_pos={r_pos}") + for pos in range(l_pos): self.canonicalise_tensor(pos, form=DirectionMPS.LEFT) for pos in reversed(range(r_pos + 1, len(self))): self.canonicalise_tensor(pos, form=DirectionMPS.RIGHT) + self._logger.debug(f"Finished canonicalisation.") + def canonicalise_tensor(self, pos: int, form: DirectionMPS) -> None: """Canonicalises a tensor from an MPS object. @@ -321,6 +342,7 @@ def canonicalise_tensor(self, pos: int, form: DirectionMPS) -> None: """ if form == self.canonical_form[pos]: # Tensor already in canonical form, nothing needs to be done + self._logger.debug(f"Position {pos} already in {form}.") return None if self._lib._is_destroyed: @@ -329,6 +351,7 @@ def canonicalise_tensor(self, pos: int, form: DirectionMPS) -> None: "See the documentation of update_libhandle and CuTensorNetHandle.", ) + self._logger.debug(f"Canonicalising {pos} to {form}.") # Glossary of bond IDs used here: # s -> shared virtual bond between T and Tnext # v -> the other virtual bond of T @@ -360,15 +383,19 @@ def canonicalise_tensor(self, pos: int, form: DirectionMPS) -> None: raise ValueError("Argument form must be a value in DirectionMPS.") # Apply QR decomposition + self._logger.debug(f"QR decompose a {T.nbytes / 2**20} MiB tensor.") + subscripts = T_bonds + "->" + Q_bonds + "," + R_bonds options = {"handle": self._lib.handle, "device_id": self._lib.device_id} Q, R = tensor.decompose( subscripts, T, method=tensor.QRMethod(), options=options ) + self._logger.debug(f"QR decomposition finished.") # Contract R into Tnext subscripts = R_bonds + "," + Tnext_bonds + "->" + result_bonds result = cq.contract(subscripts, R, Tnext) + self._logger.debug(f"Contraction with {next_pos} applied.") # Update self.tensors self.tensors[pos] = Q @@ -421,9 +448,12 @@ def vdot(self, other: MPS) -> complex: # Special case if only one tensor remains if len(self) == 1: + self._logger.debug("Applying trivial vdot on single tensor MPS.") result = cq.contract("LRp,lrp->", self.tensors[0].conj(), other.tensors[0]) else: + self._logger.debug("Applying vdot between two MPS.") + # The two MPS will be contracted from left to right, storing the # ``partial_result`` tensor. partial_result = cq.contract( @@ -445,6 +475,7 @@ def vdot(self, other: MPS) -> complex: other.tensors[-1], ) + self._logger.debug(f"Result from vdot={result}") return complex(result) def sample(self) -> dict[Qubit, int]: @@ -492,6 +523,7 @@ def measure(self, qubits: set[Qubit]) -> dict[Qubit, int]: raise ValueError(f"Qubit {q} is not a qubit in the MPS.") position_qubit_map[self.qubit_position[q]] = q positions = sorted(position_qubit_map.keys()) + self._logger.debug(f"Measuring qubits={position_qubit_map}") # Tensor for postselection to |0> zero_tensor = cp.zeros(2, dtype=self._complex_t) @@ -524,6 +556,7 @@ def measure(self, qubits: set[Qubit]) -> dict[Qubit, int]: # Throw a coin to decide measurement outcome outcome = 0 if prob > random() else 1 result[position_qubit_map[pos]] = outcome + self._logger.debug(f"Outcome of qubit at {pos} is {outcome}.") # Postselect the MPS for this outcome, renormalising at the same time postselection_tensor = cp.zeros(2, dtype=self._complex_t) @@ -567,6 +600,7 @@ def postselect(self, qubit_outcomes: dict[Qubit, int]) -> float: raise ValueError( "Cannot postselect all qubits. You may want to use get_amplitude()." ) + self._logger.debug(f"Postselecting qubits={qubit_outcomes}") # Apply a postselection for each of the qubits for qubit, outcome in qubit_outcomes.items(): @@ -586,6 +620,7 @@ def postselect(self, qubit_outcomes: dict[Qubit, int]) -> float: self.tensors[0] = self.tensors[0] / np.sqrt(prob) self.canonical_form[0] = None + self._logger.debug(f"Probability of this postselection is {prob}.") return prob def _postselect_qubit(self, qubit: Qubit, postselection_tensor: cp.ndarray) -> None: @@ -651,6 +686,7 @@ def expectation_value(self, pauli_string: QubitPauliString) -> float: if q not in self.qubit_position: raise ValueError(f"Qubit {q} is not a qubit in the MPS.") + self._logger.debug(f"Calculating expectation value of {pauli_string}.") mps_copy = self.copy() pauli_optype = {Pauli.Z: OpType.Z, Pauli.X: OpType.X, Pauli.Y: OpType.Y} @@ -673,6 +709,7 @@ def expectation_value(self, pauli_string: QubitPauliString) -> float: value = self.vdot(mps_copy) assert np.isclose(value.imag, 0.0, atol=self._atol) + self._logger.debug(f"Expectation value is {value.real}.") return value.real def get_statevector(self) -> np.ndarray: @@ -746,7 +783,9 @@ def get_amplitude(self, state: int) -> complex: ) assert result_tensor.shape == (1,) - return complex(result_tensor[0]) + result = complex(result_tensor[0]) + self._logger.debug(f"Amplitude of state {state} is {result}.") + return result def get_qubits(self) -> set[Qubit]: """Returns the set of qubits that this MPS is defined on.""" @@ -789,6 +828,13 @@ def get_physical_dimension(self, position: int) -> int: physical_dim: int = self.tensors[position].shape[2] return physical_dim + def get_byte_size(self) -> int: + """ + Returns: + The number of bytes the MPS currently occupies in GPU memory. + """ + return sum(t.nbytes for t in self.tensors) + def get_device_id(self) -> int: """ Returns: @@ -833,6 +879,10 @@ def copy(self) -> MPS: new_mps._complex_t = self._complex_t new_mps._real_t = self._real_t + self._logger.debug( + "Successfully copied an MPS " + f"of size {new_mps.get_byte_size() / 2**20} MiB." + ) return new_mps def __len__(self) -> int: diff --git a/pytket/extensions/cutensornet/mps/mps_gate.py b/pytket/extensions/cutensornet/mps/mps_gate.py index 3c522afd..9b29d1e7 100644 --- a/pytket/extensions/cutensornet/mps/mps_gate.py +++ b/pytket/extensions/cutensornet/mps/mps_gate.py @@ -1,11 +1,11 @@ -# Copyright 2019 Cambridge Quantum Computing +# Copyright 2019-2023 Quantinuum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +## # http://www.apache.org/licenses/LICENSE-2.0 -# +## # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import annotations # type: ignore import warnings +import logging import numpy as np # type: ignore @@ -138,12 +139,14 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: result_bonds = "acLR" # Contract + self._logger.debug("Contracting the two-qubit gate with its site tensors...") T = cq.contract( gate_bonds + "," + left_bonds + "," + right_bonds + "->" + result_bonds, gate_tensor, self.tensors[l_pos], self.tensors[r_pos], ) + self._logger.debug(f"Intermediate tensor of size (MiB)={T.nbytes / 2**20}") # Get the template of the MPS tensors involved L = self.tensors[l_pos] @@ -161,6 +164,9 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # uses REL_SUM2_CUTOFF. Then the code in the `else` block should # be run; i.e. use standard cuTensorNet API to do the SVD # including normalisation and contraction of S with L. + self._logger.debug( + f"Truncating to target fidelity={self.truncation_fidelity}" + ) options = {"handle": self._lib.handle, "device_id": self._lib.device_id} svd_method = tensor.SVDMethod(abs_cutoff=self._atol / 1000) @@ -179,6 +185,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # singular values that remain after truncation (before normalisation). denom = float(sum(cp.square(S))) # Element-wise squaring numer = 0.0 + old_dim = new_dim new_dim = 0 # Take singular values until we surpass the target fidelity @@ -222,11 +229,18 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # to keep track of a lower bound for the fidelity. self.fidelity *= this_fidelity + # Report to logger + self._logger.debug(f"Truncation done. Truncation fidelity={this_fidelity}") + self._logger.debug( + f"Reduced virtual bond dimension from {old_dim} to {new_dim}." + ) + elif new_dim > self.chi: # Apply SVD decomposition and truncate up to a `max_extent` (for the shared # bond) of `self.chi`. Ask cuTensorNet to contract S directly into the L # tensor and normalise the singular values so that the sum of its squares # is equal to one (i.e. the MPS is a normalised state after truncation). + self._logger.debug(f"Truncating to (or below) chosen chi={self.chi}") options = {"handle": self._lib.handle, "device_id": self._lib.device_id} svd_method = tensor.SVDMethod( @@ -252,17 +266,33 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # # We multiply the fidelity of the current step to the overall fidelity # to keep track of a lower bound for the fidelity. - self.fidelity *= 1.0 - svd_info.discarded_weight + this_fidelity = 1.0 - svd_info.discarded_weight + self.fidelity *= this_fidelity + + # Report to logger + self._logger.debug(f"Truncation done. Truncation fidelity={this_fidelity}") + self._logger.debug( + f"Reduced virtual bond dimension from {new_dim} to {R.shape[0]}." + ) else: # No truncation is necessary. In this case, simply apply a QR decomposition # to get back to MPS form. QR is cheaper than SVD. + self._logger.debug("No truncation is necessary, applying QR decomposition.") options = {"handle": self._lib.handle, "device_id": self._lib.device_id} L, R = tensor.decompose( "acLR->asL,scR", T, method=tensor.QRMethod(), options=options ) + self._logger.debug("QR decomposition applied.") self.tensors[l_pos] = L self.tensors[r_pos] = R + + # If requested, provide info about memory usage. + if self._logger.isEnabledFor(logging.INFO): + # If-statetement used so that we only call `get_byte_size` if needed. + self._logger.info(f"MPS size (MiB)={self.get_byte_size() / 2**20}") + self._logger.info(f"MPS fidelity={self.fidelity}") + return self diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index 42f82462..e7f6be44 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -1,11 +1,11 @@ -# Copyright 2019 Cambridge Quantum Computing +# Copyright 2019-2023 Quantinuum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +## # http://www.apache.org/licenses/LICENSE-2.0 -# +## # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import annotations # type: ignore import warnings +import logging from typing import Optional, Union @@ -53,6 +54,7 @@ def __init__( k: Optional[int] = None, optim_delta: Optional[float] = None, float_precision: Optional[Union[np.float32, np.float64]] = None, + loglevel: int = logging.WARNING, ): """Initialise an MPS on the computational state ``|0>``. @@ -88,8 +90,16 @@ def __init__( choose from ``numpy`` types: ``np.float64`` or ``np.float32``. Complex numbers are represented using two of such ``float`` numbers. Default is ``np.float64``. + loglevel: Internal logger output level. """ - super().__init__(libhandle, qubits, chi, truncation_fidelity, float_precision) + super().__init__( + libhandle=libhandle, + qubits=qubits, + chi=chi, + truncation_fidelity=truncation_fidelity, + float_precision=float_precision, + loglevel=loglevel, + ) # Initialise the MPO data structure. This will keep a list of the gates # batched for application to the MPS; all of them will be applied at @@ -109,7 +119,12 @@ def __init__( # Initialise the MPS that we will use as first approximation of the # variational algorithm. self._aux_mps = MPSxGate( - libhandle, qubits, chi, truncation_fidelity, float_precision + libhandle=libhandle, + qubits=qubits, + chi=chi, + truncation_fidelity=truncation_fidelity, + float_precision=float_precision, + loglevel=loglevel, ) if k is None: @@ -344,6 +359,8 @@ def _flush(self) -> None: The method applies variational optimisation of the MPS until it converges. Based on https://arxiv.org/abs/2207.05612. """ + self._logger.info("Applying variational optimisation.") + self._logger.info(f"Fidelity before optimisation={self._aux_mps.fidelity}") l_cached_tensors: list[Tensor] = [] r_cached_tensors: list[Tensor] = [] @@ -355,6 +372,7 @@ def update_sweep_cache(pos: int, direction: DirectionMPS) -> None: Update the cache accordingly. Applies canonicalisation on the vMPS tensor before contracting. """ + self._logger.debug("Updating the sweep cache...") # Canonicalise the tensor at ``pos`` if direction == DirectionMPS.LEFT: @@ -424,6 +442,8 @@ def update_sweep_cache(pos: int, direction: DirectionMPS) -> None: elif direction == DirectionMPS.RIGHT: l_cached_tensors.append(T) + self._logger.debug("Completed update of the sweep cache.") + def update_variational_tensor( pos: int, left_tensor: Optional[Tensor], right_tensor: Optional[Tensor] ) -> float: @@ -433,6 +453,8 @@ def update_variational_tensor( Contract these with the MPS-MPO column at ``pos``. Return the current fidelity of this sweep. """ + self._logger.debug(f"Optimising tensor at position={pos}") + interleaved_rep = [ # The tensor of the MPS self.tensors[pos], @@ -499,6 +521,7 @@ def update_variational_tensor( # Repeat sweeps until the fidelity converges sweep_direction = DirectionMPS.RIGHT while not np.isclose(prev_fidelity, sweep_fidelity, atol=self.optim_delta): + self._logger.info(f"Doing another optimisation sweep...") prev_fidelity = sweep_fidelity if sweep_direction == DirectionMPS.RIGHT: @@ -539,6 +562,11 @@ def update_variational_tensor( sweep_direction = DirectionMPS.RIGHT + self._logger.info( + "Optimisation sweep completed. " + f"Current fidelity={self.fidelity*sweep_fidelity}" + ) + # Clear out the MPO self._mpo = [list() for _ in range(len(self))] self._bond_ids = [list() for _ in range(len(self))] @@ -551,6 +579,8 @@ def update_variational_tensor( self.fidelity *= sweep_fidelity self._aux_mps.fidelity = self.fidelity + self._logger.info(f"Final fidelity after optimisation={self.fidelity}") + def _new_bond_id(self) -> int: self._mpo_bond_counter += 1 return self._mpo_bond_counter diff --git a/pytket/extensions/cutensornet/mps/simulation.py b/pytket/extensions/cutensornet/mps/simulation.py index e138e78c..5acc1eab 100644 --- a/pytket/extensions/cutensornet/mps/simulation.py +++ b/pytket/extensions/cutensornet/mps/simulation.py @@ -1,5 +1,20 @@ +# Copyright 2019-2023 Quantinuum +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +## +# http://www.apache.org/licenses/LICENSE-2.0 +## +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. from typing import Any from enum import Enum +import logging + from random import choice # type: ignore from collections import defaultdict # type: ignore import numpy as np # type: ignore @@ -10,6 +25,7 @@ from pytket.passes import DefaultMappingPass from pytket.predicates import CompilationUnit +from pytket.extensions.cutensornet.general import set_logger from .mps import CuTensorNetHandle, MPS from .mps_gate import MPSxGate from .mps_mpo import MPSxMPO @@ -30,7 +46,7 @@ def simulate( libhandle: CuTensorNetHandle, circuit: Circuit, algorithm: ContractionAlg, - **kwargs: Any + **kwargs: Any, ) -> MPS: """Simulate the given circuit and return the ``MPS`` representing the final state. @@ -62,30 +78,46 @@ def simulate( chi = kwargs.get("chi", None) truncation_fidelity = kwargs.get("truncation_fidelity", None) float_precision = kwargs.get("float_precision", None) + loglevel = kwargs.get("loglevel", logging.WARNING) + logger = set_logger("Simulation", level=loglevel) if algorithm == ContractionAlg.MPSxGate: mps = MPSxGate( # type: ignore - libhandle, circuit.qubits, chi, truncation_fidelity, float_precision + libhandle=libhandle, + qubits=circuit.qubits, + chi=chi, + truncation_fidelity=truncation_fidelity, + float_precision=float_precision, + loglevel=loglevel, ) elif algorithm == ContractionAlg.MPSxMPO: k = kwargs.get("k", None) optim_delta = kwargs.get("optim_delta", None) mps = MPSxMPO( # type: ignore - libhandle, - circuit.qubits, - chi, - truncation_fidelity, - k, - optim_delta, - float_precision, + libhandle=libhandle, + qubits=circuit.qubits, + chi=chi, + truncation_fidelity=truncation_fidelity, + k=k, + optim_delta=optim_delta, + float_precision=float_precision, + loglevel=loglevel, ) # Sort the gates so there isn't much overhead from canonicalising back and forth. + logger.info( + "Ordering the gates in the circuit to reduce canonicalisation overhead." + ) sorted_gates = _get_sorted_gates(circuit) + logger.info("Running simulation...") # Apply the gates - for g in sorted_gates: + for i, g in enumerate(sorted_gates): mps.apply_gate(g) + logger.info(f"Progress... {(100*i) // len(sorted_gates)}%") + + # Apply the batched operations that are left (if any) + mps._flush() # Apply the batched operations that are left (if any) mps._flush() @@ -93,6 +125,9 @@ def simulate( # Apply the circuit's phase to the leftmost tensor (any would work) mps.tensors[0] = mps.tensors[0] * np.exp(1j * np.pi * circuit.phase) + logger.info("Simulation completed.") + logger.info(f"Final MPS size={mps.get_byte_size() / 2**20} MiB") + logger.info(f"Final MPS fidelity={mps.fidelity}") return mps @@ -146,6 +181,7 @@ def _get_sorted_gates(circuit: Circuit) -> list[Command]: Returns: The same gates, ordered in a beneficial way. """ + all_gates = circuit.get_commands() sorted_gates = [] # Keep track of the qubit at the center of the canonical form; start arbitrarily diff --git a/pytket/extensions/cutensornet/tensor_network_convert.py b/pytket/extensions/cutensornet/tensor_network_convert.py index f5bb7468..0d9aad71 100644 --- a/pytket/extensions/cutensornet/tensor_network_convert.py +++ b/pytket/extensions/cutensornet/tensor_network_convert.py @@ -27,34 +27,7 @@ from pytket.pauli import QubitPauliString # type: ignore from pytket.circuit import Circuit, Qubit # type: ignore from pytket.utils import permute_rows_cols_in_unitary - - -# TODO: decide whether to use logger. -def set_logger( - logger_name: str, - level: int = logging.INFO, - fmt: str = "%(name)s - %(levelname)s - %(message)s", -) -> Logger: - """Initialises and configures a logger object. - - Args: - logger_name: Name for the logger object. - level: Logger output level. - fmt: Logger output format. - - Returns: - New configured logger object. - """ - logger = logging.getLogger(logger_name) - logger.setLevel(level) - logger.propagate = False - if not logger.handlers: - handler = logging.StreamHandler() - handler.setLevel(level) - formatter = logging.Formatter(fmt) - handler.setFormatter(formatter) - logger.addHandler(handler) - return logger +from pytket.extensions.cutensornet.general import set_logger class TensorNetwork: