{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# qGANs for Loading Random Distributions\n", "\n", "Given $k$-dimensional data samples, we employ a quantum Generative Adversarial Network (qGAN) to learn the data's underlying random distribution and to load it directly into a quantum state:\n", "\n", "$$ \\big| g_{\\theta}\\rangle = \\sum_{j=0}^{2^n-1} \\sqrt{p_{\\theta}^{j}}\\big| j \\rangle $$\n", "\n", "where $p_{\\theta}^{j}$ describe the occurrence probabilities of the basis states $\\big| j\\rangle$. \n", "\n", "The aim of the qGAN training is to generate a state $\\big| g_{\\theta}\\rangle$ where $p_{\\theta}^{j}$, for $j\\in \\left\\{0, \\ldots, {2^n-1} \\right\\}$, describe a probability distribution that is close to the distribution underlying the training data $X=\\left\\{x^0, \\ldots, x^{k-1} \\right\\}$.\n", "\n", "For further details please refer to [Quantum Generative Adversarial Networks for Learning and Loading Random Distributions](https://arxiv.org/abs/1904.00043) _Zoufal, Lucchi, Woerner_ \\[2019\\].\n", "\n", "For an example of how to use a trained qGAN in an application, the pricing of financial derivatives, please see the\n", "[Option Pricing with qGANs](https://github.com/Qiskit/qiskit-finance/tree/main/docs/tutorials/10_qgan_option_pricing.ipynb) tutorial." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "seed = 71\n", "np.random.seed = seed\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline\n", "\n", "from qiskit import QuantumRegister, QuantumCircuit, BasicAer\n", "from qiskit.circuit.library import TwoLocal\n", "\n", "from qiskit.utils import QuantumInstance, algorithm_globals\n", "from qiskit_machine_learning.algorithms import NumPyDiscriminator, QGAN\n", "\n", "algorithm_globals.random_seed = seed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load the Training Data\n", "\n", "First, we need to load the $k$-dimensional training data samples (here k=1).\n", "\n", "Next, the data resolution is set, i.e. the min/max data values and the number of qubits used to represent each data dimension." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Number training data samples\n", "N = 1000\n", "\n", "# Load data samples from log-normal distribution with mean=1 and standard deviation=1\n", "mu = 1\n", "sigma = 1\n", "real_data = np.random.lognormal(mean=mu, sigma=sigma, size=N)\n", "\n", "# Set the data resolution\n", "# Set upper and lower data values as list of k min/max data values [[min_0,max_0],...,[min_k-1,max_k-1]]\n", "bounds = np.array([0.0, 3.0])\n", "# Set number of qubits per data dimension as list of k qubit values[#q_0,...,#q_k-1]\n", "num_qubits = [2]\n", "k = len(num_qubits)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initialize the qGAN\n", "\n", "The qGAN consists of a quantum generator $G_{\\theta}$, i.e., an ansatz, and a classical discriminator $D_{\\phi}$, a neural network.\n", "\n", "To implement the quantum generator, we choose a depth-$1$ ansatz that implements $R_Y$ rotations and $CZ$ gates which takes a uniform distribution as an input state. Notably, for $k>1$ the generator's parameters must be chosen carefully. For example, the circuit depth should be $>1$ because higher circuit depths enable the representation of more complex structures.\n", "\n", "The classical discriminator used here is based on a neural network implementation using NumPy. There is also a discriminator based on PyTorch which is not installed by default when installing Qiskit - see [Optional Install](https://github.com/Qiskit/qiskit-machine-learning#optional-installs) for more information.\n", "\n", "Here, both networks are updated with the ADAM optimization algorithm (ADAM is qGAN optimizer default)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Set number of training epochs\n", "# Note: The algorithm's runtime can be shortened by reducing the number of training epochs.\n", "num_epochs = 10\n", "# Batch size\n", "batch_size = 100\n", "\n", "# Initialize qGAN\n", "qgan = QGAN(real_data, bounds, num_qubits, batch_size, num_epochs, snapshot_dir=None)\n", "qgan.seed = 1\n", "# Set quantum instance to run the quantum generator\n", "quantum_instance = QuantumInstance(\n", " backend=BasicAer.get_backend(\"statevector_simulator\"), seed_transpiler=seed, seed_simulator=seed\n", ")\n", "\n", "# Set entangler map\n", "entangler_map = [[0, 1]]\n", "\n", "\n", "# Set an initial state for the generator circuit as a uniform distribution\n", "# This corresponds to applying Hadamard gates on all qubits\n", "init_dist = QuantumCircuit(sum(num_qubits))\n", "init_dist.h(init_dist.qubits)\n", "\n", "# Set the ansatz circuit\n", "ansatz = TwoLocal(int(np.sum(num_qubits)), \"ry\", \"cz\", entanglement=entangler_map, reps=1)\n", "\n", "# Set generator's initial parameters - in order to reduce the training time and hence the\n", "# total running time for this notebook\n", "init_params = [3.0, 1.0, 0.6, 1.6]\n", "\n", "# You can increase the number of training epochs and use random initial parameters.\n", "# init_params = np.random.rand(ansatz.num_parameters_settable) * 2 * np.pi\n", "\n", "# Set generator circuit by adding the initial distribution infront of the ansatz\n", "g_circuit = ansatz.compose(init_dist, front=True)\n", "\n", "# Set quantum generator\n", "qgan.set_generator(generator_circuit=g_circuit, generator_init_params=init_params)\n", "# The parameters have an order issue that following is a temp. workaround\n", "qgan._generator._free_parameters = sorted(g_circuit.parameters, key=lambda p: p.name)\n", "# Set classical discriminator neural network\n", "discriminator = NumPyDiscriminator(len(num_qubits))\n", "qgan.set_discriminator(discriminator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Run the qGAN Training\n", "\n", "During the training the discriminator's and the generator's parameters are updated alternately w.r.t the following loss functions:\n", "$$ L_G\\left(\\phi, \\theta\\right) = -\\frac{1}{m}\\sum\\limits_{l=1}^{m}\\left[\\log\\left(D_{\\phi}\\left(g^{l}\\right)\\right)\\right] $$\n", "and\n", "$$ L_D\\left(\\phi, \\theta\\right) =\n", "\t\\frac{1}{m}\\sum\\limits_{l=1}^{m}\\left[\\log D_{\\phi}\\left(x^{l}\\right) + \\log\\left(1-D_{\\phi}\\left(g^{l}\\right)\\right)\\right], $$\n", "with $m$ denoting the batch size and $g^l$ describing the data samples generated by the quantum generator.\n", "\n", "Please note that the training, for the purpose of this notebook, has been kept briefer by the selection of a known initial point (`init_params`). Without such prior knowledge be aware training may take some while." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Run qGAN\n", "result = qgan.run(quantum_instance)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training results:\n", " params_d : [ 0.03697158 0.61015372 -0.48103428 ... -0.1661673 -0.20186384\n", " -0.08584337]\n", " params_g : [2.95229918 0.9522102 0.55218478 1.64793094]\n", " loss_d : 0.6925\n", " loss_g : [0.7246]\n", " rel_entr : 0.107\n" ] } ], "source": [ "print(\"Training results:\")\n", "for key, value in result.items():\n", " print(f\" {key} : {value}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training Progress & Outcome\n", "\n", "Now, we plot the evolution of the generator's and the discriminator's loss functions during the training, as well as the progress in the relative entropy between the trained and the target distribution.\n", "\n", "Finally, we also compare the cumulative distribution function (CDF) of the trained distribution to the CDF of the target distribution." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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ZcuWOV1Ct9Ke7fHdd995v5D9ePTRR/XGG29s9fVnnnlG7733XlVVrays1EmTJumWLVt02bJl2qdPH92xY4fW1dXptGnTdPny5VpdXa3Tp0/XnJwcVVVdsmSJ/uxnP9Pi4mI99thj9brrrmucd35+vtbX16uq6l/+8he9+eabVVX1rrvu0gcffLBxvNNPP11ffPFFVVV97rnn9KyzzlJV1csuu0xPO+00ra2t3afuZcuW6WmnnaaqqvPnz9e7775bVVU/+ugjHT9+fON8P/vsM1VVLSkp0ZqaGn3ooYf097//vaqq1tbWanFx8T7zvuyyy/T111/fZzmqqvPmzdMXXnhBVVUHDx6sjz32mKqqLly4UK+88kpVVb3lllv22Q6qqmFhYc2W0/B86dKlevzxx2ttba3u2rVLBw4cqJmZma3+DbyhpfcpsEpb+Vz1mdNH4y5JIedvaeS+tp6Bv5mBK9hnVt14yZdx97U9UgdMy/lNu8edN28en332GYGBgaxcuZIPPviAdevWsXTpUgCKiorYtGkTgYGBTJ06laSkJABSUlJIT08nKiqKb775hhNOOAFw71EkJCQ0zv+CCy5ofJyRkcEFF1xAVlYW1dXVrZ6euGLFCt58800ALrnkkmbf/s8//3z8/Pz2u06fffYZb7zxBgCzZs0iLy+P4uJijjzySG6++WbmzJnDOeecQ1JSElOmTOGKK66gpqaG2bNnk5KS0u5t15JzzjkHgEmTJjWuw4cffsiiRYsax4mOjm6z/osuugg/Pz/i4+M59thjWblyJX369Gnxb3DUUUcdVM2dwWcODYWlJFA/JIza/Ary393odDnGdMiYMWNYs2ZN4/OFCxfy0UcfkZubC7j38B9//HHS0tJIS0tj69atnHjiiQAEBQU1Tufn50dtbS2qypgxYxrHX79+PR988EHjeE173Lz++uuZP38+69ev55lnnunQRXUH04PnggULWLRoERUVFRx55JF8//33HHPMMXz66acMGDCAyy+/nJdeemm/8/D396e+vr7x+d7r0LCNGrZPZ2vpb9Ad+MzXYhGh7vh4XIu2kLN4LbHnjHG6JNPDHcg3984ya9YsfvOb3/DUU09x3XXXAVBeXt74+kknncRTTz3FrFmzCAgI4IcffmDAgAGtzu+www4jNzeXFStWMH36dGpqavjhhx8YNGjQPuMWFRU1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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot progress w.r.t the generator's and the discriminator's loss function\n", "t_steps = np.arange(num_epochs)\n", "plt.figure(figsize=(6, 5))\n", "plt.title(\"Progress in the loss function\")\n", "plt.plot(\n", " t_steps, qgan.g_loss, label=\"Generator loss function\", color=\"mediumvioletred\", linewidth=2\n", ")\n", "plt.plot(\n", " t_steps, qgan.d_loss, label=\"Discriminator loss function\", color=\"rebeccapurple\", linewidth=2\n", ")\n", "plt.grid()\n", "plt.legend(loc=\"best\")\n", "plt.xlabel(\"time steps\")\n", "plt.ylabel(\"loss\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot progress w.r.t relative entropy\n", "plt.figure(figsize=(6, 5))\n", "plt.title(\"Relative Entropy\")\n", "plt.plot(\n", " np.linspace(0, num_epochs, len(qgan.rel_entr)), qgan.rel_entr, color=\"mediumblue\", lw=4, ls=\":\"\n", ")\n", "plt.grid()\n", "plt.xlabel(\"time steps\")\n", "plt.ylabel(\"relative entropy\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [ "nbsphinx-thumbnail" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAFNCAYAAAANRGjoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA3QElEQVR4nO3deZhU5Zn///ddvdArWzc0sgkqOygCItFEcEtMTFxGTVziEnWMPy8nyyROTMZkEifLJJNlkq/GxMk2JlE0q2TCmBgVFxTFBRWaRdygAYFutl7ppe7fH6cgVdXd9Fp9qro+r+visus5292ny/rUOc85zzF3R0REslck7AJERCRcCgIRkSynIBARyXIKAhGRLKcgEBHJcgoCEZEspyDIMmb2PjP7Y9h1dMTMfmFmX+3D8nVmdkx/1hTGts3sC2b2k9jPk8zMzSy3n9Y9MVZrTn+sL52Y2RVm9td+WE+Fma03syH9UVcmUBCEzMwuN7PnY/9z7jCz/zOzd8emfdnMWsysNvZvk5ndYWZHxS2/xMyiseUP/fvTETb5NeA/4pY3M/uEma01s3ozqzKz35jZnNT91n1nZivM7Pr4Nncvcfc3+nk7yfu3ysweMLOTerrt2Lqqutqmu3/d3a/var7uMLO3zOysuHVvidXa1h/rT9qWx95Dh/bVvv7eRty22gWku//a3d/b13W7+07gMeCGvq4rUygIQmRm/wz8F/B1oAKYCPwQOD9utvvdvRQYCVwIjAFeiA8DYHvsf+5D/z7UyfZOAoa5+6q45u8DnwQ+EdvGVOCPwLl9/w0Hje3uXgKUAouADcCTZnZmf2+ov775h+iEuPfh8LCL6YNfAx8Pu4gB4+76F8I/YBhQB1xyhHm+DPwqqS0HeBn4duz1EqCqm9v8EvCTuNdTgDZg4RGWWQFcH/f6GuCpuNcO3AS8BtQC/w4cCzwNHAAeAPI7WjZu+eNiP/8C+Grs5xHA/wK7gb2xn8fHpn0tVndTbB/eEb8u4GTgHSAnbjsXAq/Efo4AtwKvAzWxGkd28vt3uH+BO4DnO/k9PgBUxvbHNuCzQDHQCERjNdcBY2N/498Cv4rtr+vj/+7ApNi6bwC2AzuAz8Zt9/A+S64X+GVse42x7f1L3PpyY/OMBZYBe4DNwD8mvf8eAO6J/S7rgAVHeK8c3gdHak/6Oy8BqoDPALtiv9/H4uYtBL4DvA3sB56KtW2JrffQvnwX7d+bpwCrY8utBk5Jel//O7Ay9rv9FSiPm54LNABHh/1ZMRD/dEQQnncBBcAferKQB4f0DwLv6cU25wAb416fSfCh8Vwv1hXvfcB8gm/L/wLcDXwUmADMBi7rxTojwM+BowmOlBoJPnxx938FngRu9uCb583xC7r7s0A9cEZc8+XAvbGf/wm4AFhM8EG4F7izh/X9HphnZsUdTPsp8HEPjuRmA4+6ez3wfhKP3rbH5j+fIAyGE3wT7cjpBMH9XuBz8ad7OuPuVxJ8YH4otr1vdTDbUoIP4rHAxcDXzSx+v50Xm2c4QWDc0dV2e2EMwRejccB1wJ1mNiI27dsE761TCI5Y/4Ug3E6LTR8e+92eiV+hmY0E/gz8ACgDvgv82czK4ma7HPgYMBrIJwhsANy9lSAYT+i/XzN9KQjCUwZUx95wPbWd4H+KQ8aa2b64fx/uZLnhBN9+4mvY0YvtJ/uWux9w93XAWuCv7v6Gu+8H/g84sacrdPcad/+duze4ey3BUcDiHqziPmIBZGalBN/S74tNuxH4V3evcveDBN98L+7haZntgBHs02QtwEwzG+rue939xS7W9Yy7/9Hdo+7e2Mk8X3H3end/lSAgexOuCcxsAnAq8Dl3b3L3NcBPgKviZnvK3ZfHvoD8kq4/GF+Mex/+oJultAC3u3uLuy8n+IY/zcwiwLXAJ919m7u3ufvTsb9ZV84FXnP3X7p7q7vfR3BKL/606c/dfVNsnz8AzE1aRy0d/30HHQVBeGqA8l6eEx5HcCh/yHZ3Hx7374FOlttLcJ47voajOpm3J3bG/dzYweuSnq7QzIrM7Mdm9raZHQCeAIb34GqXe4F/iF358Q/Ai+7+dmza0cAfDn1gAesJTjVV9KDEcQSnJvZ1MO0iguB528weN7N3dbGurd3YXvw8bxN8g++rscCeWNDGr3tc3Ot34n5uAAq6eM/Oi3sffqKbddQkfSFqIHjPlBMcNb/ezfXEG0vwu8Tr6ndLfp+W0vHfd9BREITnGeAgwSmKbot9S/oQwamRnnqFoDP4kEeA8Wa24AjL1ANFca/H9GK7Ha7LzI60rs8A04CT3X0ofz8VYLH/HnHYXHevJPgf//0knhaC4EP1/UnhWeDu23rwu1xIEC71HWx7tbufT3DK4Y8E3zaPVHN3hgCeEPfzRIIjEuj673OkdW8HRsaOmOLX3ZP90B0N9O49VE3QD3RsB9O62mfbCQI/Xrd/t1jYHUfQHzfoKQhCEjtt8iWC86EXxL4B55nZ+82s3blcM8s1sxkEpzfGEJzz7KnlxJ1ecffXCK5Sui92aWO+mRWY2aVmdmtstjUE36yLzOw4gnO4vfUyMMvM5ppZAcEpmc6UEhxN7Iud7/23pOk7ga6u27+X4Iqo04DfxLX/CPiamR0NYGajzOz8DpZPELvUdpyZ/RtBp+4XOpgnP3Y9+zB3byHoAI7G1VxmZsO62lYHvhj7G8wiOK99f6x9DfABMxsZC9ZPJS3X6X5y960EnfrfiP3djyf4+/6qF/UdyRrgcjPLMbNz6OYpPnePAj8DvmtmY2PLvyt2lLebYL929h5YDky14PLsXDP7CDCT4KKD7lgIvBV3FDmoKQhC5O7fAf4ZuI3gjb0VuJngW+QhHzGzOoIrH5YRnM6ZH9fR2JPtvQjsN7OT45o/QdABeCfBYfDrBN92D92L8D2gmeAD5X/ovDOzO9vfBNwO/I3gKqOnjjD7fxFcHVINrAIeSpr+fYLz+nuPcC76PoIPnUfdvTpp2WXAX82sNrb+kztY/pCxsb9BHcHVJ3OAJe7e2c1LVwJvxU5p3QhcAeDuG2I1vRE7LdWT0zuPE3RePkJwxdihbf+SIGDfIrjy5f6k5b4B3Bbb3mdp7zKCK4m2E1y48G/u/rce1NUdnyQ4it1HsC/+2INlPwu8SrDf9wDfBCLu3kDQb7Qy9rstil/I3WuADxIcWdYQdDJ/MOl9cCRXEHxhyArmrgfTZBMzey9wk7tfEHYtIunIzEYTBO+J7t4Udj0DQUEgIpLldGpIRCTLKQhERLKcgkBEJMspCEREslzGjXRYXl7ukyZNCruMXqmvr6e4uKOhaaQ7tP/6TvuwbzJ5/73wwgvV7j6qo2kZFwSTJk3i+eefD7uMXlmxYgVLliwJu4yMpf3Xd9qHfZPJ+8/MOr05TqeGRESynIJARCTLKQhERLJcxvURdKSlpYWqqiqamtL7bvBhw4axfv36sMvolYKCAsaPH09eXl7YpYhIPxsUQVBVVUVpaSmTJk3CzLpeICS1tbWUlpZ2PWOacXdqamqoqqpi8uTJYZcjIv1sUJwaampqoqysLK1DIJOZGWVlZWl/xCXS39zh2QNwyToofgLOYDHFT8CH18FzB4Lpg8GgOCIAuhUC7vBcLXx7KyyvgcYoFEbg3DL47AQ4qRSUJR1TyEq2aYnCVRtgWTU0RQ89VMJoiMLvdgefIR8qh3umQ16Gf6VOWflm9jMz22VmazuZbmb2AzPbbGavmNm8VNUCwR/18vVwxhr4/W5oiAaPODr0Rz1jTTC9JdrFijpRUtLjpzGmrcH0u4j0hvvfQ6Ah+vcnCx0SBeqj8GB1MF+mHxmkMsd+AZxzhOnvB6bE/t0A3JWqQrLpj9rW1hZ2CSIZ77la+FPs8+JIGqPBfKtrjzxfuktZELj7EyQ+YD3Z+cA9HlhF8GDy/niQejsD+Ud1d2655RZmz57NnDlzuP/+4IFR0WiUT3/600yfPp2zzz6bD3zgA/z2t79tt/yhOxcvvvhipk+fzhVXXMGhZ0Y88sgjnHjiicyZM4drr72WgwcPAsHd1p/73OeYN28ev/nNb5g0aRKf//znmTt3LgsWLODFF1/kfe97H8ceeyw/+lHw0KW6ujrOPPNM5s2bx5w5c3jwwQd7/0uLDDLf2Rp8HnRHYzSYP5OF2UcwjuDRjIdUxdp29HaFtqKPFREcGZz8YsfTfEnXy//+979nzZo1vPzyy1RXV3PSSSdx2mmnsXLlSrZs2UJlZSW7du1ixowZXHvttR2u46WXXmLdunWMHTuWU089lZUrV7JgwQKuueYaHnnkEaZOncpVV13FXXfdxac+9SkAysrKePHFoPBbb72ViRMnsmbNGj796U9zzTXXsHLlSpqampg9ezY33ngjBQUF/OEPf2Do0KFUV1ezaNEizjvvPPUFiAB/rml/5qAz0dj8mSwjOovN7AaC00dUVFSwYsWKhOnDhg2jtraW4HnnqRNs48jTH330US688EIaGhooKirilFNO4YknnuDxxx/n/PPPPzxo1Xve8x4aGxvbrbOhoYH58+czbNgw6uvrmTVrFuvXrycSiTBx4kSOOuooamtrueSSS/jv//5vrrvuOtydc8899/C63J0zzjiD2tpapkyZwt69e4HgXoD8/Hy2bt1KcXExt956K08//TSRSIRt27bx+uuvU1FR0env2tTU1G7fD6S6urpQtz8YZPo+3LSleUC20zDh7B5dOdLQ5tx9z8MprCgwdWJ+StYbZhBsAybEvR4fa2vH3e8G7gZYsGCBJw/6tH79+gG5Pr+rbZSWlpKfn09BQcHhefPy8igsLCQ/P59IJHK4PTc3l8LCQiorK/n4xz8OwO23387QoUMpKio6PF9BQQF5eXkUFxeTk5NzuL2oqIjc3FxKS0sxMyoqKg5PO3S5Z2lpKUVFRZSUlByelpOTQ2FhIcuWLWP//v289NJL5OXlMWnSpMPr6+x3LSgo4MQTT+zrbuy1TB7wK11k+j68/aYtKd9G/dC8xE+mbrA2Z+mq6akpKM6jV01MyXrDvOhpGXBV7OqhRcB+d+/1aaF08Z73vIf777+ftrY2du/ezRNPPMHChQs59dRTefDBB4lGo+zcufPwt7KTTz6ZNWvWsGbNGs4777xO1ztt2jTeeustNm/eDMAvf/lLFi9e3Os69+/fz+jRo8nLy+Oxxx7j7bc7HZhQJCs4sO3YEp4/q6Jn15FHnbLtjSmrayCk7IjAzO4DlgDlZlYF/BuQB+DuPwKWAx8ANgMNwMf6us3OzuF/eF1wiWh3zvlFgItHwf2zelfDhRdeyDPPPMMJJ5yAmfGtb32LMWPGcNFFF/HQQw8xc+ZMJkyYwLx58xg2bFi311tQUMDPf/5zLrnkElpbWznppJO48cYbe1ckcMUVV/ChD32IOXPmsGDBAqZPT/23GZF01ZwfYeNJI6keV9TjZSNRZ+KmzL5syDzDrpVcsGCBJz+PYP369cyYMaPTZZ49AGeuCTqCu1IUgcfmwsKhfauzIzt27OCoo46ipqaGhQsXsnLlSsaMGdP/G0qRrvZzqmX6aY10kOn78IwUnBraM3oI608uo7mwg+/FUYdI50cHkdYo5dsamflsDQNxmcWjP+z9qSEze8HdF3Q0LSM6i/tqYWlwB+CD1Ue+JKwwAueVB3cYp8KHP/xhamtraW5u5otf/GJGhYDIYBONwJuzh7NlWvshBXJaokx5cQ97xhRSPa6QaMQSAyHqRKJO+bZGZjw3MCGQSlkRBGbBbeBXbQjuE2hMuqksAhTEQuCe6akbZmL58uUZOeicyGDTUJJL5aIyakcOaTdtaM1BZq6qobC+lTFvN1A7Mp8tU0upGVuI5xjWFvQJTNxYy9C9A3MVU6plRRBAMBbIvTOCm8U6HWsoBaeDRCR9OPDO5GJemzuCtuQBgtw5ev0BJq3bTyR2xtyAoXuamb0quFHg0kUbBuTqoIGWNUEAwTf9hUPhgV52BItI5mrJMzbNH8muie0fPj+koZUZz9YwYvfBECoLX1YFgYhkp33lQ6g8uYyDxe0/8kZtbWDaC3vIa+7liJODgIJARAatqMHbM4fx1oyh7a7+ibRGmfLSXo56sz7jO3v7KsNH0U5v119/PZWVlf2yrkmTJlFdXX3Eeb7+9a8nvD7llFP6ZdsimaixOIeXTq/grVnD2oVAyd5mFjz8DmMVAsAgPSLo72uNe3vt7k9+8pN+raMrX//61/nCF75w+PXTTz89oNsXSRc7Jxaxcd5I2vLbf9edsPEAx7y6j0j2nglqR0cE/aS+vp5zzz2XE044gdmzZ3P//fezZMkSDt38VlJSwm233casWbM466yzeO6551iyZAnHHHMMy5YtA+AXv/gFN9988+F1fvCDH+xwgLALLriA+fPnM2vWLO6++24gGHG0sbGRuXPncsUVVxzeJnQ+NPaRhrwWyUStuUblwjIqF5W3C4H8xjZOeHwXx72sEEg2KI8IwvDQQw8xduxY/vznPwPBWD533fX3Z+3U19dz2mmn8f3vf58LL7yQ2267jYcffpjKykquvvrqI44zlOxnP/sZI0eOpLGxkZNOOomLLrqI//iP/+COO+5gzZo17ebvbGhs6HjI63e/+9192xkiIdg/Mp/KRWU0leS1m1a2vZHpq2vIP6gE6IiOCPrJnDlzePjhh/nc5z7Hk08+2W4cofz8fM4+++zD8y5evJi8vDzmzJnDW2+91aNt/eAHP+CEE05g0aJFbN26lddee+2I8z/11FNcdtll5OTkUFFRweLFi1m9ejUACxcuZPz48UQiEebOndvjWkTC5gZvzRjKS2dUtAuBSJsz5cU9zHlqt0LgCHRE0E+mTp3Kiy++yPLly7nttts488wzE6bn5eUdfuhLJBJhyJAhh39ubW0FgqGpo9G/v1mbmprabWfFihX87W9/45lnnqGoqIglS5Z0OF93HaoDgiGqD9UikgmaCnNYf3IZ+0YXtJtWvK+Zmc/WULK/JYTKMouOCPrJ9u3bKSoq4qMf/Si33HLL4aeF9cSkSZNYs2YN0WiUrVu38txzz7WbZ//+/YwYMYKioiI2bNjAqlWrDk/Ly8ujpaX9m76zobFFMtnucYWsfu+YDkNg3Gu1zH9kp0Kgm3RE0E9effVVbrnlFiKRCHl5edx111189rOf7dE6Tj31VCZPnszMmTOZMWMG8+bNazfPOeecw49+9CNmzJjBtGnTWLRo0eFpN9xwA8cffzzz5s3j17/+9eH2zobG3rBhQ+9/YZGQtOUYr80dwY5jS9pNy2tqY/rqGsp39P4oORtlxTDU6aK2tjajB50Lez9n+hDK6SDT9+FJX9hB5aJyGoa27xAe8U4wEuiQptT1BYQ91pCGoRaRrBV1+K8qeOHMMXhO4i1g1uYc8+o+Jmyq1c1hvaQgEJG0tuMgXLMB/roXSAqBwgMtzFpVTek+9QX0hYJARNLW/1bDxzZCdQef80e9UceUl/aS05ZZp7fT0aAJAnc/fHmm9L9M60uSzNbUBre8AXdsaz8t92Ab057fw+htmf3A+HQyKIKgoKCAmpoaysrKFAYp4O7U1NRQUND+Mj2R/ra2Di5bD2vr208bvquJGc/WUNDYNvCFDWKDIgjGjx9PVVUVu3fvDruUI2pqasrYD9OCggLGjx8fdhkyiLnDD7fDZzbDwaQD0BzgK5Phb7/ZhengtN8NiiDIy8tj8uTJYZfRpRUrVnDiiSeGXYZI2tndDNduhP+taT/tmAL49QxYNAweUQikxKAIAhHJXA/vgas2wDsdPAf+ygq4YwoM1SdVSmn3ikgomqPwr2/Ct7e2n1aaA3dNhSsqBr6ubKQgEJEBt7EBLq+EF+vaT1s0NDgVdEzhwNeVrTTonIgMGHf46Q6Y93z7EIgAXzwanpyrEBhoOiIQkQGxtwVu2AS/7eDivglD4Fcz4LThA16WoCAQkQHw+D746HqoOth+2sWj4O6pMKL9OHIyQBQEIpIyLVG4/W342tuQfOVnUQT+3xT42BjQfaDhUhCISEq80Rh0CD9b237a/BK4dyZMLRr4uqQ9dRaLSL/71Tsw9/mOQ+CWCfD0PIVAOtERgYj0mwOtcNMm+PWu9tOOyod7psNZIwe+LjkyBYGI9ItV++Hy9fBmB0+JPK8MfjoNyvMHvi7pmoJARPqkzeEbb8OX34LkMUELIvDdY+HGseoQTmcKAhHptS1NwWWhT+5vP21OMdw3E2YVD3xd0jMKAhHpld/ugn/cBPta20/7xDj45jFQkDPwdUnPKQhEpEfqWuFTm+Gn77SfNioPfj4dzi0b+Lqk9xQEItJtL9QG9wZs6uApke8bAb+YDmOGDHxd0jcKAhHpUtThu1vhC29CS9ItwvkWnAb6xHiIqEM4IykIROSIth+EqzfA3/a2nza9CO6dASeWDnxd0n8UBCLSqWXVcO0GqOmgQ/iGo+C7x0GxOoQznoJARNppbIPPvh48TD7ZyFz4yTS4cNTA1yWpoSAQkQSv1sFllbCuof20JcPhl9NhfMGAlyUplNJB58zsHDPbaGabzezWDqZPNLPHzOwlM3vFzD6QynpEpHPu8P+q4KQX2odArsE3JsPfTlAIDEYpOyIwsxzgTuBsoApYbWbL3L0ybrbbgAfc/S4zmwksByalqiYR6diuZvjYBli+p/20YwuCIaMXDh34umRgpPKIYCGw2d3fcPdmYClwftI8Dhx6ew0DOjgjKSKp9Jc9cPzqjkPg6gp4aYFCYLBLZR/BOGBr3Osq4OSkeb4M/NXM/gkoBs5KYT0iWccdnquFb2+F5TXQyGIKnwju/P3EOPj9bvjetvbLDc2BH02FyyoGvmYZeOae/AC5flqx2cXAOe5+fez1lcDJ7n5z3Dz/HKvhO2b2LuCnwGx3jyat6wbgBoCKior5S5cuTUnNqVZXV0dJSUnYZWQs7b+eacX4BtN5mnIOYnjcCQAjChhO+zvAZrGf21jPGDoYTzpkm7Y0h7r9kcVN7KkPr5Nk6sTej+N9+umnv+DuCzqalsojgm3AhLjX42Nt8a4DzgFw92fMrAAoBxIea+HudwN3AyxYsMCXLFmSopJTa8WKFWRq7elA+6/73INnA6yqhqZoB9M7OCscAb54NNx29DByI4tSX2Qv3H7TllC3f+miDSxdNT207T961cSUrDeVfQSrgSlmNtnM8oFLgWVJ82wBzgQwsxlAAbA7hTWJZIXnauFP1dDQQQh0pCIPHp8LX54MuXqAbdZJ2Z/c3VuBm4G/AOsJrg5aZ2a3m9l5sdk+A/yjmb0M3Adc46k6VyWSRb6zFRq7GQIApwyDdw9PWTmS5lJ6Q5m7Lye4JDS+7UtxP1cCp6ayBpF0ccYAntZ4/B/GE+3BV/sH34lyxg+rUlhR4NEfpubUhvSNDgJFBqFoTs+GAe3p/DK4KAhEBqFIW8/OsPZ0fhlcFAQig1Dpnubg0qHuiDpl2zt40oxkDQWByCCzd9QQDozMB+ve6Z5I1Jm4qTbFVUk6UxCIDCL7y/J59d2j8G52FEdao5RvawyOICRraRhqkUHiwIh8Xn7PaNryEkPA2hw3Ep8jGXUiUad8WyMznqvp4P5iySYKApFBoHZ4Hi8vHk1bfmIITH5lLyN3HWTL1FJqxhbiOYa1BX0CEzfWMnSvjgREQSCS8eqGBSHQmhQCk9buY9KG4Nz/7FU1QPhDJEh6Uh+BSAarL81lzeLRtAxJfHDw0ZX7mVR5IKSqJNMoCEQyVENJLmuWjKalIDEEJmw4wOS1+3XeX7pNQSCSgRqLc1izZDTNhYlnd8dvquXYV/YpBKRHFAQiGaapKIc1Syo4WJQYAmNfr+W4NXsVAtJjCgKRDHKwMIc1i0fTVJwYAmPerGPqCwoB6R0FgUiGOFgQYc3i0TSW5iW0V7xdz/Tn9ygEpNcUBCIZoHlIhJcXj6ZhaGIIjNpaz/TnajCNGSd9oCAQSXMt+RFePm009cMSn1dbvq2BmatqiCgEpI8UBCJprCXPePm0UdSNSAyBkdsbmfVMtUJA+oWCQCRNteYar7xnNLUjhyS0j3inkdlP7ybSg0dRihyJgkAkDbXlGK+8ZxQHyhNDYPiuJuasrCZHISD9SEEgkmbacoxX3j2K/aMKEtqH7W5izlO7ydHTxKSfKQhE0khbBNaeUs6+isQQKK05yPFP7ia3VSEg/U9BIJImohFYd8oo9hxVmNBesreZE57YpRCQlFEQiKSBqMG6ReXUjE0MgeJ9zcx9fBd5LQoBSR0FgUjIogbrTy6jenxRQnvR/lgINKtnWFJLQSASIjfYcFIZuyYWJ7QX1rYw9/Fd5B9UCEjqKQhEQuLAxvkj2TkpMQQK6lqYu2IXQ5oUAjIwFAQiIXBg07wR7DimJKF9SH0rJ67YRUFjWziFSVZSEIgMMAc2zx3O9uNKE9qHNMRCoEEhIANLQSAygBx44/jhVE0dmtCe39jG3Md3UVjfGk5hktUUBCID6M1Zw9gyPTEE8pramPv4TopqFQISDgWByAB5a8ZQ3p41LKEt92BwJFB8QCEg4VEQiAyAb2+BN+cMT2jLbY4y9/FdlOxvCacokRgFgUiK/aAKbnkjsS2nJcrxT+yidJ9CQMKnIBBJoR9vh09uTmzLaYly/JO7GbanOZyiRJIoCERS5Oc74MZNiW2R1ihzntrN8OqD4RQl0gEFgUgK/OoduG5jYpu1OXNWVjNit0JA0ktu2AWIDDYP7IKrNwT3DBySZzD96d2M3NkUWl0indERgUg/+uNuuLwS4kcJyjV4YCaU71AISHpSEIj0kz/XwIcrIX6AiAhw7wy4YFRYVYl0TUEg0g/+ugcuWgvxz48x4J4ZcMno0MoS6RYFgUgfrdgL56+Fg0kPEfvJNLiiIpyaRHpCQSDSByv3wwdfheRHB9w1Ba49KpyaRHpKQSDSS88egPe/AvVJIfD94+DGceHUJNIbKQ0CMzvHzDaa2WYzu7WTeT5sZpVmts7M7k1lPSL95YVaeN/LUJv06ID/PAY+MT6cmkR6K2X3EZhZDnAncDZQBaw2s2XuXhk3zxTg88Cp7r7XzNStJmnv5Tp478uwPykEvjoZPjsxnJpE+iKVRwQLgc3u/oa7NwNLgfOT5vlH4E533wvg7rtSWI9In1XWw1kvw56kUaO/eDT869Hh1CTSV+buXc/VmxWbXQyc4+7Xx15fCZzs7jfHzfNHYBNwKpADfNndH+pgXTcANwBUVFTMX7p0aUpqTrW6ujpKSkq6nlE6FPb+20ohn2IuexiS0H4pW7iBN7Ault+0JfxB5kYWN7GnviC07U+dmN+n5cPeh5m8/04//fQX3H1BR9PCHmIiF5gCLAHGA0+Y2Rx33xc/k7vfDdwNsGDBAl+yZMnAVtlPVqxYQabWng7C3H+vN8JHX4LkAUM/OQ6+d9xEzLo+J3T7TVtSVF33XbpoA0tXTQ9t+49e1bdzZ2Hvw0zff51J5amhbcCEuNfjY23xqoBl7t7i7m8SHB1MSWFNIj32dhOcsQa2JYXA/zcWvnccWFeHAiJpLpVBsBqYYmaTzSwfuBRYljTPHwmOBjCzcmAqkPQID5HwVMVCYEvSgKHXjYE7pigEZHBI2akhd281s5uBvxCc//+Zu68zs9uB5919WWzae82skmCIllvcvSZVNUnfnBH6YXnzgJ4aOFgQ4aXTK2gszUtov7ICfjwNIgoBGSRS2kfg7suB5UltX4r72YF/jv0TSRvNQyKsWdw+BD4yCn42DXIUAjKI6M5ikSQt+RHWLB5Nw7DEELiwHH45A3L1f40MMnpLi8RpyTPWnDaa+uGJl+mVbW9k6UzI0/8xMgjpbS0S05prvHzaaOpGJobAiHcamfX0bvL1f4sMUnprixCEwCvvGUVtWeLNYsN3NjFnZTU50U4WFBkEFASS9dpyjFffPYr9oxLvGB22u4njn9pNTltq7r4XSRcKAslqbRF49dRy9o1ODIGh1Qc5/kmFgGSHHgWBmRXHRhUVyXjRCKw9ZRR7xxQmtJfuOcjxT+4it1UhINnhiEFgZhEzu9zM/mxmu4ANwI7Y8wP+08yOG5gyRfpX1GDdu8rZMzYxBEr2NnPCE7vJa1EISPbo6ojgMeBYgmcGjHH3Ce4+Gng3sAr4ppl9NMU1ivSrqEHlojKqxxUltBfvb+aEJ3aR16yeYckuXd1ZfJa7tyQ3uvse4HfA78wsr/1iIunJDTYsLGP3hOKE9sIDLZzw+C7yDyoEJPsc8YjgUAiY2VnJ08zs6vh5RNKdAxsWjGTn0UkhUNvCiY/vYkjyE+hFskR3O4u/ZGZ3xTqLK8zsT8CHUlmYSH9yYNP8EbwzOfHBNgX1rcx9fBdDGts6XlAkC3Q3CBYDrwNrgKeAe9394lQVJdKfHHjtxBFsP7Y0oX1IQytzV+ykoEEhINmtu0EwguAZxK8DB4GjzTQSu6Q/B14/fjjbpiSGQH5jK3NX7KKwXiEg0t0gWAU85O7nACcBY4GVKatKpJ+8OXsYW6cPTWjLa2pj7opdFNW1drKUSHbp7vMIznL3LQDu3gh8wsxOS11ZIn331syhvD1zWEJb3sE25j6+i+JahYDIIV3dUDYJ4FAIxHP3JywwPkW1ifTa29NKeXP28IS23OYoJzy+i5L9utBNJF5XRwT/aWYR4EHgBWA3UAAcB5wOnAn8G8FD6EXSwtYppbxxwoiEtpyWKCc8sYvSfQoBkWRHDAJ3v8TMZgJXANcCY4BGYD3BIyi/5u5NKa9SpJu2HVvC5hM7DoGhe5pDqkokvXXZWezulcBXgT8RBMCbwGrgtwoBSSfbJxezaf7IhLZIa5Q5T+1mWI1CQKQz3e0s/h/gAPCD2OvLgXuAD6eiKJGeeufoYjYuSAqBNmfOU7sZsftgSFWJZIbuBsFsd58Z9/oxM6tMRUEiPbVzQhHrTxoJcbe2WJsze+VuRu5SCIh0pbv3EbxoZosOvTCzk4HnU1OSSPftHlfI+pPLIBIXAlFn9jPVlL2jM5ci3dHdI4L5wNNmdugy0onARjN7FXB3Pz4l1YkcQfVRBaxbVI4nhcDMVdWUb28MsTKRzNLdIDgnpVWI9FBNRQFrTxmF58SNdOLOjOdqGF2lEBDpiW4Fgbu/nepCRJI5cGBkPlunDaXmqAIey5lAZKxTuqeZAyPzE0MAmL56DxVbGsIpViSDdfeIQGRARQ3WLyyjelwh0Ygd7gOI5hr7Rw1J6BgGmPZ8DUe9VR9GqSIZT0EgaceJC4HcDq5nSAqB417cw9g3FAIivdXdq4ZEBsyBkfmdh0ASa3OG6Y5hkT5REEja2Tq1NDgd1A1usGVqadczikinFASSdmrGFibcF3BEEQvmF5FeUxBI2onm9Ozhdz2dX0QSKQgk7UTaPKXzi0giBYGknbLtjRDt5od71IP5RaTXFASSdsq3N0J3uwiizsRNtaktSGSQUxBIWmnJj/DG7GHt7hXoSKQ1Svm2Rkp1+ahInygIJG24wbpFZRwsyUuckHyaKOqHQ2DGczXdPXgQkU7ozmJJG2/MGc7eMYmXgpZX1WPR4JJSzzGsLegTmLixlqF7dSQg0h8UBJIWdk4oYsv0oQltQ6sPMmtVDZFo8PrSRRtYump6CNWJDG46NSShqx2ex4aTEh8zmd/Qyuyndx8OARFJHQWBhKo5P8LaU0cljCtkbc7sp6sZ0qQUEBkICgIJTdRg3bvKaSpOPEM57YU9GkhOZAClNAjM7Bwz22hmm83s1iPMd5GZuZktSGU9kl5eP344+yoKEtrGvVar5wqIDLCUBYGZ5QB3Au8HZgKXmdnMDuYrBT4JPJuqWiT9vHN0EVXTEjuHh+1q4rg1e0OqSCR7pfKIYCGw2d3fcPdmYClwfgfz/TvwTaAphbVIGjkwIp+NC8oS2oY0tDL7mWoiGjZIZMClMgjGAVvjXlfF2g4zs3nABHf/cwrrkDTSPCTC2lPLE0YMjbRGmbNyN/kH1TksEobQ7iMwswjwXeCabsx7A3ADQEVFBStWrEhpbalSV1eXsbUDXLqobx24bRjfGz2fgwWJb7ur961j0bQdXS4/sriJSxdt6FMNfbFixRt9Wr6v+68/aB/2Tabvv86Ye2qOxc3sXcCX3f19sdefB3D3b8ReDwNeB+pii4wB9gDnufvzna13wYIF/vzznU5OaytWrGDJkiVhl9FrZ9y0pU/LbzpxBNumJD5NbPzGA0x5eV+3lg/7hrJHfzixT8v3df/1B+3Dvsnk/WdmL7h7hxfkpPLU0GpgiplNNrN84FJg2aGJ7r7f3cvdfZK7TwJW0UUISObaMbm4XQgM39nEsa/sC6cgETksZUHg7q3AzcBfgPXAA+6+zsxuN7PzUrVdST/7R+azcV7incMF9a3MUuewSFpIaR+Buy8Hlie1famTeZekshYJx8GCCGtPKceTOodnr9xNfrM6h0XSge4slpSJRmDtKaNoLkr8vjF99R5K97WEVJWIJFMQSMq8duIIDpQPSWibuOEAFVsbQqpIRDqiIJCU2HZMCduPTewcHvFOI8e8ui+cgkSkUwoC6Xf7yvJ57cQRCW0FdS3MWlWDqXNYJO0oCKRfHSzMYd0poxI6h3NaosxZWU2eOodF0pKCQPpNWwRePaWc5sKchPbpz9VQsl+dwyLpSkEg/cKBTfNHUluW2Dl8dOV+Rm9rDKcoEekWBYH0i23HlfDO5JKEtrLtjUxetz+kikSkuxQE0md7Rw1h89zEzuHC2hZmPFutzmGRDKAgkD5pKsph3bvK8UhS5/BTu8lrUQqIZAIFgfRaW47x6imjaClI7Bye8WwNxbWtIVUlIj2lIJBecWDj/JHUjcxPaJ+0dh+jtqtzWCSTKAikV6qmlrJzUnFCW/m2BiZVHgipIhHpLQWB9Nie0UPYfPzwhLai/S3MeLYG63gREUljCgLpkcbiHCrfVQ5xncO5zcEzh3Nb1TkskokUBNJtbTnG2lNG0TIkrnPYnRnPVlNUp85hkUylIJBucYcNJ42kbkRi5/Dktfsp39EUUlUi0h8UBNIt/7kVdk1M7BwetbWBo9erc1gk0ykIpEsP1cCtbyS2Fe9rZvpqdQ6LDAYKAjmizQ1w2frgvoFDcg+2MWdltTqHRQYJBYF0qq4VLlgL++L7gaPOrFU1FNarc1hksFAQSIfc4eoNsC7p8cLHvrqPkTvVOSwymCgIpENf3wK/r05sG72lngkba8MpSERSJjfsAiT9/G81fPHNxLa5JTB09R51DosMQjoikAQbG+CKpM7hslz4wyzIaVPnsMhgpCCQww7EOocPtP29LQd4YBZMKgytLBFJMQWBABB1uHI9bEjqHP72sXDGiI6XEZHBQUEgANz+FiyrSWy7sgI+OT6UckRkACkIhD/uhq+8ndg2vwR+PBVMvcMig56CIMtV1sOVGxLbRuXBH2ZDYU7Hy4jI4KIgyGL7WuD8tVAX1zmca/DbWTChILy6RGRgKQiyVJvD5ethc9Ljhf/rODhteCgliUhIFARZ6ktvwv/tSWy7dgzcNDacekQkPAqCLPSbXcEQEvFOLoU7p6hzWCQbKQiyzCt1cE1S5/CYfPjdbChQ57BIVlIQZJE9LcGdww3Rv7flGfxuFowbEl5dIhIuBUGWaI3CpZXwZtII0ndOgVOGhVOTiKQHBUGW+Pyb8PDexLaPHwX/qM5hkaynIMgC9+2Eb29NbDt1KPxgSjj1iEh6URAMci/VwnUbE9vG5gc3jeXrry8iKAgGtd3NQedwY1zncL4Fw0eMUeewiMQoCAaplih8pBK2HExs/9FUWDg0nJpEJD0pCAapW16Hx/Yltv3TOPjYUaGUIyJpLKVBYGbnmNlGM9tsZrd2MP2fzazSzF4xs0fM7OhU1pMt7nkHvr8tsW3xMPjOseHUIyLpLWVBYGY5wJ3A+4GZwGVmNjNptpeABe5+PPBb4FupqidbPH8AbkjqHJ4wJHjcZJ6O/0SkA6n8aFgIbHb3N9y9GVgKnB8/g7s/5u6HHo64CtDzsPpgZzNcuA4Oxj1jviASdA6Pzg+vLhFJb6kMgnFA/NXrVbG2zlwH/F8K6xnUmqNw8TqoSuoc/u+pML80nJpEJDOYu3c9V29WbHYxcI67Xx97fSVwsrvf3MG8HwVuBha7+8EOpt8A3ABQUVExf+nSpSmpOdXq6uooKSlJybr/iyk8mJSzl7CVm3i937axaUtzv62rN0YWN7GnPrwn5kyd2LfDqrD3H2gf9lUm77/TTz/9BXdf0NG03F6vtWvbgAlxr8fH2hKY2VnAv9JJCAC4+93A3QALFizwJUuW9HuxA2HFihWkovaf7oAHk/oFzhwO9x4/gdzIhA6X6Y3bb9rS9UwpdOmiDSxdNT207T961cQ+LR/2/gPtw77K9P3XmVSeGloNTDGzyWaWD1wKLIufwcxOBH4MnOfuu1JYy6C1aj/ctCmxbVIBLJ0JueocFpFuSNlHhbu3Epzu+QuwHnjA3deZ2e1mdl5stv8ESoDfmNkaM1vWyeqkAzsOwj+sg+a4s3uFEfjjbChX57CIdFMqTw3h7suB5UltX4r7+axUbn8wOxiFi9bBjqRTpj+fDiekphtCRAYpnTzIQO5w82vwzIHE9s9NgI+MDqcmEclcCoIM9OPt8JMdiW3vGwFfOyacekQksykIMsxT++CfNie2HVsA982EHD14XkR6QUGQQaqagpvGWuM6h4tjncMj8sKrS0Qym4IgQzS1BVcI7WxJbL9nBsxW57CI9IGCIAO4w42bYHVtYvttR8M/jAqnJhEZPBQEGeCObfA/OxPbPlgGX5kUSjkiMsgoCNLcir3w6aTO4WmF8KsZEFHnsIj0AwVBGnu7CS6phLa4ttKcoHN4WEpvBRSRbKIgSFMNbXDhWqhO6hz+1QyYXhxOTSIyOCkI0pB78JSxl+oS278yCc4rD6UkERnEFARp6HtV8OuksVgvKA+uEhIR6W8KgjTztz1wS9KzZGYWwT3T1TksIqmhIEgjbzTCRyohGtc2LNY5XKrOYRFJEQVBmqhvgwvWwp7Wv7cZcO9MmFIUWlkikgUUBGnAHa7dAK/WJ7Z/bTJ8oCycmkQkeygI0sC3tsIDuxPbLh4Ft6bm8aQiIgkUBCF7qAY+/0Zi25xi+Pk0MHUOi8gAUBCE6LUGuGw9xI0qzYjcoHO4RJ3DIjJAFAQhqW0NOof3xXUOR4D7Z8IxhaGVJSJZSEEQgqjD1RugsiGx/ZvHwNkjw6lJRLKXTkCkkDs8Vwvf3grLa6CRxRQ+AZMLYF1SCFw2Gj4zIZw6RSS7KQhSpCUKV22AZdXQFD10k5jREG0fAnNL4CfqHBaRkCgIUsD97yHQED3yvPkGf5gFRTkDU5uISDL1EaTAc7Xwp26EAAR/gF0tXc4mIpIyCoIU+M5WaOxGCAA0ezC/iEhYFAQp8OeaxIHjjiQam19EJCwKghTo7tFAb+cXEelPCoIUKOzhXu3p/CIi/UkfQSlwbln3d2wkNr+ISFgUBCnwmQnd/5ZfENGNZCISLgVBCiwshQ+Vdx0GhZHgYfQnlQ5MXSIiHVEQpIBZ8Izh88uhONJ+J0eAokgw/Z7puqNYRMKlIEiRvAjcOwMenQsXjQoCwXCKI8FDZ1bMhftmBvOJiIRJQ0ykkBksHAoPzAper1jxOEtOWxJqTSIiyfR9VEQkyykIRESynIJARCTLKQhERLKcgkBEJMspCEREspyCQEQkyykIRESyXEqDwMzOMbONZrbZzG7tYPoQM7s/Nv1ZM5uUynpERKS9lN1ZbGY5wJ3A2UAVsNrMlrl7Zdxs1wF73f04M7sU+CbwkVTVdMZNW1K16m65dFEzt4dYw6M/nBjatkUkfaXyiGAhsNnd33D3ZmApcH7SPOcD/xP7+bfAmWYagk1EZCClMgjGAfGPZa+KtXU4j7u3AvsBPaZFRGQAmbunZsVmFwPnuPv1sddXAie7+81x86yNzVMVe/16bJ7qpHXdANwQezkN2JiSolOvHKjuci7pjPZf32kf9k0m77+j3X1URxNSOfroNiD+2VvjY20dzVNlZrnAMKAmeUXufjdwd4rqHDBm9ry7Lwi7jkyl/dd32od9M1j3XypPDa0GppjZZDPLBy4FliXNswy4OvbzxcCjnqpDFBER6VDKjgjcvdXMbgb+AuQAP3P3dWZ2O/C8uy8Dfgr80sw2A3sIwkJERAZQSh9M4+7LgeVJbV+K+7kJuCSVNaSZjD+9FTLtv77TPuybQbn/UtZZLCIimUFDTIiIZDkFwQDpargN6ZyZ/czMdsUuN5YeMrMJZvaYmVWa2Toz+2TYNWUSMysws+fM7OXY/vtK2DX1N50aGgCx4TY2ETfcBnBZ0nAb0gkzOw2oA+5x99lh15NpzOwo4Ch3f9HMSoEXgAv0/uue2GgHxe5eZ2Z5wFPAJ919Vcil9RsdEQyM7gy3IZ1w9ycIriqTXnD3He7+YuznWmA97e/yl054oC72Mi/2b1B9g1YQDIzuDLchknKxEX5PBJ4NuZSMYmY5ZrYG2AU87O6Dav8pCESyhJmVAL8DPuXuB8KuJ5O4e5u7zyUYIWGhmQ2qU5QKgoHRneE2RFImdm77d8Cv3f33YdeTqdx9H/AYcE7IpfQrBcHA6M5wGyIpEevs/Cmw3t2/G3Y9mcbMRpnZ8NjPhQQXfWwItah+piAYALEhtg8Nt7EeeMDd14VbVeYws/uAZ4BpZlZlZteFXVOGORW4EjjDzNbE/n0g7KIyyFHAY2b2CsGXuofd/X9Drqlf6fJREZEspyMCEZEspyAQEclyCgIRkSynIBARyXIKAhGRLKcgEBHJcgoCEZEspyAQ6SMzO8nMXomNW18cG7N+UI1FI4ObbigT6Qdm9lWgACgEqtz9GyGXJNJtCgKRfhAbQ2o10ASc4u5tIZck0m06NSTSP8qAEqCU4MhAJGPoiECkH5jZMoInz00meCzkzSGXJNJtuWEXIJLpzOwqoMXd7409n/ppMzvD3R8NuzaR7tARgYhIllMfgYhIllMQiIhkOQWBiEiWUxCIiGQ5BYGISJZTEIiIZDkFgYhIllMQiIhkuf8fM7OXxTsxRaMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot the CDF of the resulting distribution against the target distribution, i.e. log-normal\n", "log_normal = np.random.lognormal(mean=1, sigma=1, size=100000)\n", "log_normal = np.round(log_normal)\n", "log_normal = log_normal[log_normal <= bounds[1]]\n", "temp = []\n", "for i in range(int(bounds[1] + 1)):\n", " temp += [np.sum(log_normal == i)]\n", "log_normal = np.array(temp / sum(temp))\n", "\n", "plt.figure(figsize=(6, 5))\n", "plt.title(\"CDF (Cumulative Distribution Function)\")\n", "samples_g, prob_g = qgan.generator.get_output(qgan.quantum_instance, shots=10000)\n", "samples_g = np.array(samples_g)\n", "samples_g = samples_g.flatten()\n", "num_bins = len(prob_g)\n", "plt.bar(samples_g, np.cumsum(prob_g), color=\"royalblue\", width=0.8, label=\"simulation\")\n", "plt.plot(\n", " np.cumsum(log_normal), \"-o\", label=\"log-normal\", color=\"deepskyblue\", linewidth=4, markersize=12\n", ")\n", "plt.xticks(np.arange(min(samples_g), max(samples_g) + 1, 1.0))\n", "plt.grid()\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"p(x)\")\n", "plt.legend(loc=\"best\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2019-08-22T01:49:13.439275Z", "start_time": "2019-08-22T01:49:13.430311Z" } }, "outputs": [ { "data": { "text/html": [ "

Version Information

Qiskit SoftwareVersion
QiskitNone
Terra0.17.0.dev0+346ffa8
Aer0.8.0
Ignis0.6.0.dev0+d6f1ad7
AquaNone
IBM Q Provider0.13.0.dev0+10f19e0
System information
Python3.8.8 (default, Feb 24 2021, 13:46:16) \n", "[Clang 10.0.0 ]
OSDarwin
CPUs6
Memory (Gb)16.0
Wed Mar 31 23:30:54 2021 CEST
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import qiskit.tools.jupyter\n", "\n", "%qiskit_version_table\n", "%qiskit_copyright" ] } ], "metadata": { "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.9" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }