├── .ipynb_checkpoints ├── Categorical VAE-checkpoint.ipynb └── Gumbel-softmax visualization-checkpoint.ipynb ├── Categorical VAE.ipynb ├── Gumbel-softmax visualization.ipynb └── README.md /.ipynb_checkpoints/Categorical VAE-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from torchvision import datasets, transforms" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import torch\n", 19 | "import torch.nn as nn\n", 20 | "from torch.optim import Adam\n", 21 | "import torch.nn.functional as F\n", 22 | "from torch.distributions import kl_divergence\n", 23 | "import numpy as np" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 3, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "device = 'cuda' if torch.cuda.is_available() else 'cpu'" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "# Data" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 4, 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "train_loader = torch.utils.data.DataLoader(\n", 49 | " datasets.MNIST('../data', train=True, download=False,\n", 50 | " transform=transforms.Compose([\n", 51 | " transforms.ToTensor(),\n", 52 | "# transforms.Normalize((0.1307,), (0.3081,))\n", 53 | " ])),\n", 54 | " batch_size=100, shuffle=True)\n", 55 | "\n", 56 | "\n", 57 | "test_loader = torch.utils.data.DataLoader(\n", 58 | " datasets.MNIST(root='../data', train=False, download=False,\n", 59 | " transform=transforms.Compose([\n", 60 | " transforms.ToTensor(),\n", 61 | "# transforms.Normalize((0.1307,), (0.3081,))\n", 62 | " ])),\n", 63 | " batch_size=1, shuffle=True)\n" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "# Network" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 5, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [ 79 | "def sample_gumbel(shape, eps=1e-20):\n", 80 | " unif = torch.rand(*shape).to(device)\n", 81 | " g = -torch.log(-torch.log(unif + eps))\n", 82 | " return g\n", 83 | "\n", 84 | "def sample_gumbel_softmax(logits, temperature):\n", 85 | " \"\"\"\n", 86 | " Input:\n", 87 | " logits: Tensor of log probs, shape = BS x k\n", 88 | " temperature = scalar\n", 89 | " \n", 90 | " Output: Tensor of values sampled from Gumbel softmax.\n", 91 | " These will tend towards a one-hot representation in the limit of temp -> 0\n", 92 | " shape = BS x k\n", 93 | " \"\"\"\n", 94 | " g = sample_gumbel(logits.shape)\n", 95 | " h = (g + logits)/temperature\n", 96 | " h_max = h.max(dim=-1, keepdim=True)[0]\n", 97 | " h = h - h_max\n", 98 | " cache = torch.exp(h)\n", 99 | " y = cache / cache.sum(dim=-1, keepdim=True)\n", 100 | " return y" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 14, 106 | "metadata": {}, 107 | "outputs": [], 108 | "source": [ 109 | "class VAE(nn.Module):\n", 110 | " def __init__(self):\n", 111 | " super().__init__()\n", 112 | " self.temperature = 1.\n", 113 | " self.K = 10\n", 114 | " self.N = 30\n", 115 | " self.create_encoder()\n", 116 | " self.create_decoder()\n", 117 | " \n", 118 | " def create_encoder(self):\n", 119 | " \"\"\"\n", 120 | " Input for the encoder is a BS x 784 tensor\n", 121 | " Output from the encoder are the log probabilities of the categorical distribution\n", 122 | " \"\"\"\n", 123 | " self.encoder = nn.Sequential(\n", 124 | " nn.Linear(784, 100),\n", 125 | " nn.ReLU(),\n", 126 | " nn.Linear(100, self.K*self.N)\n", 127 | " )\n", 128 | " \n", 129 | " def create_decoder(self):\n", 130 | " \"\"\"\n", 131 | " Input for the decoder is a BS x N*K tensor\n", 132 | " Output from the decoder are the log probabilities of the bernoulli pixels\n", 133 | " \"\"\"\n", 134 | " self.decoder = nn.Sequential(\n", 135 | " nn.Linear(self.N*self.K, 256),\n", 136 | " nn.ReLU(),\n", 137 | " nn.Linear(256, 512),\n", 138 | " nn.ReLU(),\n", 139 | " nn.Linear(512, 784),\n", 140 | " nn.LogSoftmax(dim=-1)\n", 141 | " )\n", 142 | " \n", 143 | " def sample(self, img):\n", 144 | " with torch.no_grad():\n", 145 | " logits_z = self.encoder(img)\n", 146 | " latent_vars = sample_gumbel_softmax(logits_z, self.temperature)\n", 147 | " logits_x = self.decoder(latent_vars)\n", 148 | " dist_x = torch.distributions.Bernoulli(logits=logits_x)\n", 149 | " sampled_img = dist_x.sample((1,))\n", 150 | " \n", 151 | " return sampled_img.cpu().numpy()\n", 152 | " \n", 153 | " def forward(self, img, anneal=1.):\n", 154 | " \"\"\"\n", 155 | " Input: \n", 156 | " img: Tensor of shape BS x 784\n", 157 | " \"\"\"\n", 158 | " # Encoding\n", 159 | " logits_nz = self.encoder(img)\n", 160 | " logits_z = F.log_softmax(logits_nz.view(-1, self.N, self.K), dim=-1)\n", 161 | " posterior_dist = torch.distributions.Categorical(logits=logits_z)\n", 162 | " prior_dist = torch.distributions.Categorical(probs=torch.ones_like(logits_z)/self.K)\n", 163 | " \n", 164 | " # Sampling\n", 165 | " latent_vars = sample_gumbel_softmax(logits_z, self.temperature).view(-1, self.N*self.K)\n", 166 | " \n", 167 | " # Decoding\n", 168 | " logits_x = self.decoder(latent_vars)\n", 169 | " dist_x = torch.distributions.Bernoulli(logits=logits_x)\n", 170 | "\n", 171 | " # Losses\n", 172 | " ll = dist_x.log_prob(img).sum(dim=-1)\n", 173 | "# kl1 = posterior_dist.probs * (logits_z - torch.log(torch.ones_like(logits_z)/self.K))\n", 174 | " kl = kl_divergence(posterior_dist, prior_dist).sum(-1)\n", 175 | " assert torch.all(kl > 0)\n", 176 | " assert torch.all(ll < 0)\n", 177 | " elbo = ll - kl\n", 178 | " loss = -elbo.mean()\n", 179 | " return loss" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 23, 185 | "metadata": {}, 186 | "outputs": [], 187 | "source": [ 188 | "def train(model, optimizer, maxiters):\n", 189 | " iters = 0\n", 190 | " while iters < maxiters:\n", 191 | " for batch_idx, (data, target) in enumerate(train_loader):\n", 192 | " iters+=1\n", 193 | "# anneal = min(1., epoch*.1)\n", 194 | " optimizer.zero_grad()\n", 195 | " data = data.to(device)\n", 196 | " loss = model(data.view(-1, 28*28))\n", 197 | " # neg_elbo = -elbo\n", 198 | " loss.backward()\n", 199 | " optimizer.step()\n", 200 | " if iters % 100 == 0:\n", 201 | " print('Train Iteration: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n", 202 | " iters, batch_idx * len(data), len(train_loader.dataset),\n", 203 | " 100. * batch_idx / len(train_loader), loss.item()))" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 24, 209 | "metadata": { 210 | "scrolled": true 211 | }, 212 | "outputs": [ 213 | { 214 | "name": "stdout", 215 | "output_type": "stream", 216 | "text": [ 217 | "> (64)forward()\n", 218 | "-> ll = dist_x.log_prob(img).sum(dim=-1)\n", 219 | "(Pdb) q\n" 220 | ] 221 | }, 222 | { 223 | "ename": "BdbQuit", 224 | "evalue": "", 225 | "output_type": "error", 226 | "traceback": [ 227 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 228 | "\u001b[0;31mBdbQuit\u001b[0m Traceback (most recent call last)", 229 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVAE\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0moptimizer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mAdam\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1e-3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmaxiters\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m5000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 230 | "\u001b[0;32m\u001b[0m in \u001b[0;36mtrain\u001b[0;34m(model, optimizer, maxiters)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzero_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m28\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m28\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;31m# neg_elbo = -elbo\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 231 | "\u001b[0;32m~/anaconda3/envs/hpp/lib/python3.7/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 487\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 488\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 489\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 490\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 232 | "\u001b[0;32m\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, img, anneal)\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpdb\u001b[0m\u001b[0;34m;\u001b[0m \u001b[0mpdb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_trace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0;31m# Losses\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 64\u001b[0;31m \u001b[0mll\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdist_x\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog_prob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 65\u001b[0m \u001b[0;31m# kl1 = posterior_dist.probs * (logits_z - torch.log(torch.ones_like(logits_z)/self.K))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[0mkl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkl_divergence\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mposterior_dist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprior_dist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 233 | "\u001b[0;32m\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, img, anneal)\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpdb\u001b[0m\u001b[0;34m;\u001b[0m \u001b[0mpdb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_trace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0;31m# Losses\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 64\u001b[0;31m \u001b[0mll\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdist_x\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog_prob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 65\u001b[0m \u001b[0;31m# kl1 = posterior_dist.probs * (logits_z - torch.log(torch.ones_like(logits_z)/self.K))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[0mkl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkl_divergence\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mposterior_dist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprior_dist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 234 | "\u001b[0;32m~/anaconda3/envs/hpp/lib/python3.7/bdb.py\u001b[0m in \u001b[0;36mtrace_dispatch\u001b[0;34m(self, frame, event, arg)\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;31m# None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mevent\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'line'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 88\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 89\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mevent\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'call'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 235 | "\u001b[0;32m~/anaconda3/envs/hpp/lib/python3.7/bdb.py\u001b[0m in \u001b[0;36mdispatch_line\u001b[0;34m(self, frame)\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop_here\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbreak_here\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muser_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 113\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquitting\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mBdbQuit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 114\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrace_dispatch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", 236 | "\u001b[0;31mBdbQuit\u001b[0m: " 237 | ] 238 | } 239 | ], 240 | "source": [ 241 | "model = VAE().to(device)\n", 242 | "optimizer = Adam(model.parameters(), lr=1e-3)\n", 243 | "train(model, optimizer, maxiters=5000)" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": null, 249 | "metadata": {}, 250 | "outputs": [], 251 | "source": [ 252 | "import matplotlib.pyplot as plt" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": null, 258 | "metadata": {}, 259 | "outputs": [], 260 | "source": [ 261 | "for batch_idx, (data, target) in enumerate(test_loader):\n", 262 | " img_flat = model.sample(data.view(-1, 28*28).to(device))\n", 263 | " plt.imshow(img_flat.reshape(28,28))\n", 264 | " plt.show()\n", 265 | " plt.imshow(data.reshape(28,28))\n", 266 | " break" 267 | ] 268 | }, 269 | { 270 | "cell_type": "code", 271 | "execution_count": 38, 272 | "metadata": {}, 273 | "outputs": [ 274 | { 275 | "data": { 276 | "text/plain": [ 277 | "torch.Size([1, 1, 28, 28])" 278 | ] 279 | }, 280 | "execution_count": 38, 281 | "metadata": {}, 282 | "output_type": "execute_result" 283 | } 284 | ], 285 | "source": [ 286 | "data.shape" 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": null, 292 | "metadata": {}, 293 | "outputs": [], 294 | "source": [] 295 | } 296 | ], 297 | "metadata": { 298 | "kernelspec": { 299 | "display_name": "Python 3", 300 | "language": "python", 301 | "name": "python3" 302 | }, 303 | "language_info": { 304 | "codemirror_mode": { 305 | "name": "ipython", 306 | "version": 3 307 | }, 308 | "file_extension": ".py", 309 | "mimetype": "text/x-python", 310 | "name": "python", 311 | "nbconvert_exporter": "python", 312 | "pygments_lexer": "ipython3", 313 | "version": "3.7.2" 314 | } 315 | }, 316 | "nbformat": 4, 317 | "nbformat_minor": 2 318 | } 319 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Gumbel-softmax visualization-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from torchvision import datasets, transforms" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 78, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import torch\n", 19 | "import torch.nn as nn\n", 20 | "from torch.optim import SGD\n", 21 | "import torch.nn.functional as F\n", 22 | "\n", 23 | "import numpy as np" 24 | ] 25 | }, 26 | { 27 | "cell_type": "markdown", 28 | "metadata": {}, 29 | "source": [ 30 | "# Data" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 3, 36 | "metadata": {}, 37 | "outputs": [], 38 | "source": [ 39 | "train_loader = torch.utils.data.DataLoader(\n", 40 | " datasets.MNIST('../data', train=True, download=False,\n", 41 | " transform=transforms.Compose([\n", 42 | " transforms.ToTensor(),\n", 43 | " transforms.Normalize((0.1307,), (0.3081,))\n", 44 | " ])),\n", 45 | " batch_size=20, shuffle=True)\n", 46 | "\n", 47 | "\n", 48 | "test_loader = torch.utils.data.DataLoader(\n", 49 | " datasets.MNIST(root='../data', train=False, download=False,\n", 50 | " transform=transforms.Compose([\n", 51 | " transforms.ToTensor(),\n", 52 | " transforms.Normalize((0.1307,), (0.3081,))\n", 53 | " ])),\n", 54 | " batch_size=1, shuffle=True)\n" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 28, 60 | "metadata": {}, 61 | "outputs": [], 62 | "source": [ 63 | "def sample_gumbel(n,k):\n", 64 | " unif = torch.distributions.Uniform(0,1).sample((n,k))\n", 65 | " g = -torch.log(-torch.log(unif))\n", 66 | " return g" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": 151, 72 | "metadata": {}, 73 | "outputs": [], 74 | "source": [ 75 | "def sample_gumbel_softmax(pi, n, temperature):\n", 76 | " k = len(pi)\n", 77 | " g = sample_gumbel(n, k)\n", 78 | " h = (g + torch.log(pi))/temperature\n", 79 | " h_max = h.max(dim=1, keepdim=True)[0]\n", 80 | " h = h - h_max\n", 81 | " cache = torch.exp(h)\n", 82 | "# print(pi, torch.log(pi), intmdt)\n", 83 | " y = cache / cache.sum(dim=-1, keepdim=True)\n", 84 | " return y" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 152, 90 | "metadata": {}, 91 | "outputs": [], 92 | "source": [ 93 | "import matplotlib.pyplot as plt" 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "# Probability Distribution" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 186, 106 | "metadata": {}, 107 | "outputs": [ 108 | { 109 | "data": { 110 | "text/plain": [ 111 | "(0, 1)" 112 | ] 113 | }, 114 | "execution_count": 186, 115 | "metadata": {}, 116 | "output_type": "execute_result" 117 | }, 118 | { 119 | "data": { 120 | "image/png": "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\n", 121 | "text/plain": [ 122 | "
" 123 | ] 124 | }, 125 | "metadata": { 126 | "needs_background": "light" 127 | }, 128 | "output_type": "display_data" 129 | } 130 | ], 131 | "source": [ 132 | "k = 10\n", 133 | "pi = torch.randint(high=100, size=(k,), dtype=torch.float)\n", 134 | "pi = pi/pi.sum()\n", 135 | "plt.bar(np.arange(k)+1, pi.numpy())\n", 136 | "plt.ylim(0,1)" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": {}, 142 | "source": [ 143 | "# Samples" 144 | ] 145 | }, 146 | { 147 | "cell_type": "markdown", 148 | "metadata": {}, 149 | "source": [ 150 | "## Gumbel-softmax" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 187, 156 | "metadata": { 157 | "scrolled": false 158 | }, 159 | "outputs": [ 160 | { 161 | "data": { 162 | "image/png": "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\n", 163 | "text/plain": [ 164 | "
" 165 | ] 166 | }, 167 | "metadata": { 168 | "needs_background": "light" 169 | }, 170 | "output_type": "display_data" 171 | } 172 | ], 173 | "source": [ 174 | "n = 1\n", 175 | "tau_vals = [0.01, 0.1, 0.5, 1, 5, 10]\n", 176 | "plt.figure(figsize=(16,8))\n", 177 | "for i in range(1, 7):\n", 178 | " plt.subplot(230+i)\n", 179 | " z = sample_gumbel_softmax(pi=pi, n=n, temperature=tau_vals[i-1])\n", 180 | " plt.bar(np.arange(k)+1, z.flatten().numpy())\n", 181 | " plt.title('Temperature: {}'.format(tau_vals[i-1]))\n", 182 | "# plt.ylim(0,1)" 183 | ] 184 | }, 185 | { 186 | "cell_type": "markdown", 187 | "metadata": {}, 188 | "source": [ 189 | "## Categorical" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": 189, 195 | "metadata": {}, 196 | "outputs": [ 197 | { 198 | "data": { 199 | "text/plain": [ 200 | "tensor([0.])" 201 | ] 202 | }, 203 | "execution_count": 189, 204 | "metadata": {}, 205 | "output_type": "execute_result" 206 | } 207 | ], 208 | "source": [ 209 | "z" 210 | ] 211 | }, 212 | { 213 | "cell_type": "code", 214 | "execution_count": 191, 215 | "metadata": {}, 216 | "outputs": [ 217 | { 218 | "data": { 219 | "text/plain": [ 220 | "" 221 | ] 222 | }, 223 | "execution_count": 191, 224 | "metadata": {}, 225 | "output_type": "execute_result" 226 | }, 227 | { 228 | "data": { 229 | "image/png": "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\n", 230 | "text/plain": [ 231 | "
" 232 | ] 233 | }, 234 | "metadata": { 235 | "needs_background": "light" 236 | }, 237 | "output_type": "display_data" 238 | } 239 | ], 240 | "source": [ 241 | "z = torch.distributions.Categorical(probs=pi).sample((n,)).float()\n", 242 | "one_hot = torch.zeros(n,k)\n", 243 | "one_hot[range(n),z.long()] = 1\n", 244 | "plt.bar(np.arange(k)+1, one_hot.mean(dim=0).numpy())\n", 245 | "# plt.ylim(0,1)" 246 | ] 247 | }, 248 | { 249 | "cell_type": "markdown", 250 | "metadata": {}, 251 | "source": [ 252 | "# Expectation" 253 | ] 254 | }, 255 | { 256 | "cell_type": "markdown", 257 | "metadata": {}, 258 | "source": [ 259 | "## Gumbel-softmax" 260 | ] 261 | }, 262 | { 263 | "cell_type": "code", 264 | "execution_count": 193, 265 | "metadata": { 266 | "scrolled": false 267 | }, 268 | "outputs": [ 269 | { 270 | "data": { 271 | "image/png": "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\n", 272 | "text/plain": [ 273 | "
" 274 | ] 275 | }, 276 | "metadata": { 277 | "needs_background": "light" 278 | }, 279 | "output_type": "display_data" 280 | } 281 | ], 282 | "source": [ 283 | "n = 1000\n", 284 | "tau_vals = [0.01, 0.1, 0.5, 1, 5, 10]\n", 285 | "plt.figure(figsize=(16,8))\n", 286 | "for i in range(1, 7):\n", 287 | " plt.subplot(230+i)\n", 288 | " z = sample_gumbel_softmax(pi=pi, n=n, temperature=tau_vals[i-1])\n", 289 | " plt.bar(np.arange(k)+1, z.mean(dim=0).numpy())\n", 290 | " plt.title('Temperature: {}'.format(tau_vals[i-1]))\n", 291 | "# plt.ylim(0,1)" 292 | ] 293 | }, 294 | { 295 | "cell_type": "markdown", 296 | "metadata": {}, 297 | "source": [ 298 | "## Categorical" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 194, 304 | "metadata": {}, 305 | "outputs": [ 306 | { 307 | "data": { 308 | "text/plain": [ 309 | "" 310 | ] 311 | }, 312 | "execution_count": 194, 313 | "metadata": {}, 314 | "output_type": "execute_result" 315 | }, 316 | { 317 | "data": { 318 | "image/png": "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\n", 319 | "text/plain": [ 320 | "
" 321 | ] 322 | }, 323 | "metadata": { 324 | "needs_background": "light" 325 | }, 326 | "output_type": "display_data" 327 | } 328 | ], 329 | "source": [ 330 | "z = torch.distributions.Categorical(probs=pi).sample((n,)).float()\n", 331 | "one_hot = torch.zeros(n,k)\n", 332 | "one_hot[range(n),z.long()] = 1\n", 333 | "plt.bar(np.arange(k)+1, one_hot.mean(dim=0).numpy())\n", 334 | "# plt.ylim(0,1)" 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "execution_count": null, 340 | "metadata": {}, 341 | "outputs": [], 342 | "source": [] 343 | } 344 | ], 345 | "metadata": { 346 | "kernelspec": { 347 | "display_name": "Python 3", 348 | "language": "python", 349 | "name": "python3" 350 | }, 351 | "language_info": { 352 | "codemirror_mode": { 353 | "name": "ipython", 354 | "version": 3 355 | }, 356 | "file_extension": ".py", 357 | "mimetype": "text/x-python", 358 | "name": "python", 359 | "nbconvert_exporter": "python", 360 | "pygments_lexer": "ipython3", 361 | "version": "3.7.2" 362 | } 363 | }, 364 | "nbformat": 4, 365 | "nbformat_minor": 2 366 | } 367 | -------------------------------------------------------------------------------- /Gumbel-softmax visualization.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from torchvision import datasets, transforms" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import torch\n", 19 | "import torch.nn as nn\n", 20 | "from torch.optim import SGD\n", 21 | "import torch.nn.functional as F\n", 22 | "\n", 23 | "import numpy as np" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 3, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "def sample_gumbel(n,k):\n", 33 | " unif = torch.distributions.Uniform(0,1).sample((n,k))\n", 34 | " g = -torch.log(-torch.log(unif))\n", 35 | " return g" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 4, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "def sample_gumbel_softmax(pi, n, temperature):\n", 45 | " k = len(pi)\n", 46 | " g = sample_gumbel(n, k)\n", 47 | " h = (g + torch.log(pi))/temperature\n", 48 | " h_max = h.max(dim=1, keepdim=True)[0]\n", 49 | " h = h - h_max\n", 50 | " cache = torch.exp(h)\n", 51 | "# print(pi, torch.log(pi), intmdt)\n", 52 | " y = cache / cache.sum(dim=-1, keepdim=True)\n", 53 | " return y" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 5, 59 | "metadata": {}, 60 | "outputs": [], 61 | "source": [ 62 | "import matplotlib.pyplot as plt" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "# Probability Distribution" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 6, 75 | "metadata": {}, 76 | "outputs": [ 77 | { 78 | "data": { 79 | "text/plain": [ 80 | "(0, 1)" 81 | ] 82 | }, 83 | "execution_count": 6, 84 | "metadata": {}, 85 | "output_type": "execute_result" 86 | }, 87 | { 88 | "data": { 89 | "image/png": "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\n", 90 | "text/plain": [ 91 | "
" 92 | ] 93 | }, 94 | "metadata": { 95 | "needs_background": "light" 96 | }, 97 | "output_type": "display_data" 98 | } 99 | ], 100 | "source": [ 101 | "k = 10\n", 102 | "pi = torch.randint(high=100, size=(k,), dtype=torch.float)\n", 103 | "pi = pi/pi.sum()\n", 104 | "plt.bar(np.arange(k)+1, pi.numpy())\n", 105 | "plt.ylim(0,1)" 106 | ] 107 | }, 108 | { 109 | "cell_type": "markdown", 110 | "metadata": {}, 111 | "source": [ 112 | "# Samples" 113 | ] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": {}, 118 | "source": [ 119 | "## Gumbel-softmax" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 7, 125 | "metadata": { 126 | "scrolled": false 127 | }, 128 | "outputs": [ 129 | { 130 | "data": { 131 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6sAAAHiCAYAAAAOKloIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3X24XXV55//3hyDSKohKbJUkBmu0jQ8Ve0Rb+0NH0Yb6K2mnYoNjCw5thuuS6hTrTPzVosU6F8WOT9NMa2qp+ICI2GpaY/G5j+IkVkQTRGNEOEZLBMT6BATu3x97ncx2c5Kzc/Y+e69z9vt1Xftir7W+a617nXO4s+61vuu7UlVIkiRJktQmR4w7AEmSJEmSelmsSpIkSZJax2JVkiRJktQ6FquSJEmSpNaxWJUkSZIktY7FqiRJkiSpdSxWJUmSJEmtY7G6iCX5TtfnniTf75r+T+OObxBJvpHk58ccw2lJvpjku0k+kmTFIdr+RJJ/TPK9JDuTnNK17IlJPpTkliQ/GE300tJl7lvwGA4n9/1Rks8nuTvJplHGKS115roFj+Fwct03mnO8mZ//34wy1klmsbqIVdX9Zz7AjcAvdc1757jjO5gkR7Z9H0keCrwbeBlwPLALeMchVrkS+EfgQcAfAu9Lclyz7A7gXcC5g8QkqcPct3D7mEfuux54KfDhQfYr6d7MdQu3j3nkOoBnd/38f2mQ/at/FqtLWJJlSX4/yZ4k30zyzpkCKslPJtmf5JwkX2vu+v3nJD/bXCX/VpLXdW3r3CQfS/LmJN9Osqvn7uGDkrytufJ0U5JXJjmiZ93NSW4DNjX7/0SSW5PsS3JpkmOa9u8BHgJ8qLl69eIk65Ls7jm+A1flklyU5LIk707y78CGQx1/H84AdlTV+6vq+8AFwM8lWT3Lz/nxwKOAV1fVD6rqXcCXgV8GqKqdVfWXwHV97lvSAMx9o8l9AFV1SVVdBXynz+1LGhJz3ehyncbHYnVpexnwbODngRXAXcDru5YvAx4PPAJ4IfC/gN8FntbMf2GSJ3e1PwX4LPBg4CI6dw+PbZa9E7i92dbJdAq1X+9Z9xo6V6/+ZzPvQuDHgccBjwZ+D6CqzgBu5v9ewXpTn8f7q8ClwAOA9851/EmuT/IfD7KtxzTHShPTt+hc1XzMQdp+sUl2Mz57kLaSFp65bzS5T9J4metGm+uuTHJzkg8mMSeOiMXq0vZfgE1VtbeqfgD8AfBrSdLV5sKquqOqtjbTb6uqW6rqRuBfgJO62t5UVf+7qu6qqrcB08AvJHk4nSR1flV9r6q+DrwJ2NC17p6q+vOquruqvl9VX6iqj1XVnVX1DeANdJLnIP6+qrZV1T1N4XjI46+qR1fVXx1kW/enk5S73Q4cM2BbSQvP3Dea3CdpvMx1o8t1zwVWAycCnwKumrlTrIW14H3KNR7N/6grgW1JqmvREXSumAHcXVW3dC37PvBvPdP375qe7tnNV4GHAQ8Hjgb2deXHI4Du7hw39cT3MOCNwM/RSQxHAF/v59gO4cA++jj+b86xre8Ax/bMOxb498No+60+YpY0ROa+keY+SWNirhttrquqf+qafFWSs4Gn4PP6C847q0tUVRXwNeAZVXVc1+foqprrf+CD6R0lbRWwl07y+A7wwK79HFtVT+wOqWfd1wLfBR5bVccCvwnkEO2/C/zozESS+9AZzKjbgXWGcPw7gZ/u2t8D6CTrnQdp+6gkR3fN++mDtJW0gMx9I819ksbEXDf2XFf88PFogVisLm1/BlyUZCVAkockGWT0spXNQ/RHJnkBnST2oar6CnA1cHGSY5IckWRNDj0k+TF0Et+3k6wCzu9Z/m90nouYcR3woCTPbBLYHzD33+8gx38l8KQkv9QUoX8A/EtV3dDbsKquBb4E/H6S+yZ5HvBI4P3NftNs46hm+ugkR/UZh6TDZ+4bQe5rtn2fpt0RwJFNfvPcQhoNc90Icl2SR6QzMNV9kvxIklfQudP8qT73pQH4D8rSdjHwEeBj6Yyc9i/AEw+9yiH9A51nG26l85D8r1TVTH//M4HjgC80y98N/NghtnUBnQfibwf+ms6D8t1eA7wmndHqzmuukr2EzgP+08A3mLuLxyGPP8mXk/zqbCtW1V7g14DXNcfzWOAFXeu+NckbulY5g87zHN8CXkXnZ3Nbs+zRdLrafBq4b/P92jlilzR/5r7R5b6308lpvwK8uvn+vDnikzQc5rrR5LpjgT8HbmtiOwU4retnowWUzl106dCSnAs8t6pOHXcskjQq5j5Jk8Bcp7byzqokSZIkqXUsViVJkiRJrWM3YEmSJElS63hnVZIkSZLUOharkiRJkqTWOXLcAfQ6/vjja/Xq1eMOQ1LLfPrTn/5mVS0fdxzDZL6T1GvcuS7JOuCNwDLgLVV1Uc/yVcCldF5jsgzYVFXbDrVNc52kXv3mutYVq6tXr2bHjh3jDkNSyyT56rhjGDbznaRe48x1SZYBm4Fn0Xmf5PYkW6tqV1ezVwBXVNWfJlkLbANWH2q75jpJvfrNdXYDliRJEsDJwO6q2lNVdwKXA+t72hRwbPP9AcDeEcYnacK07s6qJEmSxuIE4Kau6WngyT1tXgV8KMlvA/cDTh1NaJImkXdWJWkOSS5JcnOSzx9keZK8KcnuJNcmeeKoY5SkIcgs83rfcXgm8NaqWgH8IvD2JPc6n0yyMcmOJDv27du3AKFKmgQWq5I0t7cC6w6x/DRgTfPZCPzpCGKSpGGbBlZ2Ta/g3t18zwGuAKiqTwJHA8f3bqiqtlTVVFVNLV++pMbGkzRCAxWr3m2QNAmq6h+AWw/RZD3wtuq4GjguyUNHE50kDc12YE2SE5McBWwAtva0uRF4JkCSn6JTrHrrVNKCGPTO6lvxboMkzfac1wmzNbRrnKS2qqr9wHnAVcB1dEb93ZnkwiSnN81eCvxWks8C7wLOrqrersKSNBQDDbBUVf+QZPUhmhy42wBcneS4JA+tqq8Psl9Japl+nvPqzKzaAmwBmJqa8gRPUqs070zd1jPvgq7vu4CnjjouSZNpoUcDPtjdhh8qVpNspHPnlVWrVi1wSNLsVm/6wNC2dcNFzxnatrQo9POc10CG+fcJ/o1Kkg7Of3PUFgs9wFJfdxt8CF/SIrcV+I3mOf2nALfbg0SSJGkwC31ndcHvNkjSQkvyLuDpwPFJpoFXAvcBqKo/o9Nl7heB3cD3gBeOJ1JJkqSlY6GL1a3AeUkup/NSae82SFp0qurMOZYX8KIRhSNJkjQRBipWvdsgSZIkSVoIg44G7N0GSZIkSdLQLfQAS5IkSZIkHTaLVUmSJElS61isSpIkSZJax2JVkiRJktQ6FquSJEmSpNaxWJUkSZIktY7FqiRJkiSpdSxWJUmSJEmtY7EqSZIkSWodi1VJkiSRZF2S65PsTrJpluWvT3JN8/likm+NI05Jk+PIcQcgSZKk8UqyDNgMPAuYBrYn2VpVu2baVNXvdLX/beCkkQcqaaJ4Z1WSJEknA7urak9V3QlcDqw/RPszgXeNJDJJE8tiVZIkSScAN3VNTzfz7iXJw4ETgY+NIC5JE8xiVZIkSZllXh2k7Qbgyqq6+6AbSzYm2ZFkx759+4YSoKTJY7EqSZKkaWBl1/QKYO9B2m5gji7AVbWlqqaqamr58uVDClHSpLFYlSRJ0nZgTZITkxxFpyDd2tsoyaOBBwKfHHF8kiaQxaokSdKEq6r9wHnAVcB1wBVVtTPJhUlO72p6JnB5VR2si7AkDY2vrpEkSRJVtQ3Y1jPvgp7pV40yJkmTzTurkiRJkqTWsViVJEmSJLWOxaokSZIkqXUsViVJkiRJrWOxKkmSJElqHYtVSZIkSVLrWKxKkiRJklrHYlWSJEmS1DoWq5IkSZKk1rFYlaQ5JFmX5Poku5NsmmX5qiQfT/KZJNcm+cVxxClJkrSUDFSsegInaalLsgzYDJwGrAXOTLK2p9krgCuq6iRgA/C/RxulJEnS0jPvYtUTOEkT4mRgd1Xtqao7gcuB9T1tCji2+f4AYO8I45MkSVqSBrmz6gmcpElwAnBT1/R0M6/bq4AXJJkGtgG/fbCNJdmYZEeSHfv27Rt2rJIkSUvGIMXqUE/gJKmlMsu86pk+E3hrVa0AfhF4e5JZ82tVbamqqaqaWr58+ZBDlSRJWjoGKVaHdgLnnQZJLTYNrOyaXsG9e4mcA1wBUFWfBI4Gjh9JdJIkSUvUIMXq0E7gvNMgqcW2A2uSnJjkKDrP32/taXMj8EyAJD9FJ9d55U2SJGkAgxSrnsBJWvKqaj9wHnAVcB2dQeN2JrkwyelNs5cCv5Xks8C7gLOrqreniSS12lxveWjaPC/JriQ7k1w26hglTZYj57tiVe1PMnMCtwy4ZOYEDthRVVvpnMD9eZLfodNF2BM4SYtOVW2j89x997wLur7vAp466rgkaVi63vLwLDq957Yn2drkt5k2a4CXA0+tqtuSPGQ80UqaFPMuVsETOEmSpCXiwFseAJLMvOVhV1eb3wI2V9VtAFV188ijlDRRBukGLEmSpKWhn7c8PAp4VJJ/TnJ1knUH25iDZ0oaBotVSZIk9fOWhyOBNcDT6bzx4S1JjpttYw6eKWkYLFYlSZLUz1sepoH3V9VdVfUV4Ho6xaskLQiLVUmSJPXzlof3Af8BIMnxdLoF7xlplJImisWqJEnShOvzNV1XAbck2QV8HHhZVd0ynoglTYKBRgOWJEnS0tDHWx4KOL/5SNKC886qJEmSJKl1LFYlSZIkSa1jsSpJkiRJah2LVUmSJElS61isSpIkSZJax2JVkiRJktQ6FquSJEmSpNaxWJUkSZIktY7FqiRJkiSpdSxWJUmSJEmtY7EqSZIkSWodi1VJkiRJUutYrEqSJEmSWsdiVZIkSZLUOharkiRJkqTWsViVJEkSSdYluT7J7iSbZll+dpJ9Sa5pPr85jjglTY4jxx2AJEmSxivJMmAz8CxgGtieZGtV7epp+u6qOm/kAUqaSN5ZlSRJ0snA7qraU1V3ApcD68cck6QJZ7EqSZKkE4Cbuqanm3m9fjXJtUmuTLLyYBtLsjHJjiQ79u3bN+xYJU0Ii1VJkiRllnnVM/03wOqqejzwEeDSg22sqrZU1VRVTS1fvnyIYUqaJBarkiRJmga675SuAPZ2N6iqW6rqjmbyz4GfGVFskiaUxaokSZK2A2uSnJjkKGADsLW7QZKHdk2eDlw3wvgkTSCLVUmaw1yvc2jaPC/JriQ7k1w26hglaRBVtR84D7iKThF6RVXtTHJhktObZi9uctxngRcDZ48nWkmTYqBX1yRZB7wRWAa8paoumqXN84BX0Xnu4bNV9fxB9ilJo9TP6xySrAFeDjy1qm5L8pDxRCtJ81dV24BtPfMu6Pr+cjq5TpJGYt7FqidwkibEgdc5ACSZeZ1D97sHfwvYXFW3AVTVzSOPUpIkaYkZpBtwP+/j8gRO0mLXz+scHgU8Ksk/J7m66XUyK1/nIEmS1J9BitWhnsBJUkv18zqHI4E1wNOBM4G3JDluto35OgdJkqT+DPLM6uGewK0A/jHJY6vqWz+0oWQjsBFg1apVA4QkSUM35+scmjZXV9VdwFeSXE8n920fTYiSJElLzyB3Vvs9gXt/Vd1VVV8BZk7gfoh3GiS12JyvcwDeB/wHgCTH0+lVsmekUUqSJC0xgxSrnsBJWvL6fJ3DVcAtSXYBHwdeVlW3jCdiSZKkpWHe3YCran+SmRO4ZcAlMydwwI6q2tose3ZzAnc3nsBJWoT6eJ1DAec3H0mSJA3BQO9Z9QROkiRJkrQQBukGLEmSJEnSgrBYlSRJkiS1jsWqJEmSJKl1LFYlSZIkSa1jsSpJkiRJah2LVUmSJElS61isSpIkSZJax2JVkiRJACRZl+T6JLuTbDpEu+cmqSRTo4xP0mSxWJUkSRJJlgGbgdOAtcCZSdbO0u4Y4MXAp0YboaRJY7EqSZIkgJOB3VW1p6ruBC4H1s/S7tXAxcAPRhmcpMljsSpJkiSAE4Cbuqanm3kHJDkJWFlVfzvKwCRNJotVSZIkAWSWeXVgYXIE8HrgpXNuKNmYZEeSHfv27RtiiJImicWqJEmSoHMndWXX9Apgb9f0McBjgU8kuQF4CrB1tkGWqmpLVU1V1dTy5csXMGRJS5nFqiRJkgC2A2uSnJjkKGADsHVmYVXdXlXHV9XqqloNXA2cXlU7xhOupKXOYlWSJElU1X7gPOAq4DrgiqrameTCJKePNzpJk+jIcQcgSZKkdqiqbcC2nnkXHKTt00cRk6TJ5Z1VSZIkSVLrWKxKkiRJklrHYlWSJEmS1DoWq5IkSZKk1rFYlSRJkiS1jsWqJEmSJKl1LFYlSZIkSa1jsSpJkiRJah2LVUmSJElS61isSpIkSZJax2JVkiRJktQ6FquSJEmSpNaxWJWkOSRZl+T6JLuTbDpEu+cmqSRTo4xPkiRpKRqoWPUETtJSl2QZsBk4DVgLnJlk7SztjgFeDHxqtBFKkiQtTfMuVj2BkzQhTgZ2V9WeqroTuBxYP0u7VwMXAz8YZXCSJElL1SB3Vj2BkzQJTgBu6pqebuYdkOQkYGVV/e1cG0uyMcmOJDv27ds33EglaUBz9ZpLcm6SzyW5Jsk/zXajQpKGZZBidWgncJ68SWqxzDKvDixMjgBeD7y0n41V1ZaqmqqqqeXLlw8pREkaXJ+95i6rqsdV1RPo3Ix43YjDlDRBBilWh3YC58mbpBabBlZ2Ta8A9nZNHwM8FvhEkhuApwBbfUZf0iI0Z6+5qvp21+T96Dr3k6RhO3KAdQ/nBA7gx+mcwJ1eVTsG2K8kjdJ2YE2SE4GvARuA588srKrbgeNnppN8Avhd85ykRWi2XnNP7m2U5EXA+cBRwDNGE5qkSTTIndUDJ3BJjqJzArd1ZmFV3V5Vx1fV6qpaDVwNWKhKWlSqaj9wHnAVcB1wRVXtTHJhktPHG50kDdUhe80dmFG1uap+AvjvwCtm3ZCPeEkagnnfWa2q/UlmTuCWAZfMnMABO6pq66G3IEmLQ1VtA7b1zLvgIG2fPoqYJGkBzNVrrtflwJ/OtqCqtgBbAKampuwqLGleBukG7AmcJEnS0nHIxx4Akqypqi81k88BvoQkLZCBilVJkiQtDX32mjsvyanAXcBtwFnji1jSUmexKkmSJGDuXnNV9ZKRByVpYg0ywJIkSZIkSQvCYlWSJEmS1DoWq5IkSZKk1rFYlSRJkiS1jsWqJEmSJKl1LFYlSZIkSa1jsSpJkiRJah2LVUmSJElS61isSpIkSZJax2JVkiRJktQ6FquSJEmSpNaxWJUkSZIktY7FqiRJkiSpdSxWJUmSJEmtY7EqSZIkSWodi1VJkiSRZF2S65PsTrJpluXnJ9mV5NokH03y8HHEKWlyWKxKkiRNuCTLgM3AacBa4Mwka3uafQaYqqrHA1cCF482SkmTxmJVkiRJJwO7q2pPVd0JXA6s725QVR+vqu81k1cDK0Yco6QJY7EqSZKkE4Cbuqanm3kHcw7wwQWNSNLEO3LcAUiSJGnsMsu8mrVh8gJgCnjaQTeWbAQ2AqxatWoY8UmaQN5ZlSRJ0jSwsmt6BbC3t1GSU4HfA06vqjsOtrGq2lJVU1U1tXz58qEHK2kyWKxKkiRpO7AmyYlJjgI2AFu7GyQ5CXgznUL15jHEKGnCWKxKkiRNuKraD5wHXAVcB1xRVTuTXJjk9KbZa4H7A+9Jck2SrQfZnCQNhc+sSpIkiaraBmzrmXdB1/dTRx6UpInmnVVJkiRJUutYrEqSJEmSWmegYjXJuiTXJ9mdZNMsy89PsivJtUk+muThg+xPksbBXCdJkjR68y5WkywDNgOnAWuBM5Os7Wn2GWCqqh4PXAlcPN/9SdI4mOskSZLGY5A7qycDu6tqT1XdCVwOrO9uUFUfr6rvNZNX03lnlyQtJuY6SZKkMRikWD0BuKlrerqZdzDnAB8cYH+SNA7mOkmSpDEY5NU1mWVezdoweQEwBTztIMs3AhsBVq1aNUBIkjR0Q8t1TRvznSRJi9zqTR8Y6vZuuOg5Q93eUjHIndVpYGXX9Apgb2+jJKcCvwecXlV3zLahqtpSVVNVNbV8+fIBQpKkoRtargPznSRJUr8GKVa3A2uSnJjkKGADsLW7QZKTgDfTOXm7eYB9SdK4mOskSZLGYN7FalXtB84DrgKuA66oqp1JLkxyetPstcD9gfckuSbJ1oNsTpJayVwnSZI0HoM8s0pVbQO29cy7oOv7qYNsX5LawFwnSZI0eoN0A5YkSZIkaUFYrEqSJEmSWsdiVZIkSZLUOharkiRJkqTWsViVJEmSJLWOxaokSZJIsi7J9Ul2J9k0y/JTkvxrkv1JnjuOGCVNFotVSZKkCZdkGbAZOA1YC5yZZG1PsxuBs4HLRhudpEk10HtWJUmStCScDOyuqj0ASS4H1gO7ZhpU1Q3NsnvGEaCkyeOdVUmSJJ0A3NQ1Pd3Mm5ckG5PsSLJj3759AwcnaTJZrEqSJCmzzKv5bqyqtlTVVFVNLV++fICwJE0yi1VJkiRNAyu7plcAe8cUiyQBFquSJEmC7cCaJCcmOQrYAGwdc0ySJpzFqiRJ0oSrqv3AecBVwHXAFVW1M8mFSU4HSPKkJNPAGcCbk+wcX8SSJoGjAUuSJImq2gZs65l3Qdf37XS6B0vSSHhnVZIkSZLUOharkiRJkqTWsViVJEmSJLWOxaokSZIkqXUsViVJkiRJrWOxKkmSJElqHYtVSZIkSVLr+J5VSZIkSSOzetMHhrq9Gy56zlC3p/bwzqokSZIkqXUsViVJkiRJrWOxKkmSJElqHYtVSZIkSVLrWKxKkiRJklrHYlWSJEmS1DoWq5IkSZKk1hmoWE2yLsn1SXYn2TTL8vsmeXez/FNJVg+yP0kaB3OdpElhvpPUJvMuVpMsAzYDpwFrgTOTrO1pdg5wW1U9Eng98Efz3Z8kjYO5TtKkMN9JapsjB1j3ZGB3Ve0BSHI5sB7Y1dVmPfCq5vuVwJ8kSVXVAPuVpFEy1y0iqzd9YGjbuuGi5wxtW9IiYb4bgmHmITAXzZf/HiwNgxSrJwA3dU1PA08+WJuq2p/kduDBwDcH2K8kjZK5TkvKQp/ALabtH2wfE2wi8t1SKGKWwjHo0Mx1HYMUq5llXu9VtX7akGQjsLGZ/E6S6weIa1yOZxEl6oPwGIYkg3WKasUxDGCh4n/4AmyzH0PLddCefOff6NzxD/gzWmit+B0s9N/RKH4HA+xjqeU68Nyu10T8jXoMcxvFv5lL4RgOU1+5bpBidRpY2TW9Ath7kDbTSY4EHgDc2ruhqtoCbBkglrFLsqOqpsYdxyA8hnZY7Mew2OOfxdByHZjv2mCxxw8eQxss9vgPwnO7Lov9d7zY4wePoS3GeQyDjAa8HViT5MQkRwEbgK09bbYCZzXfnwt8zGcaJC0y5jpJk8J8J6lV5n1ntXlO4TzgKmAZcElV7UxyIbCjqrYCfwG8PcluOlfdNgwjaEkaFXOdpElhvpPUNoN0A6aqtgHbeuZd0PX9B8AZg+xjEVnUXV0aHkM7LPZjWOzx34u57l4W++94sccPHkMbLPb4Z2W++yGL/Xe82OMHj6EtxnYMseeGJEmSJKltBnlmVZIkSZKkBWGxOqAkK5N8PMl1SXYmecm4Y5qvJMuSfCbJ3447lsOV5LgkVyb5QvO7+Nlxx3S4kvxO8zf0+STvSnL0uGOaS5JLktyc5PNd8x6U5MNJvtT894HjjFHDYa5rj8We78x1ajNzXXuY60avjbnOYnVw+4GXVtVPAU8BXpRk7Zhjmq+XANeNO4h5eiPwd1X1k8BPs8iOI8kJwIuBqap6LJ2BLRbDoBVvBdb1zNsEfLSq1gAfbaa1+Jnr2mPR5jtznRYBc117mOtG7620LNdZrA6oqr5eVf/afP93Ov8jnTDeqA5fkhXAc4C3jDuWw5XkWOAUOiMUUlV3VtW3xhvVvBwJ/Ejz3rof5d7vtmudqvoH7v1+vfXApc33S4FfHmlQWhDmunZYIvnOXKfWMte1g7luPNqY6yxWhyjJauAk4FPjjWRe3gD8N+CecQcyD48A9gF/2XR3eUuS+407qMNRVV8D/hi4Efg6cHtVfWi8Uc3bj1XV16Hzjz7wkDHHoyEz143Vos535jotJua6sTLXtcdYc53F6pAkuT/wXuC/VtW3xx3P4Ujy/wI3V9Wnxx3LPB0JPBH406o6Cfgui6w7VtP/fz1wIvAw4H5JXjDeqKR7M9eN3aLOd+Y6LRbmurEz1wmwWB2KJPehk9DeWVV/Ne545uGpwOlJbgAuB56R5B3jDemwTAPTVTVz5fNKOgluMTkV+EpV7auqu4C/An5uzDHN178leShA89+bxxyPhsRc1wqLPd+Z69R65rpWMNe1x1hzncXqgJKETn/666rqdeOOZz6q6uVVtaKqVtN5+PtjVbVorv5U1TeAm5I8upn1TGDXGEOajxuBpyT50eZv6pksooEEemwFzmq+nwW8f4yxaEjMde2wBPKduU6tZq5rB3Ndq4w11x05yp0tUU8Ffh34XJJrmnn/X1VtG2NMk+i3gXcmOQrYA7xwzPEclqr6VJIrgX+lMxLhZ4At441qbkneBTwdOD7JNPBK4CLgiiTn0EnWZ4wvQg2Rua49Fm2+M9dpETDXtYe5bsTamOtSVaPcnyRJkiRJc7IbsCRJkiSpdSxWJUmSJEmtY7EqSZIkSWodi1VJkiRJUutYrEqSJEmSWsdiVZIkSZLUOharkiRJkqTWsViVJEmSJLWOxeoESPKdrs89Sb7fNf2fxh3fIJJ8I8nPj3H/90vy3iRfTVJJnjKuWKRJZ65b0P3/ZJPjun/G/21c8UiTxNy2oPs/5HlckiOSvD7JbUm+meQPxxXrpDpy3AFo4VXV/We+J7kB+M2q+sj4IupPkiOran/L91HA3wOvA/5mOFFJmg9z3YLv4+7un7Gk0TC3Leg+5jqP+23gWcBa4D7AR5Psrqq3DrBPHQbvrIoky5L8fpI9zVWjdyY5rln2k0n2JzknydeS3JLkPyf52SSfT/KtJK/r2ta5ST6W5M1Jvp3Yy4/hAAAgAElEQVRkV5JTupY/KMnbmitpNyV5ZZIjetbdnOQ2YFOz/08kuTXJviSXJjmmaf8e4CHAh5qriy9Osi7J7p7jO3DVLslFSS5L8u4k/w5sONTxz6WqvldVb6qqfwbuGegXIWlBmevmn+sktZe5bUHP484CLq6qr1fVjcAbgLP7/d1ocBarAngZ8Gzg54EVwF3A67uWLwMeDzwCeCHwv4DfBZ7WzH9hkid3tT8F+CzwYOAi4H1Jjm2WvRO4vdnWycAvA7/es+41wPHA/2zmXQj8OPA44NHA7wFU1RnAzcCzq+r+VfWmPo/3V4FLgQcA753r+JNcn+Q/9rltSe1lrhss1y1rTnZvSvLnSR7UZxySFpa5beHO49bS+VnM+CzwmHluS/NRVX4m6APcAJzaM+8rwFO7pk8EvgcE+Ek6XSQe3LX8u8D6rukPAOc2388FvtKz/WuBM4CHN+vep2vZC4EPdq37xTni3wB8smv6G8DPd02vA3b3rHOgDZ2k+6F+j/8wf7bfBJ4y7t+xHz9+zHXDznV0TgpPonPS+zBgK/D+cf+e/fiZtI+5bXTncXS6/Rawumve44AfjPvvYJI+PrM64ZIEWAlsS1Jdi46gc0UNOs8p3dK17PvAv/VMdz/HNN2zm6/SObl5OHA0sK+z2wP76e7ucVNPfA8D3gj8HHBM0/7r/RzbIRzYRx/H/80B9yWpBcx1g+W6qrod+EwzuTfJi4HdSY6uqh8MGKekeTK3Ldx5XFXdleQO4Niu2ccC/z7fberw2Q14wlXnMtHXgGdU1XFdn6Orar7/g6/omV4F7KWTXL4DPLBrP8dW1RO7Q+pZ97V0ruI9tqqOBX6TzpXCg7X/LvCjMxNJ7gP0dlU7sM4CHb+kljHXDf34q4kvczWUtHDMbQt+HrcL+Omu6Z8Gdg5hu+qTxaoA/gy4KMlKgCQPSfJLA2xvZfOQ/ZFJXkAnyX2oqr4CXA1cnOSYdIYDX5NDD1l+DJ3E+O0kq4Dze5b/G53nJmZcBzwoyTObBPcHzP13PtDxJ7lvkqObyaO6vktqF3PdPI+/GYzlkel4CJ1BRj5UVd/vZ31JC8rctnDncW8DXpbkx5vt/1fgrf1uW4OzWBXAxcBHgI81I6v9C/DEQ69ySP9A59mmW+k8RP8rTRcygDOB44AvNMvfDfzYIbZ1AZ0H5m8H/prOg/TdXgO8Jp3R7M5rrqK9hM4AANN0nnOY68raIY8/yZeT/Ooh1v8qnS40D6Yz/Pn3k/z4HPuUNHrmuvnnukc1636HzuAp3wJ+Y479SRoNc9vCnce9CfgonSL6GuA95WtrRiqdu+fScCQ5F3huVZ067lgkaaGY6yQtReY2tY13ViVJkiRJrWOxKkmSJElqHbsBS5IkSZJaxzurkiRJkqTWsViVJEmSJLXOkeMOoNfxxx9fq1evHncYklrm05/+9Deravm44xgm852kXuY6SZOg31zXV7GaZB3wRmAZ8Jaquugg7Z4LvAd4UlXtaOa9HDgHuBt4cVVddah9rV69mh07dvQTlqQJkuSr445h2Mx3knqZ6yRNgn5z3ZzFapJlwGbgWXRezrs9ydaq2tXT7hjgxcCnuuatBTYAjwEeBnwkyaOq6u5+D0SSJEmSNHn6eWb1ZGB3Ve2pqjuBy4H1s7R7NXAx8IOueeuBy6vqjqr6CrC72Z4kSZIkSQfVT7F6AnBT1/R0M++AJCcBK6vqbw93XUmSJEmSevVTrGaWeQdezprkCOD1wEsPd92ubWxMsiPJjn379vURkiRJkuYjybok1yfZnWTTLMtPSfKvSfY345HMzH9Ckk8m2Znk2iS/NtrIJU2aforVaWBl1/QKYG/X9DHAY4FPJLkBeAqwNclUH+sCUFVbqmqqqqaWL19SA+BJkiS1RtdYJKcBa4EzmzFGut0InA1c1jP/e8BvVNVjgHXAG5Ict7ARS5pk/RSr24E1SU5MchSdAZO2ziysqtur6viqWl1Vq4GrgdOb0YC3AhuS3DfJicAa4P8M/SgkSZLUjznHIqmqG6rqWuCenvlfrKovNd/3AjcD3mWQtGDmLFaraj9wHnAVcB1wRVXtTHJhktPnWHcncAWwC/g74EWOBCxJkjQ2QxlPJMnJwFHAlw+y3Ee8JA2sr/esVtU2YFvPvAsO0vbpPdOvAV4zz/gkSZI0PH2NJ3LIDSQPBd4OnFVV98zWpqq2AFsApqamDmv7kjSjr2JVUvut3vSBoW7vhoueM9TtSZqb/x9rBPoaT+RgkhwLfAB4RVVdPeTYJDX896Cjn2dWJUmStDQcciySQ2na/zXwtqp6zwLGKEmAxaokSdLE6GcskiRPSjINnAG8OcnOZvXnAacAZye5pvk8YQyHIWlC2A1YkiRpgsw1FklVbafTPbh3vXcA71jwACWp4Z1VSZIkSVLrWKxKkiRJklrHYlWSJEmS1DoWq5IkSZKk1rFYlSRJkiS1jsWqJEmSJKl1LFYlSZIkSa1jsSpJjSTrklyfZHeSTbMsPyXJvybZn+S5XfOfkOSTSXYmuTbJr402ckmSpKXHYlWSgCTLgM3AacBa4Mwka3ua3QicDVzWM/97wG9U1WOAdcAbkhy3sBFLkiQtbUeOOwBJaomTgd1VtQcgyeXAemDXTIOquqFZdk/3ilX1xa7ve5PcDCwHvrXwYUuSJC1N3lmVpI4TgJu6pqebeYclycnAUcCXhxSXJEnSROrrzmqSdcAbgWXAW6rqop7l5wIvAu4GvgNsrKpdSVYD1wHXN02vrqpzhxO6JA1VZplXh7WB5KHA24Gzquqeg7TZCGwEWLVq1eHGKEnSglu96QND3d4NFz1nqNvT5JizWO16jutZdO40bE+ytap2dTW7rKr+rGl/OvA6Os9tAXy5qp4w3LAlaeimgZVd0yuAvf2unORY4APAK6rq6oO1q6otwBaAqampwyqGJUmSJkk/3YAPPMdVVXcCM89xHVBV3+6avB+HeTdCklpgO7AmyYlJjgI2AFv7WbFp/9fA26rqPQsYoyRJ0sTop1jt6zmuJC9K8mXgYuDFXYtOTPKZJH+f5P8ZKFpJWiBVtR84D7iKzuMLV1TVziQXNj1GSPKkJNPAGcCbk+xsVn8ecApwdpJrmo89SiRJkgbQzzOrfT3HVVWbgc1Jng+8AjgL+DqwqqpuSfIzwPuSPKbnTqzPcElqharaBmzrmXdB1/ftdLoH9673DuAdCx6gJEnqyzCfu/WZ2/Hpp1g93Oe4Lgf+FKCq7gDuaL5/urnz+ihgR/cKPsMlSZIkSaOzGAr6froBz/kcV5I1XZPPAb7UzF/eDNBEkkcAa4A9wwhckiRJkrR0zXlntar2J5l5jmsZcMnMc1zAjqraCpyX5FTgLuA2Ol2AofMM14VJ9tN5rc25VXXrQhyIJEmSJGnp6Os9q308x/WSg6z3XuC9gwQoSZIkSZo8/XQDliRJkiRppCxWJUmSJEmt01c3YEmSJC0NSdYBb6QzFslbquqinuWnAG8AHg9sqKoru5adRecVhQB/WFWXDju+xTBCqaTR8M6qJEnShGje0rAZOA1YC5yZZG1PsxuBs4HLetZ9EPBK4MnAycArkzxwoWOWNLm8sypJkhaNYd51g4m883YysLuq9gAkuRxYD+yaaVBVNzTL7ulZ9xeAD8+82SHJh4F1wLsWPmxJk8g7q5IkSZPjBOCmrunpZt5CrytJh81iVZIkaXJklnk17HWTbEyyI8mOffv29R2cJHWzWJUkSZoc08DKrukVwN5hr1tVW6pqqqqmli9fPq9AJclnViVJ0tA4kmvrbQfWJDkR+BqwAXh+n+teBfyPrkGVng28fPghSlKHd1YlSZImRFXtB86jU3heB1xRVTuTXJjkdIAkT0oyDZwBvDnJzmbdW4FX0yl4twMXzgy2JEkLwTurkiRJE6SqtgHbeuZd0PV9O50uvrOtewlwyYIGKEkNi1VJWgR8XYckSZo0dgOWJEmSJLWOd1YlSeqTgwdJkjQ6FquSpJGwK7MkSTocfXUDTrIuyfVJdifZNMvyc5N8Lsk1Sf4pydquZS9v1rs+yS8MM3hJkiRJ0tI0553VJMuAzcCz6LwMenuSrVW1q6vZZVX1Z03704HXAeuaonUD8BjgYcBHkjyqqu4e8nFI0sCSrAPeCCwD3lJVF/UsPwV4A/B4YENVXdm17CzgFc3kH1bVpaOJWpI0aXwkQZOin27AJwO7q2oPQJLLgfXAgWK1qr7d1f5+QDXf1wOXV9UdwFeS7G6298khxC5JQ9PnhbkbgbOB3+1Z90HAK4EpOvnv0826t40idkmSFhMfC1G/+ilWTwBu6pqeBp7c2yjJi4DzgaOAZ3Ste3XPuifMK1JJWlj9XJi7oVl2T8+6vwB8uKpubZZ/GFgHvGvhw5YkSaNmwT0a/Tyzmlnm1b1mVG2uqp8A/jv/tytcX+sm2ZhkR5Id+/bt6yMkSRq62S7M9XtxbZB1JUmSNIt+itVpYGXX9Apg7yHaXw788uGsW1VbqmqqqqaWL1/eR0iSNHR9XVwbdF0vzkmSJPWnn27A24E1SU4EvkZnwKTndzdIsqaqvtRMPgeY+b4VuCzJ6+gMsLQG+D/DCFyShuxwL8z1rvv0nnU/MVvDqtoCbAGYmprqtxiWJA2JgxNJi8ecxWpV7U9yHnAVnREyL6mqnUkuBHZU1VbgvCSnAncBtwFnNevuTHIFnWe+9gMvciRgSS0154W5Q7gK+B9JHthMPxt4+fBDlCRJmhz93FmlqrYB23rmXdD1/SWHWPc1wGvmG6AkjUI/F+aSPAn4a+CBwC8l+YOqekxV3Zrk1XQKXoALZwZbkiRJ0vz0VaxK0iTo48LcdjpdfGdb9xLgkgUNUJIkaYL0M8CSJEmSJEkjZbEqSZIkSWoduwFLkiRJQzLM0YbBEYc12byzKkmSJElqHYtVSZIkSVLrWKxKkiRJklrHYlWSJEmS1DoWq5IkSZKk1rFYlSRJkiS1jsWqJEnSBEmyLsn1SXYn2TTL8vsmeXez/FNJVjfz75Pk0iSfS3JdkpePOnZJk8X3rGpR8J1lkiQNLskyYDPwLGAa2J5ka1Xt6mp2DnBbVT0yyQbgj4BfA84A7ltVj0vyo8CuJO+qqhtGexSSJoXFqiRJUpdhXiBt4cXRk4HdVbUHIMnlwHqgu1hdD7yq+X4l8CdJAhRwvyRHAj8C3Al8e0RxS5pAdgOWJEmaHCcAN3VNTzfzZm1TVfuB24EH0ylcvwt8HbgR+OOqunW2nSTZmGRHkh379u0b7hFImhgWq5IkSZMjs8yrPtucDNwNPAw4EXhpkkfMtpOq2lJVU1U1tXz58kHilTTB+ipW+3gQ//wku5Jcm+SjSR7etezuJNc0n63DDF6SJEmHZRpY2TW9Ath7sDZNl98HALcCzwf+rqruqqqbgX8GphY8YkkTa85itetB/NOAtcCZSdb2NPsMMFVVj6fTReTirmXfr6onNJ/ThxS3JEmSDt92YE2SE5McBWwAem8mbAXOar4/F/hYVRWdrr/PSMf9gKcAXxhR3JImUD93Vg88iF9VdwIzD+IfUFUfr6rvNZNX07lKJ0mSpBZpnkE9D7gKuA64oqp2JrkwycxNhb8AHpxkN3A+MNOrbjNwf+DzdIrev6yqa0d6AJImSj+jAc/2IP6TD9H+HOCDXdNHJ9kB7Acuqqr3HXaUkiRJGoqq2gZs65l3Qdf3H9B5TU3vet+Zbb4kLZR+itV+HsTvNExeQOfZhad1zV5VVXubB/A/luRzVfXlnvU2AhsBVq1a1VfgkiT1WuKvHJEkaaL0U6z28yA+SU4Ffg94WlXdMTO/qvY2/92T5BPAScAPFatVtQXYAjA1NTVrISxJkgZnQS9JWiz6eWZ1zgfxk5wEvBk4vRkdbmb+A5Pct/l+PPBUfvil05LUGn2MfH7fJO9uln8qyepm/n2SXJrkc0muS/LyUccuSZK01MxZrPb5IP5r6Txw/56eV9T8FLAjyWeBj9N5ZtViVVLr9Dny+TnAbVX1SOD1wB81888A7ltVjwN+BvgvM4WsJEmS5qefbsD9PIh/6kHW+xfgcYMEKEkjcmDkc4AkMyOfd19gWw+8qvl+JfAnSULnOf77Ne8j/BHgTuDbI4pbkiRpSeqnG7AkTYLZRj4/4WBtml4ntwMPplO4fhf4Op33EP5xVd260AFLkiQtZRarktTRz8jnB2tzMnA38DDgROClzQjo995JsjHJjiQ79u3bN0i8kiRJS1pf3YAlaQL0M/L5TJvppsvvA4BbgecDf1dVdwE3J/lnOq/x2tO7kzaPfu4osZIkqU28sypJHXOOfN5Mn9V8fy7wsaoqOl1/n5GO+wFPAb4worglSZKWJItVSaLvkc//Anhwkt3A+cDM62020xkR/fN0it6/rKprR3oAkiRJS4zdgCWp0cfI5z+g85qa3vW+M9t8SZIkzZ93ViVJkiRJrWOxKkmSJElqHYtVSZIkSVLrWKxKkiRJklrHYlWSJEmS1DoWq5IkSZKk1rFYlSRJkiS1jsWqJEmSJKl1LFYlSZIkSa3TV7GaZF2S65PsTrJpluXnJ9mV5NokH03y8K5lZyX5UvM5a5jBS5IkSZKWpjmL1STLgM3AacBa4Mwka3uafQaYqqrHA1cCFzfrPgh4JfBk4GTglUkeOLzwJUmSJElLUT93Vk8GdlfVnqq6E7gcWN/doKo+XlXfayavBlY0338B+HBV3VpVtwEfBtYNJ3RJkiQdrj56zN03ybub5Z9Ksrpr2eOTfDLJziSfS3L0KGOXNFn6KVZPAG7qmp5u5h3MOcAH57muJEmSFkifPebOAW6rqkcCrwf+qFn3SOAdwLlV9Rjg6cBdIwpd0gTqp1jNLPNq1obJC4Ap4LWHs26SjUl2JNmxb9++PkKSJEnSPMzZY66ZvrT5fiXwzCQBng1cW1WfBaiqW6rq7hHFLWkC9VOsTgMru6ZXAHt7GyU5Ffg94PSquuNw1q2qLVU1VVVTy5cv7zd2SZIk/f/t3X+MZWddx/H3J7u2WIilltVot3VXu1W3ioBjQVEkVHCbahdjG7agLqbJSkIVfwUXowVXY1o1gImNYUNXa1HbWvwxsasrWkWjUHdp+bWtG4e1oUNRFrYWUUvd9usf52xzvcw6Z2buzD137vuVTOac5zzPOd/Tmf023znPfc7SdJn19nSfqjoFPAacD1wCVJJDSe5L8sY1iFfSFOtSrB4GtiXZmuQsYBcwO9ghyfOBd9AUqp8aOHQIeEWS89qFlV7RtkmSJGntdZn1dqY+G4FvB17Tfv++JJcveBFnzUkagUWL1fYvatfTFJkPAndW1dEk+5Jc1Xb7VeBZwB8k+WCS2XbsSeAXaQrew8C+tk2SJElrr8ust6f7tJ9TPRc42ba/t6o+3S6seRB4wUIXcdacpFHY2KVTVR2kSUiDbTcMbH/X/zP2AHBguQFKkiRpZJ6eMQd8gmbG3KuH+swCu4H3AVcD91RVJTkEvDHJOcATwHfSLMAkSauiU7EqSZKkyVdVp5KcnjG3AThwesYccKSqZoFbgNuSzNE8Ud3Vjn00yVtpCt4CDlbV3WO5EUlTwWJVkiRpinSYMfc4cM0Zxr6L5vU1krTquiywJElTIcmOJMeSzCXZu8Dxs5Pc0R6/N8mWgWPPTfK+JEeTfCTJM9YydkmSpPXGYlWSgCQbgJuBK4DtwLVJtg91uw54tKoupvmc1k3t2I00TxpeV1WXAi8F/meNQpckSVqXLFYlqXEZMFdVx6vqCeB2YOdQn53Are32XcDlSULzWq4PV9WHAKrqM1X15BrFLUmStC5ZrEpS4wLg4YH9+bZtwT7ta70eA84HLgEqyaEk9yV545ku4rsHJUmSurFYlaRGFmirjn02At8OvKb9/n1JLl/oIr57UJIkqRuLVUlqzAMXDuxvBh45U5/2c6rn0rzWYR54b1V9uqr+i2aVzResesSSJEnrmMWqJDUOA9uSbE1yFs17BWeH+swCu9vtq4F7qqpo3lf43CTntEXsdwIPrFHckiRJ65LvWZUkms+gJrmepvDcAByoqqNJ9gFHqmoWuAW4LckczRPVXe3YR5O8labgLeBgVd09lhuRJElaJyxWJalVVQdppvAOtt0wsP04cM0Zxr6L5vU1kiRJGgGnAUuSJEmSesdiVZIkSZLUOxarkiRJkqTesViVJEmSJPWOxaokSZIkqXc6FatJdiQ5lmQuyd4Fjr8kyX1JTiW5eujYk0k+2H4Nv7NQkiRJkqQvsOira5JsAG4GXg7MA4eTzFbV4AvvPw68FvjpBU7x31X1vBHEKkmSJEmaEl3es3oZMFdVxwGS3A7sBJ4uVqvqofbYU6sQoyRJkiRpynSZBnwB8PDA/nzb1tUzkhxJ8v4kr1yoQ5I9bZ8jJ06cWMKpJUmSJEnrUZdiNQu01RKucVFVzQCvBt6e5Gu+4GRV+6tqpqpmNm3atIRTS5IkSZLWoy7F6jxw4cD+ZuCRrheoqkfa78eBvwGev4T4JEmSJElTqEuxehjYlmRrkrOAXUCnVX2TnJfk7Hb7OcCLGfisqyRJkiRJC1m0WK2qU8D1wCHgQeDOqjqaZF+SqwCSfEuSeeAa4B1JjrbDvx44kuRDwF8DNw6tIixJkiRJ0hfoshowVXUQODjUdsPA9mGa6cHD4/4B+MYVxihJkiRJmjJdpgFLkiRpnUiyI8mxJHNJ9i5w/Owkd7TH702yZej4RUk+l+Sn1ypmSdPJYlWSJGlKJNkA3AxcAWwHrk2yfajbdcCjVXUx8DbgpqHjbwP+bLVjlSSLVUmSpOlxGTBXVcer6gngdmDnUJ+dwK3t9l3A5UkCkOSVwHHgKJK0yixWJUmSpscFwMMD+/Nt24J92oU2HwPOT/JM4GeAX1iDOCXJYlWSJGmKZIG26tjnF4C3VdXnFr1IsifJkSRHTpw4sYwwJanjasCSJElaF+aBCwf2NwOPnKHPfJKNwLnASeCFwNVJfgV4NvBUkser6jeGL1JV+4H9ADMzM8PFsCR14pNVSWq5QqakKXAY2JZka5KzgF3A7FCfWWB3u301cE81vqOqtlTVFuDtwC8vVKhK0qj4ZLUHtuy9e6Tne+jGK0d6PmkaDKyQ+XKapwqHk8xW1QMD3Z5eITPJLpoVMl81cNwVMiX1WlWdSnI9cAjYAByoqqNJ9gFHqmoWuAW4LckczRPVXeOLWNI0s1iVpMbTK2QCJDm9QuZgsboTeEu7fRfwG0lSVTWwQuZ/rl3IkrR0VXUQODjUdsPA9uPANYuc4y2rEpwkDXAasCQ11mSFTBcdkSRJ6sZiVZIaa7JCZlXtr6qZqprZtGnTMsKUJEmaDk4DlqTGmqyQKUmSpG4sViWp8fQKmcAnaBYUefVQn9MrZL6PgRUyge843SHJW4DPWahKkiStjMWqJOEKmZIkSX1jsSpJLVfIlCRJ6o9OCywl2ZHkWJK5JHsXOP6SJPclOZXk6qFju5P8c/u1e3isJEmSJEnDFi1Wk2wAbgauALYD1ybZPtTt48Brgd8bGvulwJtpFh+5DHhzkvNWHrYkSZIkaT3r8mT1MmCuqo5X1RPA7cDOwQ5V9VBVfRh4amjsdwPvqaqTVfUo8B5gxwjiliRJkiStY12K1QuAhwf259u2LjqNTbInyZEkR06cONHx1JIkSZKk9apLsZoF2qrj+TuNrar9VTVTVTObNm3qeGpJkiRJ0nrVpVidBy4c2N8MPNLx/CsZK0mSJEmaUl2K1cPAtiRbk5xF817B2Y7nPwS8Isl57cJKr2jbJEmSJEk6o0WL1ao6BVxPU2Q+CNxZVUeT7EtyFUCSb0kyT/P+wXckOdqOPQn8Ik3BexjY17ZJkiRJknRGG7t0qqqDwMGhthsGtg/TTPFdaOwB4MAKYpQkSZIkTZku04AlSZIkSVpTnZ6sSlq5LXvvHtm5HrrxypGdS5IkSeojn6xKkiRJknrHYlWSJEmS1DsWq5IkSZKk3rFYlSRJkiT1jsWqJEmSJKl3LFYlSZKmSJIdSY4lmUuyd4HjZye5oz1+b5ItbfvLk3wgyUfa7y9b69glTReLVUmSpCmRZANwM3AFsB24Nsn2oW7XAY9W1cXA24Cb2vZPA99bVd8I7AZuW5uoJU0ri1VJkqTpcRkwV1XHq+oJ4HZg51CfncCt7fZdwOVJUlX3V9UjbftR4BlJzl6TqCVNJYtVSWo5NU7SFLgAeHhgf75tW7BPVZ0CHgPOH+rz/cD9VfX5VYpTkixWJQmcGidpamSBtlpKnySX0uS/HznjRZI9SY4kOXLixIllBSpJFquS1HBqnKRpMA9cOLC/GXjkTH2SbATOBU62+5uBPwJ+qKo+dqaLVNX+qpqpqplNmzaNMHxJ08RiVZIaTo2TNA0OA9uSbE1yFrALmB3qM0szSwTgauCeqqokzwbuBt5UVX+/ZhFLmloWq5LUcGqcpHWv/UPb9cAh4EHgzqo6mmRfkqvabrcA5yeZA34SOP0Z/uuBi4GfT/LB9uvL1vgWJE2RjV06JdkB/DqwAXhnVd04dPxs4HeAbwY+A7yqqh5qFx95EDjWdn1/Vb1uNKGrT7bsvXtk53roxitHdi5pCZYyNW5+JVPjgP0AMzMzw8WwJK26qjoIHBxqu2Fg+3HgmgXG/RLwS6seoCS1Fn2yusJFRwA+VlXPa78sVCX1lVPjJEmSeqTLNOBlLzoyujAlaXU5NU6SJKlfukwDXmjRkReeqU9VnUoyuOjI1iT3A58Ffq6q/m5lIUvS6nBqnCRJUn90KVZXsujIJ4GLquozSb4Z+OMkl1bVZ//P4GQPsAfgoosu6hCSJEmSJGk96zINeNnv46qqz1fVZwCq6gPAx4BLhi/gu7gkSZIkSYO6FKsrWXRkU7tAE0m+GtgGHB9N6JIkSZKk9WrRacDtZ1BPLzqyAThwetER4EhVzdIsOnJbu+jISTg9qtYAAAZfSURBVJqCFuAlwL4kp4AngddV1cnVuBFJkiRJ0vrR6T2rK1h05N3Au1cYoyRJkiRpynSZBixJkiRJ0pqyWJUkSZIk9Y7FqiRJkiSpdyxWJUmSJEm9Y7EqSZIkSeodi1VJkiRJUu9YrEqSJEmSesdiVZIkSZLUOxvHHcBKbdl790jP99CNV470fH3gfyNJkiRJk8Ynq5IkSZKk3rFYlSRJkiT1zsRPA5ZGZZTTpZ0qLUmSJK2MT1YlSZIkSb1jsSpJkiRJ6h2nAUvqzKnSkiRJWiudnqwm2ZHkWJK5JHsXOH52kjva4/cm2TJw7E1t+7Ek3z260CVptMx1kqaBuU7SpFj0yWqSDcDNwMuBeeBwktmqemCg23XAo1V1cZJdwE3Aq5JsB3YBlwJfCfxlkkuq6slR38hq8mmStP6Z6yRNA3OdpEnS5cnqZcBcVR2vqieA24GdQ312Are223cBlydJ2357VX2+qv4FmGvPJ0l9Y66TNA3MdZImRpdi9QLg4YH9+bZtwT5VdQp4DDi/41hJ6gNznaRpYK6TNDG6LLCUBdqqY58uY0myB9jT7n4uybEOca2K3LTsoc8BPr2K5+9s0u9hheefinuY0t+jr1pOMEuw6rkO+pPv/B1d/3liBNdYlL9H5roFxjYnMNeNTA9/R5ds0u/BfL0q/xY65bouxeo8cOHA/mbgkTP0mU+yETgXONlxLFW1H9jfJeC+SnKkqmbGHcdKeA/9MOn3MMHxr3quA/NdH0x6/OA99MEEx2+u62iCf8bA5McP3kNfjPMeukwDPgxsS7I1yVk0H6yfHeozC+xut68G7qmqatt3tavKbQW2Af84mtAlaaTMdZKmgblO0sRY9MlqVZ1Kcj1wCNgAHKiqo0n2AUeqaha4BbgtyRzNX952tWOPJrkTeAA4BbzeFeMk9ZG5TtI0MNdJmiRp/lCmlUqyp53yMrG8h36Y9HuY9Pi1uEn/GU96/OA99MGkx6/FTfrPeNLjB++hL8Z5DxarkiRJkqTe6fKZVUmSJEmS1pTF6goluTDJXyd5MMnRJG8Yd0zLlWRDkvuT/Om4Y1mqJM9OcleSf2p/Ft867piWKslPtL9DH03y+0meMe6YFpPkQJJPJfnoQNuXJnlPkn9uv583zhg1Gua6/pj0fGeuU5+Z6/rDXLf2+pjrLFZX7hTwU1X19cCLgNcn2T7mmJbrDcCD4w5imX4d+POq+jrgm5iw+0hyAfBjwExVfQPNohe7xhtVJ78N7Bhq2wv8VVVtA/6q3dfkM9f1x8TmO3OdJoC5rj/MdWvvt+lZrrNYXaGq+mRV3ddu/wfNP6QLxhvV0iXZDFwJvHPcsSxVki8BXkKzeiFV9URV/ft4o1qWjcAXp3mn3Tmc4d11fVJVf0uzUuSgncCt7fatwCvXNCitCnNdP6yTfGeuU2+Z6/rBXDcefcx1FqsjlGQL8Hzg3vFGsixvB94IPDXuQJbhq4ETwG+1013emeSZ4w5qKarqE8CvAR8HPgk8VlV/Md6olu3Lq+qT0PxPH/iyMcejETPXjdVE5ztznSaJuW6szHX9MdZcZ7E6IkmeBbwb+PGq+uy441mKJN8DfKqqPjDuWJZpI/AC4Der6vnAfzJh07Ha+f87ga3AVwLPTPID441K+kLmurGb6HxnrtOkMNeNnblOgMXqSCT5IpqE9rtV9YfjjmcZXgxcleQh4HbgZUneNd6QlmQemK+q03/5vIsmwU2S7wL+papOVNX/AH8IfNuYY1quf0vyFQDt90+NOR6NiLmuFyY935nr1Hvmul4w1/XHWHOdxeoKJQnNfPoHq+qt445nOarqTVW1uaq20Hz4+56qmpi//lTVvwIPJ/natuly4IExhrQcHwdelOSc9nfqciZoIYEhs8Dudns38CdjjEUjYq7rh3WQ78x16jVzXT+Y63plrLlu41pebJ16MfCDwEeSfLBt+9mqOjjGmKbRjwK/m+Qs4Djww2OOZ0mq6t4kdwH30axEeD+wf7xRLS7J7wMvBZ6TZB54M3AjcGeS62iS9TXji1AjZK7rj4nNd+Y6TQBzXX+Y69ZYH3NdqmotrydJkiRJ0qKcBixJkiRJ6h2LVUmSJElS71isSpIkSZJ6x2JVkiRJktQ7FquSJEmSpN6xWJUkSZIk9Y7FqiRJkiSpdyxWJUmSJEm9878dwGgPC5x0OQAAAABJRU5ErkJggg==\n", 132 | "text/plain": [ 133 | "
" 134 | ] 135 | }, 136 | "metadata": { 137 | "needs_background": "light" 138 | }, 139 | "output_type": "display_data" 140 | } 141 | ], 142 | "source": [ 143 | "n = 1\n", 144 | "tau_vals = [0.01, 0.1, 0.5, 1, 5, 10]\n", 145 | "plt.figure(figsize=(16,8))\n", 146 | "for i in range(1, 7):\n", 147 | " plt.subplot(230+i)\n", 148 | " z = sample_gumbel_softmax(pi=pi, n=n, temperature=tau_vals[i-1])\n", 149 | " plt.bar(np.arange(k)+1, z.flatten().numpy())\n", 150 | " plt.title('Temperature: {}'.format(tau_vals[i-1]))\n", 151 | "# plt.ylim(0,1)" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "## Categorical" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 8, 164 | "metadata": {}, 165 | "outputs": [ 166 | { 167 | "data": { 168 | "text/plain": [ 169 | "tensor([[0.1025, 0.0903, 0.0866, 0.0934, 0.1095, 0.0930, 0.1066, 0.0925, 0.1192,\n", 170 | " 0.1064]])" 171 | ] 172 | }, 173 | "execution_count": 8, 174 | "metadata": {}, 175 | "output_type": "execute_result" 176 | } 177 | ], 178 | "source": [ 179 | "z" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 9, 185 | "metadata": {}, 186 | "outputs": [ 187 | { 188 | "data": { 189 | "text/plain": [ 190 | "" 191 | ] 192 | }, 193 | "execution_count": 9, 194 | "metadata": {}, 195 | "output_type": "execute_result" 196 | }, 197 | { 198 | "data": { 199 | "image/png": "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\n", 200 | "text/plain": [ 201 | "
" 202 | ] 203 | }, 204 | "metadata": { 205 | "needs_background": "light" 206 | }, 207 | "output_type": "display_data" 208 | } 209 | ], 210 | "source": [ 211 | "z = torch.distributions.Categorical(probs=pi).sample((n,)).float()\n", 212 | "one_hot = torch.zeros(n,k)\n", 213 | "one_hot[range(n),z.long()] = 1\n", 214 | "plt.bar(np.arange(k)+1, one_hot.mean(dim=0).numpy())\n", 215 | "# plt.ylim(0,1)" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": {}, 221 | "source": [ 222 | "# Expectation" 223 | ] 224 | }, 225 | { 226 | "cell_type": "markdown", 227 | "metadata": {}, 228 | "source": [ 229 | "## Gumbel-softmax" 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": 10, 235 | "metadata": { 236 | "scrolled": false 237 | }, 238 | "outputs": [ 239 | { 240 | "data": { 241 | "image/png": "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\n", 242 | "text/plain": [ 243 | "
" 244 | ] 245 | }, 246 | "metadata": { 247 | "needs_background": "light" 248 | }, 249 | "output_type": "display_data" 250 | } 251 | ], 252 | "source": [ 253 | "n = 1000\n", 254 | "tau_vals = [0.01, 0.1, 0.5, 1, 5, 10]\n", 255 | "plt.figure(figsize=(16,8))\n", 256 | "for i in range(1, 7):\n", 257 | " plt.subplot(230+i)\n", 258 | " z = sample_gumbel_softmax(pi=pi, n=n, temperature=tau_vals[i-1])\n", 259 | " plt.bar(np.arange(k)+1, z.mean(dim=0).numpy())\n", 260 | " plt.title('Temperature: {}'.format(tau_vals[i-1]))\n", 261 | "# plt.ylim(0,1)" 262 | ] 263 | }, 264 | { 265 | "cell_type": "markdown", 266 | "metadata": {}, 267 | "source": [ 268 | "## Categorical" 269 | ] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "execution_count": 11, 274 | "metadata": {}, 275 | "outputs": [ 276 | { 277 | "data": { 278 | "text/plain": [ 279 | "" 280 | ] 281 | }, 282 | "execution_count": 11, 283 | "metadata": {}, 284 | "output_type": "execute_result" 285 | }, 286 | { 287 | "data": { 288 | "image/png": "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\n", 289 | "text/plain": [ 290 | "
" 291 | ] 292 | }, 293 | "metadata": { 294 | "needs_background": "light" 295 | }, 296 | "output_type": "display_data" 297 | } 298 | ], 299 | "source": [ 300 | "z = torch.distributions.Categorical(probs=pi).sample((n,)).float()\n", 301 | "one_hot = torch.zeros(n,k)\n", 302 | "one_hot[range(n),z.long()] = 1\n", 303 | "plt.bar(np.arange(k)+1, one_hot.mean(dim=0).numpy())\n", 304 | "# plt.ylim(0,1)" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": null, 310 | "metadata": {}, 311 | "outputs": [], 312 | "source": [] 313 | } 314 | ], 315 | "metadata": { 316 | "kernelspec": { 317 | "display_name": "Python 3", 318 | "language": "python", 319 | "name": "python3" 320 | }, 321 | "language_info": { 322 | "codemirror_mode": { 323 | "name": "ipython", 324 | "version": 3 325 | }, 326 | "file_extension": ".py", 327 | "mimetype": "text/x-python", 328 | "name": "python", 329 | "nbconvert_exporter": "python", 330 | "pygments_lexer": "ipython3", 331 | "version": "3.7.2" 332 | } 333 | }, 334 | "nbformat": 4, 335 | "nbformat_minor": 2 336 | } 337 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gumbel-softmax-pytorch 2 | categorical variational autoencoder using the Gumbel-Softmax estimator 3 | 4 | 5 | Paper is here: https://arxiv.org/abs/1611.01144 6 | --------------------------------------------------------------------------------