introduction_en.ipynb 29.6 KB
Notebook
Newer Older
Q
Quleaf 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introduction to protein functionality and structure design\n",
    "*Copyright (c) 2022 Institute for Quantum Computing, Baidu Inc. All Rights Reserved.*\n",
    "\n",
    "Proteins are important structural and functional molecules in biological organisms. They form long chains by assembling amino acids and realize specific functionality through the spatial structure of amino acid chains. The spatial structure of proteins refers to the conformation of amino acid chains in three-dimensional space. This conformation can be determined by X-ray diffraction, nuclear magnetic resonance, or other methods. Studies have shown that the spatial structure of proteins is closely related to their functionalities. For example, as an important class of proteins, enzymes determine their interaction with substrates through their spatial structure, thus realizing the catalytic effect of chemical reactions. In addition, the spatial structure of proteins can be controlled by changing the amino acid sequence to regulate their functionality.\n",
    "\n",
    "Proteins produce different spatial structures in different folding modes, it is important to study protein folding in order to predict protein behaviors. Due to the high complexity and non-linearity appearing in the protein structures, it's inefficient to solve protein folding problems via classical computation. Quantum computation can quickly solve complex non-linear optimization problems based on the principles of quantum mechanics, and is generally believed to be of great help in future research on protein folding."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using quantum computation method to simulate the protein folding\n",
    "### Lattice model\n",
    "In protein structure research, a common method is the lattice model \\[1\\], which divides the amino acid chain in the protein into a series of lattice units, each of which includes several amino acids. By analyzing the interaction between lattice units, we can infer the spatial structure of the protein. The lattice model can help us better understand the structure and function of proteins, and provide an important theoretical basis for drug design and disease treatment.\n",
    "![](lattice_model_en.jpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Protein with 7 nodes and 6 edges\n"
     ]
    }
   ],
   "source": [
    "from paddle_quantum.biocomputing import Protein\n",
    "\n",
    "protein = Protein(\"APRLRFY\")\n",
    "print(protein)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With the `biocomputing` module in `paddle_quantum`, we can easily construct a protein., the above code has built an amino acid chain contains 7 amino acids.\n",
    "\n",
    "Starting from the lattice model, we can obtain a protein Hamiltonian \\[2\\] based on the interactions between lattice points. We can then construct a variational quantum algorithm (VQE) based on this Hamiltonian to solve for the stable structure (the structure with the lowest energy) of the protein molecule."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
Q
Quleaf 已提交
72
   "outputs": [],
Q
Quleaf 已提交
73 74
   "source": [
    "# lambda0 and lambda1 are two parameters used in constraining the spatial structure of protein.\n",
Q
Quleaf 已提交
75
    "h = protein.get_protein_hamiltonian(lambda0=10.0, lambda1=10.0)"
Q
Quleaf 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Variational quantum circuit\n",
    "Users can use variational quantum algorithm (VQA) to solve protein folding problem, the variational quantum circuit is shown below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAADnCAYAAADYb7UqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDYklEQVR4nO3de1xUdf4/8Be3AeQOorByEy/lBUFwKcWyNEGTRG39VnbR8AKarcWGZlJs65pbYeUF8Yviqtlqaor3IkWx1VbxwleRlRQB0Z/DRWC4yDDAvH9/uMw6cpkzOLej7+fjwaM453PO5zMfX5z3zJkzZ8yIiMAYY4wxUTA39gAYY4wxJhwXbsYYY0xEuHAzxhhjIsKFmzHGGBMRLtyMMcaYiHDhZowxxkSECzdjjDEmIly4GWOMMRHhws0YY4yJCBduxhhjTES4cDPGGGMiwoWbMcYYExEu3IwxxpiIcOFmjDHGRIQLN2OMMSYilobuUC6XQ6FQ6LUPiUQCGxsbrbczxNjErqtzy7TDWdSMs2gYnEXNDJ1FgxZuuVyO3r17QyqV6rUfDw8PFBYWajWRhhqb2HVlbpl2OIvCcBb1j7MojKGzaNDCrVAoIJVKUVJSAkdHR730UVNTA29vbygUCq0m0RBjE7uuzi3TDmdRM86iYXAWNTNGFg1+qhwAHB0dTTYEpjw29njhLDJTwVk0LXxxGmOMMSYiXLgZY4wxEeHCzRhjjIkIF27GGGNMRLhwM8YYYyLChZsxxhgTES7cjDHGmIhw4WZMh4gITU1NICJjD4UxzuIjigu3ERw7dgzBwcFQKpVGG8PkyZOxadMmo/X/KJHL5di6dSvCwsJgY2MDiUQCa2trhIaGYtOmTWhoaDD2EDvEWXy0KJVK/PTTT4iKioKdnR0kEgksLS3Rr18/fPHFF6ioqDD2EDtl7DyKJotkQDKZjACQTCYzuT603c7Pz4+sra3Jzs6O7O3tKSwsjC5cuCBo24CAANq/f7/q94ULF9LAgQPJwcGBPD09KTo6mioqKjrcvqWlhRYvXkw9evQgOzs7ioiIoKKiog7bT5o0iQDQsWPHVMtyc3OpZ8+e1NDQIGjMRIb59xOb77//nrp3705PPPEErVy5kvLz8+m3334jALRixQoaNGgQubi40JYtWwTv05hZ1DZb92svZ0RES5cuJX9/f3J0dCQ3NzcKDw9XGx9nUTeys7Opb9++1LNnT0pISKCLFy9Sfn4+AaBNmzbR888/T9bW1vTRRx9RS0uLoH12ZZ51mcf7dZSv+2k6lkqlUnrttdfI3d2dnJycaPjw4ZSVlaVaL5YscuHuwnbl5eUEgE6dOkVERLW1tTRu3DgKDg7WuG1GRgZ5eXmp/eEsXryYzp8/TwqFgkpLS2ns2LEUGRnZ4T6WL19Ofn5+dOXKFaqtraXZs2dTQEBAu3+MmzdvpvDw8HYDP3z4cEpLS9M45lZ8sFSXkpJCDg4OtGvXLlIqlarl98+TUqmkffv2kZOTE3399deC9mvMLGqTrft1lrP8/HyqrKwkIqLGxkZKSkoiDw8PtX1yFh9OVlYW2dvb09/+9jdqbGxULX9wnnJycqhPnz701ltvCSre2s6zrvPYqrN83U/TsXTKlCk0atQoKi8vp+bmZkpKSiJ7e3uqqqpStRFDFk22cPv5+VFSUlKb5SEhIfTJJ5/opI+ubnfo0CGSSCQkl8tVy5YuXUq9evXSuG1sbCzNmDGj0zb79+8nBweHDtf7+vrS2rVrVb9XVVWRRCJRe+ZIRFRSUkLe3t5UXFzcbuATExM7fYLwID5Y/ldGRgbZ2dnRP//5zzbr2pun7Oxssre3p3379mnctzGzKDRb99OUs/vJ5XL6+uuvCYCqmBNxFh/G9evXydnZmVJTU9usa2+epFIp9e7dmz799FON+9Z2nvVxbNQmXw968Fg6ZMgQWrNmjer32tpaAkBnz55VLRNDFk3yPe6KigoUFRUhKChIbXlzczNyc3MRGhpqnIH9x5kzZxAUFARra2solUqcPHkSa9euxRtvvKFx2/Pnz2Pw4MGdtjl69CgCAwPbXSeTyVBcXIxhw4apljk7O6Nv377IyclRLSMiREdHIyEhAT4+Pu3uKyAgANnZ2RrHrAvNzc04e/YsLl269EhcLLN06VIkJiYiLCxMUPthw4Zh+fLl+Mtf/qLTcegyi0KzdT8hOQOAgwcPwtnZGTY2NoiLi0NcXBxcXFxU6w2ZRSLC5cuXkZ2djaamJoP0qU+rVq1CREQEZs+eLah9z5498d133yEpKQm1tbU6HYuuj41C89WRB4+lixYtwu7duyGVStHU1ITk5GT0799frV9DZrGrjPLtYJq0TtqDhfvf//43GhsbjV64s7OzkZOTA2dnZ9TX18Pc3BxJSUmYP3++xm2rqqrg5OTU4fodO3Zgw4YNyMrKand9TU0NgHsH1Ps5Ozur1gFASkoKiAhz5szpsC9HR0dUVlZqHPPDyszMxKuvvgqZTAalUgk/Pz/s27cPAwYM0Hvf+nDp0iVkZ2cjPT1dq+2mT5+OxYsX48yZMzrLsC6zKDRb9xOSMwCYMGECqqurUVlZic2bN7c5CBsqiwUFBXjppZdw9epVmJubw8HBAd9++y3Gjx+v9771ob6+Hn//+99x8OBBrbZ7+umn0b9/f2zduhVz587V2Xh0fWwUmq/2tHcsHTFiBLZs2QJPT09YWFjAzc0N6enpsLa2VrUxVBYfhkm+4j5z5gy8vLzg5uamtjwnJwd+fn5wd3c30sjuyc7ORlpaGqqrq1FaWorQ0FBcuHABZmZmGrd1dXWFTCZrd9327dsRExODffv2ITg4uN02rV+t9+A+qqurVesKCgqwdOlSbNiwodOx1NTUwNXVVeOYH0ZZWRkmTJiA8vJyKBQKNDc34/r163jhhRfQ0tKi1771ZdOmTXjllVe0njsHBwe88cYb2Lhxo87GosssCsnW/YTm7ME+FyxYgOjoaFy+fFm13BBZVCqVGDt2LPLz89Hc3AyFQoE7d+5g0qRJKCkp0Wvf+rJ37154e3tjxIgRWm1nZmaG2NhYnWYR0G0eu5KvVu0dS5VKJcaMGQMvLy9UVlZCLpcjNTUV48ePx6VLl1TbGiKLD0vwK+6OnnFrQ+g+srOzIZVK0b17d7XlDQ0NiIyM1Glf2rYvLi5GWVmZKgyurq5ISEhAVFQUVqxYARcXF5w+fRrffPMNtm3bBgCYO3cuoqKiMG7cOISEhKgdsFqlpaUhPj4eBw4c6PT0q5OTE3x9fXH27FnVKU2ZTIaCggLVGYpffvkFd+7cQUhIiNq2UVFRmDZtGlJSUgAAubm5aqdFhdJmbjdv3tzmj1apVOLOnTs4cOAAnn/+ea37N7Zr167h6aef7nAeWg8+7T1B69+/Pw4fPtzpHBori0KydT+hOXuQUqlEU1MTrl69ikGDBgEwTBZPnz6NW7dutfmokbm5OdLS0hAXF6d1/8aWn5+PgQMHdnjKu7Ms9unTB8XFxTrJIqD7PHY1Xx0dS6uqqnD9+nWkp6er3qaJioqCv78/MjIyEBAQAMAwWeyI4O88F/pmOACd/Wh6E79Hjx60ZMkSKikpUfsJDAykL7/8stNtWy8U0NfYdu7cSXZ2dmpXPjY1NZGzs7PqSsTGxkYaMGAAERGdO3eOpkyZomp75MgR8vb2Vtt+5cqV5ObmRtnZ2Z323Wr58uXk7+9P+fn5VFdXRzExMWpX/tbX17eZOwC0Y8cOtQuCRowYQRs2bBDUJ9HDzy3/mH4WNWXrfkJztnLlSrp9+zYREZWVldHs2bPJ2dmZpFIpZ1EkP0IuvNJ1HoXm636ajqUDBgygOXPmkEwmo5aWFtq7dy9JJBK1C96MmUWhBL/i7uj0rjZqamrg7e3daZvWZ23h4eHw8vJSLW9oaEBeXp7g9wZLSkqEP3sRODbg3tmAwMBAmJv/910GS0tLTJgwATt27EB0dDQkEgnc3NxQWlqK+Ph4tVM9Y8aMgYuLCw4dOqQ6e7BgwQJYWlriueeeU+srLy8PPj4+iI2NRXFxMQ4fPgwAWLhwIWQyGUaOHIn6+nqMHDkS+/btU42pW7du6NatW5uxu7u7q55p5uXl4dq1a5g2bZrgOWqlzdyeOXMGL774YpuLgCwtLXHlyhWjv+3RFbGxsfDy8kJCQkK762/duoWBAwciLy8PvXr1UluXlJSEixcvYsuWLR3u35hZ1JSt+7MoJGfAvWscPvvsM9TW1sLR0RGhoaE4evQoevbsCcBwWayqqkK/fv3aZFEikWDnzp1t/v7EYN26dThy5Ah27drV7vrOsnjkyBHExcXh4sWLHe5faBYB3edRSL4ePDZqOpbu3bsX8fHx6Nu3L+RyOXx9fZGcnKxqb6gsPjTBJV4HhFw2v3PnTrKysqK7d++qLT9+/DhZWFhQXV3dQ/ehy+06Eh8fT1OnTqXExMQ26zIzM2no0KGCb4KgD5MnT6aNGzdqtU1X5kipVNJbb71F1tbWqmeVVlZW9MUXX2g7ZJPx/fffU58+fTr892t9ZVBSUqK2XKlU0qBBg+jvf/97p/vnLGrW1Tlas2YNWVlZkYWFBQEga2tr+sMf/qD2OXwx+e2330gikaidvbhfR1kkInrrrbdo/vz5ne5fHx91MuU8GjKLD8PkCvfChQspNDS0zfJly5ZRQECATvrQ5XYd2bNnD/n5+Wl1Bx5T19U5UiqVdODAAXr99dcJAB05ckRPIzSMxsZG6tmzJx0+fLjd9R0dLI8fP04uLi5tnpQ+iLOo2cPMUXZ2Ns2aNYsA0LZt24z6pEUXxo4dS3/961/bXddRFsvLy8na2pouX77c6b71UZQetTxy4TZiH7oe2/vvv0979+7Vyb5MxcPO0aN004zExEQaOnQo1dbWtlnX3sHy7t279PTTT1N8fLzGfXMWNeMs/te+ffuoe/fuVFBQ0GZde1lUKpU0c+ZMGj16tMZ962OeHrU88g1YHgE3b97EpEmTYGFhgYkTJxp7OExPPvroIzg7OyMqKkrj9R91dXV4+eWXYW5ujk8//dRAI+QsPi4iIyMxbdo0hIeHo6CgoNO2SqUS8fHx+PHHH7F582YDjfAezqPumOQNWMTMy8tL6xtzMPGRSCTYu3cv/ud//gdBQUGYP38+3n77bbXPf8pkMvzwww9YvXo1fH19cfDgQdja2hpsjJzFx4OZmRm+/vprWFhYYNiwYYiJiUFMTAx69+6taqNQKLBt2zasWrUKFRUVOHbsmNrFv4bAedQdLtyMdZGDgwP279+PH374AcnJyUhISMBTTz0FKysrAMDvf/97BAUF4dNPP8XUqVMhkUiMPGL2qDI3N8dXX32FyMhIJCcn44knnkBwcDAcHBwA3Muiq6sr5s2bh7fffrvN3fGYuHDhZuwhWFpa4pVXXsErr7yC3NxcnDt3DiUlJThy5Aj27NmDiIgIYw+RPUZGjx6N0aNH4+bNm8jKykJRURGOHDmCdevWqd6uYeLH/4qM6cjgwYMxffp0vPvuuwDu3Q+aMWPw8vLC66+/rrpHeHh4OBftRwj/SzKmY623eBVyf2bG9Imz+Gjiws0YY4yJCBduxhhjTES4cDPGGGMiwoWbMcYYExEu3IwxxpiIcOFmjDHGRIQLN2OMMSYiXLgZY4wxETHKLU9rampMdt/6HJvY8dwYFs93x3huDIvnu2PGmBuDFm6JRAIPDw94e3vrtR8PDw+tv9DBUGMTu67MLdMOZ1EYzqL+cRaFMXQWDVq4bWxsUFhYCIVCodd+JBIJbGxstNrGUGMTu67MLdMOZ1EYzqL+cRaFMXQWDX6q3MbGxmT/2Ex5bOzxwllkpoKzaHr44jTGGGNMRLhwM8YYYyLChZsxxhgTES7cjDHGmIhw4WaMMcZEhAs3Y4wxJiJcuBljjDER4cLNGGOMiQgXbsYYY0xEDH7nNLlcbpK3PAUMMzax49tMGgZnUTPOomFwFjV7pG95KpfL0bt3b0ilUr324+HhgcLCQq0m0lBjE7uuzC3TDmdRGM6i/nEWhTF0Fg1auBUKBaRSKUpKSuDo6KiXPmpqauDt7Q2FQqHVJBpibGLX1bll2uEsasZZNAzOombGyKJRvo/b0dHRZENgymNjjxfOIjMVnEXTwhenMcYYYyLChZsxxhgTES7cjDHGmIhw4WaMMcZEhAs3Y4wxJiJcuBljjDER4cLNGGOMiQgXbsYYY0xEuHAzvSMiXL9+HdnZ2QCAW7duGXlE7HF2+/ZtnD9/HgBw7do1EJGRR8SYdrhwG8GxY8cQHBwMpVJptDFMnjwZmzZt0msf9fX1WL9+PYKDg/Hkk0/itddeAwAMHjwYo0ePxq5du9DU1KTXMbDOPS5ZbG5uRnp6OsLDw+Ht7Y0pU6YAAJ566ikMGTIEKSkpqK2t1esYmGaPSx4fGhmQTCYjACSTyUyuD2238/PzI2tra7KzsyN7e3sKCwujCxcuCNo2ICCA9u/f3+66SZMmEQA6duyYoH111H7p0qXk7+9Pjo6O5ObmRuHh4Wrjy83NpZ49e1JDQ4Ogfoi0m6Nff/2V3N3dKSgoiFJTU6muro5KSkoIAOXk5NDnn39Ofn5+9OSTT1JBQYHgMYjBw+bcmFlcuHAhDRw4kBwcHMjT05Oio6OpoqKiw+3v3LlD0dHR5OnpSfb29jRx4kQqKSlRa9PS0kKLFy+mHj16kJ2dHUVERFBRUZFqvb6zeOPGDQoICCBvb29atmwZSaVSVRZ/++032rhxI4WEhJCrqytlZWUJHoMYGDqLRMbNo6asERFJpVJ67bXXyN3dnZycnGj48OFq/+7a5tEQde1BXLi7sF15eTkBoFOnThERUW1tLY0bN46Cg4M1bpuRkUFeXl7U0tLSZt3mzZspPDxccOHurH1+fj5VVlYSEVFjYyMlJSWRh4eHWr/Dhw+ntLQ0jf20EjpHJ0+eJHt7e1q1ahUplUrV8taDZeuBvbm5mf74xz+Sh4cHFRYWCh6HqTPkwVLXWVy8eDGdP3+eFAoFlZaW0tixYykyMrLDfURGRlJkZCRVVVVRbW0tvfrqqxQUFKS2z+XLl5Ofnx9duXKFamtrafbs2RQQEGCQLN68eZO8vb1pzpw5pFAoVMsfzCIR0fr166lbt26UmZkpeBymztCF29h5FJK1KVOm0KhRo6i8vJyam5spKSmJ7O3tqaqqStVGmzxy4b6Pn58fJSUltVkeEhJCn3zyiU766Op2hw4dIolEQnK5XLVs6dKl1KtXL43bxsbG0owZM9osLykpIW9vbyouLhZUuLVpL5fL6euvvyYAqmJORJSYmNjpH8GDhMxRZWUlubm5UXJycrtjfvBgqVQq6Z133mnzxyVmhjxY6iOL99u/fz85ODi0u66uro7MzMwoOztbtezq1asEgE6cOKFa5uvrS2vXrlX9XlVVRRKJRO1Vjj6yqFQqKTQ0lKKjo9WeQBK1n0Uioo0bN5KTkxNJpVLBYzFlhi7cxswjkbCsDRkyhNasWaP6vba2lgDQ2bNnVcu0yaMxCrdJvsddUVGBoqIiBAUFqS1vbm5Gbm4uQkNDjTOw/zhz5gyCgoJgbW0NpVKJkydPYu3atXjjjTc0bnv+/HkMHjxYbRkRITo6GgkJCfDx8dG4D6HtDx48CGdnZ9jY2CAuLg5xcXFwcXFRrQ8ICFBdMKYrmzZtwpNPPol58+YJam9mZoavvvoKZWVl+PnnnwVtI5PJsGXLFqxbtw7FxcUPM1zR03UWH3T06FEEBga2u47+c1EX3XdxV+v/X7hwAcC9f6vi4mIMGzZM1cbZ2Rl9+/ZFTk6Oapk+svjLL7/g6tWrWL16NczMzARt8/bbbyM0NBRpaWmC2isUCuzevRtr1qxRPebHmTHzKDRrixYtwu7duyGVStHU1ITk5GT0799frW995FGXjPK1npq0TtiDhfvf//43GhsbjV64s7OzkZOTA2dnZ9TX18Pc3BxJSUmYP3++xm2rqqrg5OSktiwlJQVEhDlz5gjqX2j7CRMmoLq6GpWVldi8eXObIu/o6IjKykpBfQqhVCqRkpKCTz/9VKvtJBIJZs+ejbVr1yIiIqLTtpmZmYiMjFQdiOfPn49ly5Zh0aJFXR63mOk6i/fbsWMHNmzYgKysrHbX29vbY/To0UhMTMS3334LS0tLLFmyBGZmZqoLvWpqagDcO4Dez9nZWbUO0H0WAWDt2rWIjo5Gt27dtNrunXfewbvvvotFixbBwsKiw3YFBQV45plnUF1dDQBoamrCyy+/jO+++67T7R5lxsyj0KyNGDECW7ZsgaenJywsLODm5ob09HRYW1ur2ugjj7pkkq+4z5w5Ay8vL7i5uaktz8nJgZ+fH9zd3Y00snuys7ORlpaG6upqlJaWIjQ0FBcuXBD0rN7V1RUymUz1e0FBAZYuXYoNGzYI6lvb9q19LliwANHR0bh8+bJqeU1NDVxdXQXvR5OcnByUlZWprtjVxsyZM3HgwAHU1dV12KaxsRFTpkxBQ0MD7t69i7t376KlpQUJCQm4ePHiwwxdtHSZxftt374dMTEx2LdvH4KDgzvcx9atW+Hq6oohQ4Zg0KBBCAsLg729Pbp37w4Aqu9wfrCf6upqte931nUWm5qa8MMPPyA6OlrrbSdMmIDGxkb8+uuvnbZ78803UVZWhoaGBjQ0NKC5uRl79+7Fli1bujps0TNmHoVkTalUYsyYMfDy8kJlZSXkcjlSU1Mxfvx4XLp0SbWNrvOoa4Jfcd//jKWrhO4jOzsbUqlU9cffqqGhAZGRkTrtS9v2xcXFKCsrU4XH1dUVCQkJiIqKwooVK+Di4oLTp0/jm2++wbZt2wAAc+fORVRUFMaNG4eQkBC14vnLL7/gzp07CAkJUesnKioK06ZNQ0pKitpybdu3UiqVaGpqwtWrVzFo0CAAQG5urtppJaE6mqvCwkJ4enqisbERjY2Nbda3vgqrra1ts4/WZ8lFRUUdnv7PzMxsd79mZmbYunUrEhIStHkYetP62Lr6N2OsLLZKS0tDfHw8Dhw4gLCwsE7H4OHhga1bt6p+v3TpEt577z0899xzAAAnJyf4+vri7NmzqqzJZDIUFBSonVHTdRbLy8vR3NyM7t27t9umsywCQK9evVBUVIQhQ4a0u//Kysp2C7tcLkdaWhpefvllbR6G3hgqi4Dx8ygka1VVVbh+/TrS09NVbxtGRUXB398fGRkZCAgIANC1POqiRt7/ZLZTQt8MB6CzH01v4vfo0YOWLFlCJSUlaj+BgYH05Zdfdrpt64UC+hrbzp07yc7OTu1CqqamJnJ2dlZdhdjY2EgDBgwgIqJz587RlClTVG2PHDlC3t7equ3r6+vbPE4AtGPHDrULyVoJbb9y5Uq6ffs2ERGVlZXR7NmzydnZWe2imxEjRtCGDRs6fby6nFv+Me0stubGzc1N7YKzzly5coXKy8tJqVRSbm4uhYSE0MyZM9XaLF++nPz9/Sk/P5/q6uooJiamzcWInEXT/hFy4ZUp5FFI1gYMGEBz5swhmUxGLS0ttHfvXpJIJGoX+GqTR11mUSjBr7g7OoWhjZqaGnh7e3fapvVZW3h4OLy8vFTLGxoakJeXJ/j97ZKSEuHPXgSODbh3NiAwMBDm5v99l8HS0hITJkzAjh07EB0dDYlEAjc3N5SWliI+Pl7ttPaYMWPg4uKCQ4cOITIyEt26dWv3PTh3d3fVM8LY2FgUFxfj8OHDgtoD916dfvbZZ6itrYWjoyNCQ0Nx9OhR9OzZEwCQl5eHa9euYdq0aYLnqFVHc5uTk4OJEyfi6tWrau8XtZLJZPDx8cGNGzfavJdVXFyMoKAglJSUwN7evt1+Gxsb0bdv3zbPbC0tLZGVlaXxwhZDac2Sthl8cHtNdJ1FAFiwYAEsLS1Vr5hb5eXlwcfHRy2LAHDy5El8/PHHqKqqQo8ePRAdHY0lS5aobbtw4ULIZDKMHDkS9fX1GDlyJPbt26catz6y2NTUBA8PD5w8eRJPPvlkm/WdZbG5uRlPPvkkvv32WwwfPrzDvl944QWcP38eLS0tqmU2NjZYsWKFoIuxDMFQWQRMI4+asgYAe/fuRXx8PPr27Qu5XA5fX18kJyer+uhqHrs6x10iuMTrgJDL5nfu3ElWVlZ09+5dteXHjx8nCwsLqqure+g+dLldR+Lj42nq1KmUmJjYZl1mZiYNHTrUqB9/mjx5Mm3cuFGrbTTNUUtLC/Xr14/+8Y9/aL19QkICTZw4UeMYjh49Sra2tmRra0sAyNzcnP72t79p9Tj0zRg3vejM45hFIqJXXnmF/vSnP2m9fXp6Ovn4+FBzc3OnY7h27Rp5enqSjY0NASBLS0t65ZVXNG5nSKaWRaJHL4/8OW66d6ec0NDQNsuXLVtGAQEBOulDl9t1ZM+ePeTn56fV3aBMnZA5+uqrrygsLEyr7RsbG6lnz570448/ChpHdXU1rVu3jgDQpUuXhD8AAzG1g+XjmsWsrCxycXGh+vp6rbYfO3YsLVu2TNA4GhsbaevWrQSof3bdVJhaFokevTzy57gBfP755zh9+nSb5R999JGorhw+ceIEVq5cCRsbG2MPxaBmzJiBK1euIDk5WVB7IkJcXBx69OiBsWPHCtrGyclJdd9zIZ97f9w9rll85pln0K9fP7z77ruCv0hk48aNyM7OxsyZMwW1l0gkeOmllwCgw88XM3WPax51yeQKt9jdvHkTkyZNgoWFBSZOnGjs4Rici4sL9u/fjw8//BCrV6/u9IDZ0tKC9957Dz/88EOb96HYw3vcs2hmZobdu3fj559/RkxMTKdfaENEWL9+Pd59913s3r1bdS0I053HPY+6ZJI3YBEzLy8vpKenG3sYRjV8+HD8/PPPmDhxItLS0jBv3jy1Cz0qKiqQkpKCdevWwcbGBqdOnYKfn5/xBvyI4ize+1jXyZMnERkZiT59+iAmJgazZs2Cra0tAODu3bvYtWsX1q5di8LCQhw+fBjPPvuskUf9aOI86g6/xGF68fTTT6OwsBDz589HSkoKXFxc0LdvXwBAv379kJGRgaSkJFy8eBG9e/c28mjZo8zb2xvnzp3D6tWrceLECfTq1Uv1RNHb2xtff/01Zs2ahaKiIi7aTBT4FTfTGzs7O8yaNQszZ85EYWEhioqKMGbMGFy+fLndj+gwpi+WlpaIiopCVFQUbt++jatXr2LUqFGqjzAJvZc5Y6aACzfTOzMzM/j7+6N3796QyWRwcHAw9pDYY8zT0xMeHh6qLHLRZmLDhZsZjJmZmeFuUMBYJziLTMz4PW7GGGNMRLhwM8YYYyLChZsxxhgTES7cjDHGmIhw4WaMMcZEhAs3Y4wxJiJcuBljjDER4cLNGGOMiYhRbsBSU1NjsvvW59jEjufGsHi+O8ZzY1g83x0zxtwYtHBLJBJ4eHjA29tbr/14eHhAIpFotY2hxiZ2XZlbph3OojCcRf3jLApj6CwatHDb2NigsLAQCoVCr/1IJBKtv6TdUGMTu67MLdMOZ1EYzqL+cRaFMXQWDX6q3MbGxmT/2Ex5bOzxwllkpoKzaHr44jTGGGNMRLhwM8YYYyLChZsxxhgTES7cjDHGmIhw4WaMMcZEhAs3Y4wxJiJcuBljjDER4cLNGGOMiQgXbsYYY0xEDH7nNLlcbpK3PAUMMzax49tMGgZnUTPOomFwFjV7pG95KpfL0bt3b0ilUr324+HhgcLCQq0m0lBjE7uuzC3TDmdRGM6i/nEWhTF0Fg1auBUKBaRSKUpKSuDo6KiXPmpqauDt7Q2FQqHVJBpibGLX1bll2uEsasZZNAzOombGyKJRvo/b0dHRZENgymNjjxfOIjMVnEXTwhenMcYYYyLChZsxxhgTES7cjDHGmIhw4WaMMcZEhAs3Y4wxJiJcuBljjDER4cLNGGOMiQgXbsYYY0xEuHAzUVEoFDh48CA2btwIANi1axeqqqqMPCr2OCIi/PLLL9i8eTMAYNu2bSguLjbyqNjjgAu3ERw7dgzBwcFQKpVGG8PkyZOxadMmo/WvrVu3buHjjz+Gj48P5s+fj/T0dADAihUr0KtXL8yaNQs5OTlGHaMYcRa1V1tbi1WrVmHgwIGYPHkyduzYAQBYv349+vfvj6ioKPz0008gIiOPVHyMnUfRZJEMSCaTEQCSyWQm14e22/n5+ZG1tTXZ2dmRvb09hYWF0YULFwRtGxAQQPv371f93tLSQosXL6YePXqQnZ0dRUREUFFRUYfbS6VSeu2118jd3Z2cnJxo+PDhlJWVpdX+cnNzqWfPntTQ0CBozESG+fdrzy+//EKurq4UGRlJP/74I7W0tFBJSQkBoJKSEsrJyaGYmBjq1q0bJScnG3Rs7XnYeTJmFhMTE8nc3Jzs7OxUP6+++mqn+zh+/DiNHDmS7OzsyMXFhSZOnKi2XtM+xZTFwsJCevLJJ2nYsGH07bffUkNDg1oWb9y4QQkJCeTm5kaxsbHU1NRk0PE9yNBZJNJtHpcuXUr+/v7k6OhIbm5uFB4e3uG+Bg4cqJYxW1tbAkC7d+9Wtblz5w5FR0eTp6cn2dvb08SJE6mkpES1XixZ5MLdhe3Ky8sJAJ06dYqIiGpra2ncuHEUHByscduMjAzy8vKilpYW1bLly5eTn58fXblyhWpra2n27NkUEBCg1uZ+U6ZMoVGjRlF5eTk1NzdTUlIS2dvbU1VVlVb7Gz58OKWlpWkccytjBPTMmTNkb29P//u//6u2/P6DZauTJ0+Si4sLpaSkGGx87THkwVLXWUxMTKRRo0YJHmtWVhY5OjrS1q1b6e7du9TY2EinT59WayNkn2LI4u3bt8nX15feeecdam5uVi1vL4vFxcU0YMAAmjVrFimVSoON8UGGLty6zmN+fj5VVlYSEVFjYyMlJSWRh4dHh8fG+61cuZLc3NzUinBkZCRFRkZSVVUV1dbW0quvvkpBQUFq+xNDFk32VHnv3r2xYsWKNsuHDRuGxMREI4zov7KzsyGRSBAcHAwAsLe3R1hYGEpLSzVuu3v3brzwwgswN//v1K9btw4LFy7EE088AXt7e3zxxRfIz8/HP//5z3b3ce3aNUydOhXdu3eHhYUFYmJiUFdXh4KCAq32Fx4ejj179nR1GvSuqakJL7/8Mv785z9jzpw5GtuPGDEC+/btw/vvv48rV64YYITGp+ssauvDDz/EnDlz8Prrr8PW1hYSiQShoaFa78fUswgAs2fPRlhYGFavXg0LC4tO2/r4+CAjIwMHDhxQnUp/HOg6j/3794eLiwuAe9cUWFhYQCqVQiaTadxfSkoKZs6cqfrGrvr6ehw8eBCJiYlwdnaGvb09li5dipycHJw8eVK1nRiyaJKFu6KiAkVFRQgKClJb3tzcjNzc3C4dGHTpzJkzCAoKgrW1NZRKJU6ePIm1a9fijTfe0Ljt+fPnMXjwYNXvMpkMxcXFGDZsmGqZs7Mz+vbt2+F7tosWLcLu3bshlUrR1NSE5ORk9O/fH4MHD9ZqfwEBAcjOztbuwRvQvn37YG5ujvfee0/wNiNHjsSUKVOwbt06Qe2vX7+OxYsX4/XXX8eGDRvQ0NDQxdEahy6z2Ors2bNwd3eHr68vpk2bhsLCwna3r6+vx+nTpwHce0Lt5uaG4cOH4+jRo1rv09SzWFBQgIyMDHz55ZcwMzMTtI2Xlxfi4+OxZs0aQe0rKyvx5ZdfYtq0aVi+fDnKy8sfZshGoY88Hjx4EM7OzrCxsUFcXBzi4uJUxbwjmZmZ+O233xAbG6taRv+55oDuu/ag9f8vXLigWmbqWQRgmu9xHzp0iABQRUWF2vKLFy8SACorK3voPh5muwkTJpBEIiEnJyeytLQkiURCq1atEnRKrF+/frR+/XrV7zdu3CAA9Ntvv6m1GzFiBC1durTdfRQWFlJERAQBIAsLC+rRo4fq1JQ2+8vIyCArKyuNY25l6FNCo0ePpr/97W/trmvv9GSrkydPkpOTE9XV1XW6/+PHj5O1tTVJJBICQLa2tjRw4ECqqal5qHEb8vSkLrNIRHTp0iUqKioipVJJt27dojfffJP8/f2ptra2zfat/wYeHh50/vx5UigUlJqaSra2tlRQUKDVPk09i/Hx8TR16tR213WWxcrKSrK1taWLFy92uv+ioiJyd3cnGxsbAkA2Njbk4uLS5u9YW4Y+Va7rPN7vzp079NVXX9GuXbs07uvll1+mF198sc3yMWPG0Pjx46miooKqq6tp6tSpZGZmRn/9619VbUw9i0Qmeqr8zJkz8PLygpubm9rynJwc+Pn5wd3d3Ugjuyc7OxtpaWmorq5GaWkpQkNDceHCBUHPxF1dXdVO87R+x+2Dp36qq6vb/f5bpVKJMWPGwMvLC5WVlZDL5UhNTcX48eNx6dIlrfZXU1MDV1dXYQ/awBoaGpCZmYlp06Zpve3w4cPh7OyMX3/9tcM2RITo6Gg0NjZCoVCo+rx+/TrWrl3b5XEbmi6zCACDBw+Gr68vzMzM8Lvf/Q5paWm4ffs2Tp061WZ7BwcHAEB0dDSGDh0KKysrzJ49G71798ZPP/2k1T5NOYvAvVd9Xcmii4sLxo8fj0OHDnXabvHixaiqqoJcLgcAyOVyyGQyfPDBB10ar7HoOo8Prl+wYAGio6Nx+fLlDtv9v//3/7B3717MmzevzbqtW7fC1dUVQ4YMwaBBgxAWFgZ7e3t0795d1cbUswgAlkIb1tTUPHRnQveRnZ0NqVSqNpnAvQNrZGSkTvvStn1xcTHKyspU7+G4uroiISEBUVFRWLFiBVxcXHD69Gl888032LZtGwBg7ty5iIqKwrhx4xASEqIWOicnJ/j6+uLs2bOq09symQwFBQVt3ioAgKqqKly/fh3p6emq00VRUVHw9/dHRkYG/vSnPwneX25urtopdaF0kQVNpFIpAKBbt27t9ldbW6v6b3vru3fvjlu3bnU41tLSUly/fr3Ncrlcjl27dmHu3LldHntrn12dJ2NlsT1mZmYwMzNr96NNTk5O8Pf3b3NQ1nSQbm+fppxF4N5pbAcHhy5l0cXFBbdv3+50rIcPH0Zzc7PaMqVSiZ9//vmhHqOhsggYJo9KpRJNTU24evUqBg0a1G6b1NRUeHt7Y/z48W3WeXh4YOvWrarfL126hPfeew/PPfecapkxs9jei7V2CX1pDkBnP5pOKfTo0YOWLFlCJSUlaj+BgYH05Zdfdrpt62kLfY1t586dZGdnp3YVYlNTEzk7O6uuRGxsbKQBAwYQEdG5c+doypQpqrZHjhwhb2/vNleV+/v7U35+PtXV1VFMTEynV5UPGDCA5syZQzKZjFpaWmjv3r0kkUjo2LFjWu1vxIgRtGHDhk4fry7nln9MP4vbt29XvRVVWlpKM2bMIF9f3w7fPlixYgV5enrSxYsXqbm5mTZu3Eh2dnZUWFio1T45i6b9I+Q0sD7yuHLlSrp9+zYREZWVldHs2bPJ2dmZpFJpu2Noamqi3/3udx2+xXblyhUqLy8npVJJubm5FBISQjNnzlRrY8wsCiX4FbeQq/g0qampgbe3d6dtWp+1hYeHw8vLS7W8oaEBeXl5gi9MKykpEf7sReDYgHtnAwIDA9WufLS0tMSECROwY8cOREdHQyKRwM3NDaWlpYiPj8eGDRtUbceMGQMXFxccOnRIdfZg4cKFkMlkGDlyJOrr6zFy5EjVhVkAEBsbi+LiYhw+fBgAsHfvXsTHx6Nv376Qy+Xw9fVFcnKy6lmjpv0BQF5eHq5du9al03/azm1XtLS0wM/PD7t27cJTTz3VZr1MJoOPjw9u3LgBJycntXX19fV44okncPDgQQQGBnbYx/Tp03Ho0CHVqXIAkEgk2LZtG1544YUuj701S12dJ2Nm8bvvvsP8+fNRX18PFxcXPPvsszhy5IjqtPiDWXz//fdRV1eHiIgI1NXVYdCgQTh48CD8/PxU/Wjap6lnEQBefPFFREVFISYmps26zrIIAM8//zxmzJiB6dOnd7j/5ORkfPrpp2hsbFQts7a2xgcffICFCxd2edyGyiKgnzxmZmbis88+Q21tLRwdHREaGoqjR4+iZ8+eANo/Nt65cwczZ85sd4wnT57Exx9/jKqqKvTo0QPR0dFYsmSJar0YsghAixKvA0LexN+5cydZWVnR3bt31ZYfP36cLCwsNF5wZKgbsGjSejFLYmJim3WZmZk0dOhQQZ9F1JfJkyfTxo0btdrG0BdhzJ8/n958802tx5KamkpBQUEaL4iRyWQUERFBFhYWBNy7IGjFihUPPW5j3PSiM5zFh/f3v/+dBg4c2G6mOhvL2bNnyc7Ojqqrqzvdf0tLC73zzjtkaWmpukDtzTfffOgbuJhaFolMO49iyCKRCd6AZeHChRQaGtpm+bJlyyggIEAnfehyu47s2bOH/Pz8tLoDj6kzdEDz8vLI2tq63dNiHY2lpaWFAgMDKTU1VXA/rZ9WuHnz5kOPubOxGWr7B3EWH97du3fJ1dWVjh49qtVYZsyYQTExMYL7KSsro59//llnj83Uskj06OWRryoH8Pnnn6s+G3q/jz76CBcvXjTCiLrmxIkTWLlyperD/0x7AwYMwKRJk/CHP/xB0OeriQgffPAB7t69q9WpLl9fXwD/vUr6UcNZfHi2trb48MMPMX36dNy8eVPQNlu3bsXu3bsRFxcnuB93d3ej36dC3ziPD8/kCrfY3bx5E5MmTYKFhQUmTpxo7OGIXuu3gI0dOxYlJSUdtqutrcXcuXOxfft2HD58GHZ2doYaosniLOrWBx98gAkTJiAsLAxnz57tsF1TUxO++eYbxMbGYteuXejfv78BR2m6OI+6I/jiNCaMl5eX6pur2MPr1q0bMjIyEBMTgz59+iAyMhIxMTHo1asXgHt35Prhhx+wZcsWDB48GP/617/g4+Nj5FGbBs6ibpmZmSElJQV//etf8eyzzyIkJATz5s3DwIEDAdy7sOnHH39EamoqbGxskJGRgREjRhh51KaD86g7/IqbmTxbW1ts2bIFV69exYABAzBr1iwMGTIEwL2v4bt79y4yMzPx66+/ctFmemVmZoaPP/4Yt27dwssvv4ylS5ciJCQEADB69GicPXsWGzZswNWrV7loM73hV9xMNHx9fbFs2TIsW7YMLS0tkMlkcHFxEXzvaMZ0xcXFBe+99x7ee+89KJVKVFVVwdXVlbPIDIILNxMlCwsLk78tIXs8mJubt7k9M2P6xKfKGWOMMRHhws0YY4yJCBduxhhjTES4cDPGGGMiwoWbMcYYExEu3IwxxpiIcOFmjDHGRIQLN2OMMSYiRrkBS01NjcnuW59jEzueG8Pi+e4Yz41h8Xx3zBhzY9DCLZFI4OHhAW9vb7324+HhAYlEotU2hhqb2HVlbpl2OIvCcBb1j7MojKGzaNDCbWNjg8LCQigUCr32I5FItP6uV0ONTey6MrdMO5xFYTiL+sdZFMbQWTT4qXIbGxuT/WMz5bGxxwtnkZkKzqLp4YvTGGOMMRHhws0YY4yJCBduxhhjTES4cDPGGGMiwoWbMcYYExEu3IwxxpiIcOFmjDHGRIQLN2OMMSYiXLgZY4wxEeHCzRhjjImIwW95KpfLTfJe5YBhxiZ2fH9ow+AsasZZNAzOomaP9L3K5XI5evfuDalUqtd+PDw8UFhYqNVEGmpsYteVuWXa4SwKw1nUP86iMIbOokELt0KhgFQqRUlJCRwdHfXSR01NDby9vaFQKLSaREOMTey6OrdMO5xFzTiLhsFZ1MwYWTT4qXIAcHR0NNkQmPLY2OOFs8hMBWfRtPDFaYwxxpiIcOFmjDHGRIQLN2OMMSYiXLgZY4wxEeHCzRhjjIkIF27GGGNMRLhwM8YYYyLChZsxxhgTEaPcgIUxU1BRUYGtW7fi0qVLAIBFixZh3LhxiIyMhIWFhZFHxx4nDQ0N2LFjB86ePYvKykoAwObNmxEdHQ07Ozsjj46ZGn7FbQTHjh1DcHAwlEql0cYwefJkbNq0yWj9G1N+fj6mT58Ob29vpKenw9raGgDQ2NiId999F/7+/vjss88gl8uNPFL94ywaV0VFBT744AP06tULX3zxBaytreHp6QkASElJQa9evfD++++jtLTUyCM1DM6jQGRAMpmMAJBMJjO5PrTdzs/Pj6ytrcnOzo7s7e0pLCyMLly4IGjbgIAA2r9/v+r3pUuXkr+/Pzk6OpKbmxuFh4d3ui+pVEqvvfYaubu7k5OTEw0fPpyysrJU67dt20YjR44kBwcH6uifODc3l3r27EkNDQ2CxkxkmH8/fTt27Bg5OTnR7Nmz6fLly0REVFJSQgCopKSEmpqaKD09nYKDg2nkyJFUWVmpdR8PO0/GzGJiYiKZm5uTnZ2d6ufVV18VtK9JkyYRADp27JhWbR7XLBYUFFDfvn0pIiKCsrKySKlUEtF/83jjxg06efIkvfTSS+Tn50dXrlzRug9DZ5HIuMdGIqLjx4/TyJEjyc7OjlxcXGjixIlq6xcuXEgDBw4kBwcH8vT0pOjoaKqoqFCt1zaPxsiiyRZuPz8/SkpKarM8JCSEPvnkE5300dXtysvLCQCdOnWKiIhqa2tp3LhxFBwcrHHbjIwM8vLyopaWFtWy/Px8VYFobGykpKQk8vDwUGtzvylTptCoUaOovLycmpubKSkpiezt7amqqoqIiH788Uf6xz/+QWlpaR0WbiKi4cOHU1pamsYxtxL7wfL8+fPk4OBAGzZsUFt+f+FuVV9fTy+++CKNGjWK5HK5Vv0Y8mCp6ywmJibSqFGjtB7z5s2bKTw8vNPC3Vmbxy2LpaWl1KdPH5o/f36bv/MH86hUKik+Pp58fHzo1q1bWvVj6MJt7GNjVlYWOTo60tatW+nu3bvU2NhIp0+fVmuzePFiOn/+PCkUCiotLaWxY8dSZGSkWhtt8miMLJrkqfKKigoUFRUhKChIbXlzczNyc3MRGhpqnIH9R3Z2NiQSCYKDgwEA9vb2CAsLE3Q6a/fu3XjhhRdgbv7fqe/fvz9cXFwAAEQECwsLSKVSyGSydvdx7do1TJ06Fd27d4eFhQViYmJQV1eHgoICAEBERARee+01+Pv7dzqW8PBw7NmzR9BjfhTMmTMHcXFxmDlzpsa23bp1w86dO1FZWYl169YZYHRdo+ssdsXNmzeRkJCA9evXd7nN45bFTz75BIMGDcLKlSs1zr+ZmRk+//xzPP300/jwww8NNMKuMfax8cMPP8ScOXPw+uuvw9bWFhKJpE29+OyzzzB06FBYWVmhR48e+OMf/4isrCy1NqaeR5Ms3NnZ2QDQpnD/+9//RmNjo9EL95kzZxAUFARra2solUqcPHkSa9euxRtvvKFx2/Pnz2Pw4MFtlh88eBDOzs6wsbFBXFwc4uLiVIF90KJFi7B7925IpVI0NTUhOTkZ/fv3b3e/nQkICFDN9aMuOzsbV65cwZ/+9CfB23Tr1g0LFy5ESkoKiEhj+wsXLmDy5MkYMmQIAODcuXNdHq9Q+sji2bNn4e7uDl9fX0ybNg2FhYUd7oOIEB0djYSEBPj4+HS5zeOURZlMhq1btyIxMVHwkyYzMzMkJiZix44dqKio0Nj+5s2bmDt3LgIDAwEABw4ceKgxC2XMY2N9fT1Onz4NABg2bBjc3NwwfPhwHD16tNN+jx49qpqnViafR4O9tifhpxT+/Oc/k5eXV5vlW7ZsIT8/P5308TDbTZgwgSQSCTk5OZGlpSVJJBJatWqV6j2qzvTr14/Wr1/f4fo7d+7QV199Rbt27eqwTWFhIUVERBAAsrCwoB49eqhOTd3v2LFjnZ4qz8jIICsrK41jbiXm05MzZsygefPmtbuuvVPlrRoaGqh79+509OjRTvf/r3/9iyQSCZmbmxMAAkBWVlZq1x4IZcwsXrp0iYqKikipVNKtW7fozTffJH9/f6qtrW13H8nJyfTCCy+ofkc7p8GFtHmcsrh69Wp66qmnOlzfWR6fe+45+vzzzzvdv1Qqpe7du5OVlZUqi6250Ja282zMY2PrvHl4eKhOhaemppKtrS0VFBS0u833339P9vb2dO7cObXl2uSRT5X/R3Z2NqRSKbp37672Exsba/RX263jS0tLQ3V1NUpLSxEaGooLFy7AzMxM47aurq4dnuZpXb9gwQJER0fj8uXLbdYrlUqMGTMGXl5eqKyshFwuR2pqKsaPH6/6WJNQNTU1cHV11WobsTp16hQmTpyo9XY2NjaIiIjAr7/+2mm7xYsXQ6FQqF0N29TUhIULF2rdpzZ0ncXBgwfD19cXZmZm+N3vfoe0tDTcvn0bp06darN9QUEBli5dig0bNnTYh5A2wOOVxV9//bVLWQSAiRMnaszi6tWrUVtbi6amJtUyhUKBJUuWoLGxsUv9CmXMY6ODgwMAIDo6WnUqfPbs2ejduzd++umnNu23b9+OmJgY7Nu3T3Vqv5Wp51Hw57hramoeujOh+8jOzsaiRYsQGxurtjwyMhK///3vddqXtu2Li4tRVlam+od2dXVFQkICoqKisGLFCri4uOD06dP45ptvsG3bNgDA3LlzERUVhXHjxiEkJKTd0N1PqVSiqakJV69exaBBg9TWVVVV4fr160hPT1edLoqKioK/vz8yMjIQEBAg+DHn5uZi2LBhgtu30kUWDE0mk8HKyqrdsdfW1qr+2976bt26obS0tNPHff78+XaX/9///Z+os2hmZgYzM7N23yr45ZdfcOfOHYSEhKgtj4qKwrRp05CSkiKoDfB4ZbGyshLW1tYdjr2zPNrY2ODOnTudPu6srKx2C3R9fT3y8vLQp08fwWPVZn6NfWx0cnKCv79/mycJ7T1pSEtLQ3x8PA4cOICwsLA267uSR11k0dHRUVhDoS/N8Z9TLrr46eyUQlFREQFoc4rx7t27gk49tp620MfYiIh27txJdnZ2alc1NjU1kbOzs+oqxMbGRhowYAAREZ07d46mTJmianvkyBHy9vZW237lypV0+/ZtIiIqKyuj2bNnk7OzM0ml0nbHMGDAAJozZw7JZDJqaWmhvXv3kkQiUZ1+bG5upoaGBvrpp58IADU0NFBDQ0ObKzFHjBjR5grrzjzs3PKP6Wdx+/btVFZWRkT3rnyeMWMG+fr6Uk1NTZv+6+vrqaSkRO0HAO3YsUN1JbCQNpxF0/8RchrYFI6NK1asIE9PT7p48SI1NzfTxo0byc7OjgoLC9X26ebmRtnZ2R0+Fm3yqMssCiX4FXdnpzCEqqmpgbe3d6dtsrOzYWVl1eaV9ZkzZ6BUKts8c+9ISUmJ8GcvAsfWOr7AwEC1i0osLS0xYcIE7NixA9HR0ZBIJHBzc0NpaSni4+PVThOOGTMGLi4uOHToECIjIwEAmZmZ+Oyzz1BbWwtHR0eEhobi6NGj6NmzJwAgNjYWxcXFOHz4MABg7969iI+PR9++fSGXy+Hr64vk5GQ899xzAIBvv/0Wb7/9tqpPW1tbAPdubtDaJi8vD9euXcO0adMEz1ErbefWFLz66qsIDAzE4sWL26yTyWTw8fHBjRs34OTkpLZOqVQiODgYiYmJmDx5cof737dvH6Kjo9VOT0okEqxZswavvPKKVmM1Zha/++47zJ8/H/X19XBxccGzzz6LI0eOqE5D3p/Fbt26oVu3bm3G5e7urjobJKTN45bFzz//HOfPn8f333/f7vrO8jh9+nT4+fnh008/7XD/+fn5GDlyJBQKhWqZtbU13nrrLSQlJWk1VqFZBEzj2Pj++++jrq4OERERqKurw6BBg3Dw4EH4+fmp+lmwYAEsLS1Vx8JWeXl58PHx6XIeDZpFwSVeB4S8ib9w4UIKDQ1ts3zZsmUUEBCgkz50uV1H4uPjaerUqZSYmNhmXWZmJg0dOrTDzyIawuTJk2njxo1abSPmC4IOHjxInp6epFAo2qzr7HH9+OOP1LNnT2psbNTYx5YtW6hXr14E3LtAJjU1tUtj5SxqJuYslpSUkJWVldqrwPt19Nhu3bpFEomErl27prGPEydOUGBgIAEge3t7+vDDD6mpqUnrsepjnh+1PPINWIzYh67HtmfPHvLz89PqblCmTswHy+bmZurduzdt2rSpzbqOHldLSwuNHTuWEhIStOpLoVAIuoq2I5xFzcScRaJ7N1F69913213X0WNbtGgRjR8/Xqt+TC2LRI9eHo2RRf6SET05ceIEVq5cCRsbG2MPhQGwsLDAihUr8NZbb6Ffv34YMWJEp+2JCIsWLcK1a9fw3XffadWXlZXVwwxV5ziLpucvf/kLRowYgcDAQEE3BPrHP/6B5ORknDhxQqt+TC2LAOdRF0zy42BidvPmTUyaNAkWFhZd/sgH04/Jkyfjyy+/RHh4ONatW4eGhoZ22xUVFeGtt97C9u3bcfjwYbi7uxt4pLrBWTRdgwYNQnp6OuLi4rB48eIOb6pSWVmJP//5z4iJicGuXbswdOhQA49UdziPusOvuHXMy8sL6enpxh4G60BsbCx69eqFxYsX46OPPsLbb7+t+gjdd999h0OHDuGnn37CSy+9hH/961/o1auXkUfcdZxF0/b888/jxIkTeP/99+Hl5YWpU6di/PjxsLS8d1ieN28edu/ejWHDhuHYsWNd+ricKeE86g4XbvbYeemllxAZGYl//vOfSE1NxZo1awDcuxp/7NixSElJgZeXl5FHyR4HgYGByMzMRF5eHtatW4fk5GRUV1cDuPdpkNOnT2t1bwb2eODCzR5LZmZmeOaZZ/DMM8+AiFBbWwsHBwdBd3hiTNcGDhyIVatWAQDnkWnEhZs99szMzET3WWD26OI8Mk344jTGGGNMRLhwM8YYYyLChZsxxhgTES7cjDHGmIhw4WaMMcZEhAs3Y4wxJiJcuBljjDER4cLNGGOMiYhRbsBSU1NjsvvW59jEjufGsHi+O8ZzY1g83x0zxtwYtHBLJBJ4eHjA29tbr/14eHhAIpFotY2hxiZ2XZlbph3OojCcRf3jLApj6CyaEREZrDcAcrkcCoVCr31IJJIufderIcYmdl2dW6YdzqJmnEXD4CxqZugsGrxwM8YYY6zr+OI0xhhjTES4cDPGGGMiwoWbMcYYExEu3IwxxpiIcOFmjDHGRIQLN2OMMSYiXLgZY4wxEeHCzRhjjIkIF27GGGNMRLhwM8YYYyLChZsxxhgTES7cjDHGmIhw4WaMMcZEhAs3Y4wxJiL/H3r4fcgYPW0JAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 494x220 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from folding_protein import circuit\n",
    "\n",
    "# The following code builds a 4-qubit parameterized circuit that contains two circuit blocks (NOTE: one circuit block contains a layer of RY and a layer of CNOT).\n",
    "cir = circuit(4, 2)\n",
    "cir.plot()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## How to use\n",
    "Users can customize their task via a configuration file `config.toml`, the user defined settings are listed below.\n",
    "```toml\n",
    "# The configuration file for protein folding problem\n",
    "\n",
    "# The amino acides consists in protein. \n",
    "amino_acids = [\"A\", \"P\", \"R\", \"L\", \"R\", \"F\", \"Y\"]\n",
    "# Pair of indices indicates the potentially interact amino acide pair.\n",
    "possible_contactions = [[0, 5], [1, 6]]\n",
    "# Depth of the quantum circuit used in VQE\n",
    "depth = 1\n",
    "# Number of VQE iterations\n",
    "num_iterations = 200\n",
    "# The condition for VQE convergence\n",
    "tol = 1e-3\n",
    "# The number of steps between two consecutive loss records\n",
    "save_every = 10\n",
    "# learning rate for the optimizer\n",
    "learning_rate = 0.5\n",
    "```\n",
    "In order to obtained the 3D structure of the amino acid sequence, user can run\n",
    "```shell\n",
    "python folding_protein.py --config config.toml\n",
    "```\n",
    "in terminal, the program will save the figure automatically after the computation.\n",
    "\n",
    "![](APRLRFY_3d_structure.jpg)\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## References \n",
    "\\[1\\] Pande, Vijay S., and Daniel S. Rokhsar. \"Folding pathway of a lattice model for proteins.\" Proceedings of the National Academy of Sciences 96.4 (1999): 1273-1278.\n",
    "\n",
    "\\[2\\] Robert, Anton, et al. \"Resource-efficient quantum algorithm for protein folding.\" npj Quantum Information 7.1 (2021): 1-5."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "modellib",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
Q
Quleaf 已提交
178
   "version": "3.7.15"
Q
Quleaf 已提交
179 180 181 182 183 184 185 186 187 188 189
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "8f24120f890011f53feb4ed62c47961d8565ec1de8b7cb23548c15bd6da8f2d2"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}