{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Probabilistic Data Structures for Realtime Analytics

\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# About me\n", " * My name is Martin Laprise (@mlaprise)\n", " * Algorithms Lead @ Parse.ly\n", " * Discovered Parse.ly @ PyData 2012 !" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Parse.ly\n", "\n", "* Parse.ly --> analytics company\n", "* Dash is a analytics dashboard for big news providers\n", " - The Atlantic, Mashable, Arstechnica\n", " - etc.\n", "* Multiple realtime metrics\n", " - PVs\n", " - Uniques\n", " - Social\n", " - etc.\n", "* Content Analysis on the publisher content\n", "* Recommendation API\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Parse.ly as a stream processor\n", "\n", "* Input: Stream of events from all our publishers (js code)\n", "* Output: Insighful metrics and analysis\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Data Stream Model\n", "\n", "* All this with those constraints:\n", " - Computed \"on the fly\" (realtime-ish)\n", " - Sequential order\n", " - Single pass on a the data\n", " - Can't iterate over the entire dataset\n", "* Probabilitics data structure are very useful in this context\n", "* Data Stream Model\n", " - Necessary even if you're not realtime (scalability)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Probabilitics data structure\n", "\n", "* No Uber-Datastructure, pick the right one.\n", "* more actionable to know a bunch of them\n", "* Overview of:\n", " - Bloom Filter\n", " - Temporal Bloom Filter\n", " - Count-Min Sketch\n", " - HyperLogLog\n", "* Easy to implemented... harder to understand \n", "* https://github.com/Parsely/python-pds.git\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pattern: Have we met before ?\n", "\n", "* Trigger an action when you see an item for the first time\n", "* Ex:\n", " - We see an url for the first time --> Crawl the link\n", " - We see a social network as a referrer --> fetch the number of share\n", "* Look at ALL items in the stream\n", "* Can't query the databases every time\n", "* Need to have an in-memory data structure\n", " - Python Set,\n", " - Set in a Redis database , etc...\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "known_urls = set()\n", "\n", "known_urls.add('http://www.google.com')\n", "known_urls.add('http://www.pydata.org')\n", "\n", "known_urls2 = set()\n", "known_urls2.add('http://www.python.org')" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "'http://www.pydata.org' in known_urls # Membership" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ "True" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "print len(known_urls) # Cardinality" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "2\n" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "'http://www.pydata.org' in (known_urls or known_urls2) # Union" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "True" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "'http://www.pydata.org' in (known_urls and known_urls2) # Intersection" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "False" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "print known_urls # Retrieve the actual content" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "set(['http://www.google.com', 'http://www.pydata.org'])\n" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "known_urls.discard('http://www.google.com') # Delete an element in the set" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 43 }, { "cell_type": "code", "collapsed": false, "input": [ "print known_urls" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "set(['http://www.pydata.org'])\n" ] } ], "prompt_number": 44 }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Do we really need all those query ? -> Most of time : not really\n", "* Can I estimate some of them ?\n", "* pds typically built for one specific kind of query" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Typical implementation on a set\n", "\n", "## Hashtable\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* HashTable:\n", " - Multiple buckets\n", " - Good hash function (ex: 32-bits murmur hash)\n", " - Collision resolution (ex: linked list)\n", " \n", "* Available Query:\n", " - Membership\n", " - Cardinality\n", " - Union, Intersection\n", " - Retrieve values\n", " - Delete an items\n", " \n", " \n", "* **Good**:\n", " - Can solve most of your problem !\n", " - Speed\n", " - CPU : $ M \\sim O\\left( 1 \\right) $\n", " - Can retrieve data\n", " - No error\n", "\n", "* **Limitation**:\n", " - Memory: $ M \\sim O\\left( c \\cdot n \\cdot log(N) \\right) $" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import sys,os" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "capacities = np.linspace(100,int(1E9))\n", "typical_url = 'http://arstechnica.com/science/2013/10/new-type-of-quantum-excitation-behaves-like-a-solitary-particle/'\n", "memory_footprint = len(typical_url) * 8\n", "memory_scaling = [memory_footprint * c for c in capacities]\n", "\n", "plt.plot(capacities, [((n / (8))) / (1024 * 1024 * 1024) for n in memory_scaling])\n", "plt.grid()\n", "plt.title('Memory consumption for a set')\n", "plt.xlabel('Nbr. of items')\n", "plt.ylabel('Memory consumption in GB')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEVCAYAAAD6u3K7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlcVPX6wPEPuOeKG6iouCEqCLikaBZmWFqo11KzVFxK\nbTMs90rRFrG0q+mtX9dQscysLLXrminuSyW474IYKqnsgiDw/f1xckaUTYaZMwPP+/XydT0zwzmP\nz53Ow/mudkophRBCCHEPe70DEEIIYZ2kQAghhMiVFAghhBC5kgIhhBAiV1IghBBC5EoKhBBCiFxJ\ngRDCivXu3Zuvv/662M+blpaGv78/NWrUYNCgQcV+flEySIEo4VxcXKhQoQI3btzI8bq3tzf29vZE\nR0frFJm4V1BQEEOHDs3x2oYNG+57rTj8+OOP/P3338TFxbFq1apiP785REVFYW9vT3Z2tt6hlBpS\nIEo4Ozs7mjZtysqVKw2vHT16lLS0NOzs7HSMTJOZmal3CKXSxYsXcXV1xd7+wW8Bev9/JnN7LUcK\nRCkwZMgQli9fbjgODQ1l2LBhOf5DS09PZ8KECTRu3BgnJydeeeUVbt26BUBYWBjOzs588skn1K1b\nl/r167NmzRo2bNiAq6srtWrVIjg4OMe5AgMDadCgAQ0aNGD8+PFkZGTkONfHH39MvXr1GDlyJB4e\nHvzvf/8z/Pzt27epXbs2hw8fzvXfs3btWry8vKhevTrNmzdn8+bNAFy+fJk+ffpQq1YtWrRowVdf\nfWX4maCgIAYOHEhAQADVqlXD3d2dP//80/D+nDlzcHZ2plq1ari5ubF9+3YAhg8fznvvvWf4XFhY\nGA0bNjQcu7i4MHfuXNq2bUvVqlUZNWoUsbGx9OrVi+rVq+Pn50dCQgJg/A148eLFNGjQgPr16zNv\n3jwANm3axOzZs1m1ahVVq1bF29sbAF9fX0JCQgDtxvjBBx/g4uKCo6MjAQEBJCUl5Tj38uXLady4\nMXXq1OGjjz7KNX8zZszg/fffN1xr6dKlhTr3kiVLaNy4MU888cR950xISOCZZ56hbt261KxZE39/\nf2JiYnK9fm753rZtm+HfGBwcTPPmzalduzaDBg0iPj4egEcffRSAGjVqULVqVQ4cOJDn+UUxUaJE\nc3FxUVu3blUtW7ZUJ0+eVJmZmcrZ2VldvHhR2dnZqYsXLyqllAoMDFR9+/ZV8fHxKjk5Wfn7+6up\nU6cqpZTavn27Klu2rHr//fdVZmamWrx4sapVq5Z64YUXVEpKijp+/LiqVKmSioqKUkop9d577ykf\nHx917do1de3aNdWlSxf13nvv5TjXlClTVEZGhkpLS1Mff/yxGjRokCHmNWvWqLZt2+b67zlw4ICq\nXr262rp1q1JKqZiYGHXq1CmllFLdunVTr732mkpPT1cRERGqTp06atu2bUoppWbMmKEqVqyoNm7c\nqLKzs9XUqVNV586dlVJKnTp1SjVs2FBduXJFKaXUxYsX1fnz55VSSg0fPtwQ+534nZ2dc+TXx8dH\n/f333yomJkbVrVtXeXt7q4iICHXr1i31+OOPq5kzZyqllIqMjFR2dnbqhRdeUKmpqero0aOqTp06\nhn9LUFCQGjp0aI5/r6+vrwoJCVFKKRUSEqKaN2+uIiMjVUpKiurfv7/h83fOPXr0aHXr1i11+PBh\nVaFCBXXy5Mlc83jvtQpz7oCAAJWamqpu3bp13/lu3LihfvrpJ5WWlqaSk5PVgAEDVL9+/XK9dn75\nnj9/vvLx8VExMTEqIyNDjRkzRg0ePFgppVRUVJSys7NTWVlZuZ5XFD8pECXcnQLxwQcfqKlTp6qN\nGzeqnj17qszMTEOByM7OVpUrVzb8R6qUUnv37lVNmjRRSmk3xUqVKqns7GyllFJJSUnKzs5OHTx4\n0PD59u3bq7Vr1yqllGrWrJnauHGj4b3NmzcrFxcXw7nKly+v0tPTDe/HxMSoKlWqqOTkZKWUUs8+\n+6z65JNPcv33jB49Wr311lv3vR4dHa3KlCmjUlJSDK9NnTpVDR8+XCmlFQg/Pz/De3eKmlJKnT17\nVtWtW1dt3bpVZWRk5Djv8OHD1bvvvms4zq1AfPvtt4bjZ599Vr366quG44ULFxpulHdutKdPnza8\nP2nSJDVq1ChDjEOGDMlx/bsLxOOPP66++OILw3unT59W5cqVU1lZWYZzx8TEGN5/+OGH1XfffXdf\nrnK7VmHOHRkZmeu5chMeHq4cHBxyfS+/fLdq1Ur99ttvhuPLly/fF4cUCMuRJqZSwM7OjqFDh7Ji\nxYpcm5euXbtGamoq7du3x8HBAQcHB3r16sX169cNn6lVq5ahz6JSpUoAODo6Gt6vVKkSKSkpgNbU\n07hxY8N7jRo14vLly4bjOnXqUL58ecNx/fr16dq1Kz/++CMJCQls2rSJF198Mdd/y19//UWzZs3u\ne/3y5cvUrFmTypUr57ju3c0cd8f70EMPcevWLbKzs2nevDnz588nKCgIR0dHBg8ezJUrV/JK533u\nzcPdxxUrVjTk5Y67m6juzU1+rly5cl9eMzMziY2NNbzm5OSU49948+bNYjv33XHfKzU1lTFjxuDi\n4kL16tV57LHHSExMzLW/IL98R0VF8a9//cvwPWzdujVly5bNEYewHCkQpUSjRo1o2rQpGzdupH//\n/jneq127NpUqVeLEiRPEx8cTHx9PQkKCoQ36QdWvX5+oqCjDcXR0NPXr1zcc59Y5HhAQwDfffMMP\nP/xAly5dqFevXq7nbtiwIefOncv1mnFxcTluxtHR0Tg7Oxcq5sGDB7Nr1y4uXryInZ0dkydPBqBy\n5cqkpqYaPnf16tUCz5XbTfFud48ci46OpkGDBkDueblbbnktW7ZsjoJUWPdeqzDnzi++efPmcebM\nGQ4ePEhiYiI7duxAaS0UuX4+r3w3atSITZs2Gb6H8fHxpKamUq9ePasYVFHaSIEoRUJCQti2bZvh\nCeAOe3t7Xn75ZQIDA7l27RoAMTExbNmypUjXGTx4MB988AHXr1/n+vXrzJo1q8Chmv/61784dOgQ\nn332GcOGDcvzc6NGjWLp0qVs27aN7OxsYmJiOH36NA0bNqRLly5MnTqV9PR0jhw5wpIlSxgyZEiB\n8Z45c4Zt27aRnp5OhQoVqFixImXKlAHAy8uLDRs2EB8fz9WrV5k/f/6DJSMXH3zwAWlpaRw/fpxl\ny5YZ5iE4OTkRFRWV70313//+N1FRUaSkpDBt2jSef/75fEci5XWue18vyrnvlpKSQqVKlahevTpx\ncXHMnDkzz8/ml++xY8cybdo0QxG9du0a69atA7QnT3t7e86fP1+omITppECUIk2bNqVdu3aG47t/\nI5szZw7Nmzenc+fOhtE3Z86cyfWzuR3f7d1336VDhw60bduWtm3b0qFDB9599918f7ZixYr079+f\nqKio+55w7taxY0eWLl3K+PHjqVGjBr6+voabycqVK4mKiqJ+/fr079+fWbNm8fjjjxuumde/IT09\nnalTp1KnTh3q1avH9evXmT17NgBDhw7F09MTFxcXnnrqKZ5//vkCf5O9+/3crvvYY4/RvHlznnji\nCSZOnGgYFTRgwABAa87r0KHDfecdOXIkQ4cO5dFHH6Vp06Y89NBDLFy4MNfr5vdabnEV5dx3CwwM\n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\nEEIIkav/B9Omp6OHKeXjAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 46 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Almost-correct hashtable for membership\n", "\n", "* What if we only need to do a membership query ? (no cardinality, no content)\n", "* We can afford some errors\n", "* Transform a classical hashtable to a more lightweith structure (with error):\n", " - Don't store the content !" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from hashfunctions import generate_hashfunctions" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 47 }, { "cell_type": "code", "collapsed": false, "input": [ "class LightweightHashtable(object):\n", " \"\"\" Almost-correct hashtable for membership query only \"\"\"\n", "\n", " def __init__(self, nbr_buckets=10):\n", " self.bitarray = [0] * nbr_buckets\n", " self.hashfunction = generate_hashfunctions(nbr_buckets,1)\n", "\n", " def add(self, element):\n", " self.bitarray[self.hashfunction(element)[0]] = 1\n", "\n", " def __contains__(self, element):\n", " \"\"\" Membership query \"\"\"\n", " return self.bitarray[self.hashfunction(element)[0]] == 1" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "s = LightweightHashtable(10)\n", "for i in range(10):\n", " s.add(str(i))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 110 }, { "cell_type": "code", "collapsed": false, "input": [ "s.bitarray" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 111, "text": [ "[1, 1, 0, 1, 1, 0, 0, 1, 1, 1]" ] } ], "prompt_number": 111 }, { "cell_type": "code", "collapsed": false, "input": [ "'1' in s # Membership query available" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "True" ] } ], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "'105' in s" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 52, "text": [ "False" ] } ], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "'22' in s # False positive" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ "True" ] } ], "prompt_number": 53 }, { "cell_type": "markdown", "metadata": {}, "source": [ "* False positive --> no collision resolution\n", "* How can we reduce the amount of false positives ?\n", " - Increase the number of bits (M)\n", " - Use multiple hash functions (k)\n", "* Lightweight hash tables with optimal k and M values -> Bloom Filter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bloom Filter\n", "\n", "
\n", "\n", "* Procedure:\n", " 1. We instantiate a array of bit initialized to zero\n", " 2. Hash the content using k hash functions\n", " 2. Each filter updates set the bit in the **k positions**\n", " 3. Membership if all bit are set" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Classical Bloom Filter use a single bitarray with multiple hash\n", "* Popular variant: partitioning the M bits among the k hash functions:\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* How many hash functions should I use ?\n", " - Using many hash should decrease error no ?\n", " - Probability of error(collisation) $ \\approx $ number of 1 in the array\n", " - Multiple hash is good (error rate) ... up to a point of diminishing return\n", " - For a limited amount of bits: there is optimal number of hash functions\n", " \n", "\n", "* In this variant the optimal numder of hashes for a specific error rate P is $ k = log_2 \\left( \\frac{1}{P} \\right) $\n", "\n", "\n", "* If we want to store $n_{max}$ with a an error rate P, the optimal number of bits per slice is: $ m = \\frac{n_{max} \\cdot |ln(P)|}{k \\cdot (ln(2))^2} $\n", " - Important: capacity $n_{max}$\n", " - $n_{max}$ : half of the bit are 1" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class BloomFilter(object):\n", " \"\"\" Basic Bloom Filter \"\"\"\n", "\n", " def __init__(self, capacity, error_rate):\n", " self.error_rate = error_rate\n", " self.capacity = capacity\n", " self.nbr_slices = int(np.ceil(np.log2(1.0 / error_rate)))\n", " self.bits_per_slice = int(np.ceil((capacity * abs(np.log(error_rate))) / (self.nbr_slices * (np.log(2) ** 2))))\n", " self.nbr_bits = self.nbr_slices * self.bits_per_slice\n", " self.bitarray = np.zeros(self.nbr_bits, dtype=np.bool)\n", " self.count = 0\n", " self.hashes = generate_hashfunctions(self.bits_per_slice, self.nbr_slices)\n", " self.hashed_values = []\n", "\n", " def __contains__(self, key):\n", " \"\"\" Membership query \"\"\"\n", " self.hashed_values = self.hashes(key)\n", " offset = 0\n", " for value in self.hashed_values:\n", " if not self.bitarray[offset + value]:\n", " return False\n", " offset += self.bits_per_slice\n", " return True\n", "\n", " def add(self, key):\n", " \"\"\" Add an item to the set \"\"\"\n", " if key in self:\n", " return True\n", " offset = 0\n", " if not self.hashed_values:\n", " self.hashed_values = self.hashes(key)\n", " for value in self.hashed_values:\n", " self.bitarray[offset + value] = True\n", " offset += self.bits_per_slice\n", " self.count += 1\n", " return False" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 54 }, { "cell_type": "code", "collapsed": false, "input": [ "bf = BloomFilter(1000, 0.1)\n", "\n", "random_items = [str(r) for r in np.random.randn(20000)]\n", "for item in random_items[:1000]:\n", " bf.add(item)\n", " false_positive = 0\n", "for item in random_items[1000:20000]:\n", " if item in bf:\n", " false_positive += 1\n", "\n", "print \"Error rate (false positive): %s\" % str(float(false_positive) / 19000)\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Error rate (false positive): 0.105315789474\n" ] } ], "prompt_number": 55 }, { "cell_type": "markdown", "metadata": {}, "source": [ "* **Good**:\n", " - Memory: $ M \\approx O\\left( n \\cdot k \\cdot log (error) \\right) $\n", " - CPU: $ M \\approx O\\left( k \\right) $\n", " - Intersection and Union possible by bitwise AND & OR\n", "\n", "\n", "* **Limitation**:\n", " - False positive answer (no false negative): the BF will return a membership when there is not\n", " - Can't retrieve data.\n", " - Can't delete item (because of the hash collision) -> possible solution **Counting Bloom Filter**\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pattern: Have we met before ? (with ttl)\n", "\n", "Trigger an action when you see an item for the first in a given time period\n", "\n", "* Ex:\n", " - Perform a expensive procesing each hours for each url\n", " - New vs returning visitor (30 mins session)\n", " - Any duplicate detection on **unbounded data stream** (and limited amount of memory)\n", " - Filling ratio goes up, precision goes down\n", " \n", "* Two choices:\n", " - Landmark window (each hours of the day) -> easy: reset the bloom filter periodically \n", " - Sliding window (last 30 mins) -> \"interesting\"\n", " \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bloom Filter with expiration\n", "\n", "* Naive implementation\n", " - Some magic combination of plain BF\n", " - ex: rotating pool of BFs (good tech interview question !)\n", " - ok, let store a timestamp instead of a bit: Time-Stamp Bloom Filter\n", " - membership by comparing the new timestamp with the stored timestamp\n", " - if non membership ($ts_2$ < $ts_1$) -> reset to zero\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def mem_vs_errors_and_capacity(error=0.01, capacity=10000, bit_mul = 1):\n", " nbr_slices = int(np.ceil(np.log2(1.0 / error)))\n", " bits_per_slice = int(np.ceil((capacity * abs(np.log(error))) / (nbr_slices * (np.log(2) ** 2))))\n", " mem = float(((nbr_slices*bits_per_slice) / (8))) / (1024 * 1024 * 1024) * bit_mul\n", " return mem\n", "\n", "errors = [0.01,0.02,0.03,0.05]\n", "capacities = np.linspace(100,int(1E9))\n", "mems = np.zeros((len(errors), len(capacities)))\n", "\n", "for e,error in enumerate(errors):\n", " for c,capacity in enumerate(capacities):\n", " mems[e,c] = mem_vs_errors_and_capacity(error, capacity)\n", "\n", "for e,error in enumerate(errors):\n", " plt.plot(capacities,mems[e])\n", "plt.grid(True)\n", "plt.legend([str(item) for item in errors], loc=0)\n", "plt.xlabel('Capacity')\n", "plt.ylabel('Memory Consumtion [Gb]')\n", "plt.title('Memory Consumption for a plain Bloom Filter')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nLMUO1AnMAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 56 }, { "cell_type": "code", "collapsed": false, "input": [ "for e,error in enumerate(errors):\n", " for c,capacity in enumerate(capacities):\n", " mems[e,c] = mem_vs_errors_and_capacity(error, capacity, 64)\n", "\n", "for e,error in enumerate(errors):\n", " plt.plot(capacities,mems[e])\n", "plt.grid(True)\n", "plt.legend([str(item) for item in errors], loc=0)\n", "plt.xlabel('Capacity')\n", "plt.ylabel('Memory Consumtion [Gb]')\n", "plt.title('Memory Consumption for a Bloom Filter (with timestamp)')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 57, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEXCAYAAACgUUN5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXdYFFcXh38riEhd+ooFRBAVRLHEFgVjSKLGHrsgSmI0\namJirFGKWMAWE43RKFE0lvglMbFjgbXGLqiIKCjYFlDpdVn2fH9MWEDaAtuQ+z4Pj87MnXvPnJm9\nZ+bce8/hERGBwWAwGA2WRuoWgMFgMBjqhRkCBoPBaOAwQ8BgMBgNHGYIGAwGo4HDDAGDwWA0cJgh\nYDAYjAYOMwQMheHs7Ixz584pvN7k5GT069cPRkZGmDdvnsLrryvu7u4ICQlRtxgVsmfPHnz44Yey\n7UaNGuHRo0dKbTMsLAwjRoyo0TlPnjyBoaEhqprNXlfZBw0ahN27d9f6/PrG7du30adPH7nKaoQh\nsLW1RZMmTfD69esy+11dXdGoUSM8efJETZLVnszMTMyZMwc2NjYwNDSEvb09vv7663LXWF/x9vbG\n0qVLy+y7e/cu+vXrp/C2fvnlF1haWiIzMxNr1qxReP3V0ahRIxgYGMDQ0BAWFhaYMGECMjIyZMd5\nPB54PJ7K5SqNUChEo0aNYGhoKPsbNmwYJk6ciLCwsArPqegeKoLvvvsOixYtqtE5rVq1QlZWlkyP\ndTWu/v7+8PT0LLPv2LFj5fYpG1tbW4SHh6u0zWJcXFzA5/Nx5MiRastqhCHg8Xiws7PDvn37ZPvu\n3LmDvLw8tf/AAEAikdSovFgsxoABAxATE4OwsDBkZWXh33//hbm5Oa5evaokKd9eEhMT0b59+1qd\nW9N7Vxm3b99GVlYWHj16hLS0NPj7+yukXkXSvHlzZGVlyf7++ecfpbZXVFRUbt+1a9eQmZmJd955\np051a8LvXhHweLwqv3KUzcSJE7F169bqC5IGYGtrS8uXL6fu3bvL9s2dO5dWrFhBPB6PEhMTiYgo\nPz+f5s6dS61atSIrKyuaPn065eXlERFRREQENW/enFavXk0WFhbUrFkzOnjwIB09epQcHBzI1NSU\nVq1aJas/Pz+fvvrqK7K2tiZra2uaM2cOFRQUlKkrODiYBAIBeXp6krOzMx0+fFh2vlgsJjMzM4qM\njCx3Pdu2bSMrKyvKycmp9Jrv3btHbm5uxOfzycnJiQ4dOiQ7NnnyZPriiy9o8ODBZGhoSD169KD4\n+HjZ8Tlz5pClpSUZGRlRx44dKTo6moiI3NzcaPv27bJyO3bsoHfffVe2zePxaPPmzWRvb0+Ghoa0\ndOlSiouLo549e5KxsTGNHTuWxGJxGR2sXLmSzM3NydbWlvbs2UNERFu3bqXGjRuTjo4OGRgY0NCh\nQ4mIyMbGhk6fPi23ftetW0eWlpbUrFkz2rFjR4V6mjx5cpm2zpw5QwUFBXLfOy8vr3J1xsXFUf/+\n/cnMzIzMzc1p4sSJlJ6eXum94vF4ZfT/008/0QcffCDbdnd3p5CQECIikkqlFBgYSDY2NmRpaUle\nXl6UkZEhK/vPP/9Qhw4diM/nk7u7O8XExMiO2djY0Jo1a6hjx45kYGBAU6dOpaSkJProo4/IyMiI\n3n//fUpLS6tQxoiICGrRokW5/RU9A/Hx8ZXew+fPn9PIkSPJwsKCWrduTT/++KPsXD8/Pxo1ahRN\nmjSJjIyMZNdcmoCAAPrss89k276+vjR79mwi4n4zenp6NG/ePCIiys3NpSZNmlBaWho9fvyYeDwe\nSSQSWrx4MWlpaZGuri4ZGBjIzufxeLRlyxZycHAgPp9PM2fOrFAXx48fJx0dHWrcuDEZGBhQ586d\niajs72PHjh3Uu3dv+vrrr4nP51ObNm3o4sWL9Ouvv1LLli3J0tKSQkNDZXVW1fe8fPmSBg8eTHw+\nn0xNTalv374klUpp0qRJ1KhRI2ratCkZGBjQmjVriIjok08+IYFAQMbGxtSvXz/Z75eIe95nzJhB\nAwcOJAMDA3r33XdJJBLRl19+SXw+n9q1a0e3bt2SlbexsaFVq1ZRhw4dyMTEhKZMmUL5+fmy48+e\nPaOmTZvKfteVoTGG4PTp0+To6EgxMTEkkUioRYsWlJiYWMYQzJkzh4YNG0ZpaWmUlZVFQ4YMoUWL\nFhER90PQ1tamwMBAkkgktG3bNjIzM6MJEyZQdnY2RUdHU9OmTSkhIYGIiJYuXUq9evWily9f0suX\nL6l37960dOnSMnUtXLiQxGIx5eXl0erVq2ns2LEymf/++29ycXGp8HrGjh1L3t7elV6vWCymNm3a\n0KpVq6iwsJDCw8PJ0NCQYmNjiYh7GMzMzOjatWskkUho4sSJNG7cOCIiOnHiBHXt2lXWudy/f59E\nIhERle2QiCruBIYPH05ZWVkUHR1NOjo61L9/f3r8+DFlZGRQhw4dZA9/sQ7mzp1LYrGYzp49S/r6\n+vTgwQMiIvL29pbpq/R9PHPmjNz69fPzI4lEQseOHSM9Pb1KO+M326rpvXuTuLg4On36NInFYnr5\n8iX169eP5syZU+n94vF4FBcXR0REqamp5OHhQX5+frLjpfUeEhJC9vb29PjxY8rOzqaRI0eSp6cn\nERHFxsaSvr4+nT59miQSCa1evZrs7e2psLBQpr9evXpRSkoKPX/+nCwtLcnV1ZUiIyMpPz+f3nvv\nPQoICKhQxpoagor0WlRURF26dKHAwEAqLCykR48ekZ2dHYWFhRERZwgaN25M//zzDxFRhbodPXo0\nrV27VrYdHh5OHTt2JCKiixcvUps2bahHjx5ERHTmzBlZJ11sCIqKisrptLTsQ4YMoYyMDHry5AlZ\nWFjQiRMnKtSHv7+/TO/FlK5zx44dpK2tTTt37iSpVEpLliyh5s2b06xZs0gsFtPJkyfJ0NBQ9jJX\nVd+zcOFCmj59OkkkEpJIJHThwgVZm6V/E6XvSXZ2NonFYpozZ45MB0Tcb9/c3Jxu3rwpu+c2Nja0\ne/dumZz9+/eXlbexsaGOHTvSs2fPKDU1lfr06UNLliwp056RkRHduXOnQj0Vo1GGYPny5bRo0SI6\nfvw4ffDBBySRSGSGQCqVkr6+fpk3s0uXLlHr1q2JiPshNG3alKRSKRERZWZmEo/Ho6tXr8rKd+3a\nVfYQt2nTho4fPy47FhYWRra2trK6dHR0ZG+ZRNybkoGBAWVlZRER0ahRo2QW/k08PDxkD0lFnDt3\njgQCQZl948ePJ39/fyLiHobSb1XHjh2jdu3aERH342nbti1dvnxZ9qMpRh5DcOnSpTL6WL16tWx7\n7ty5sg6xuEPNzc2VHR8zZgwFBgbKZHzzgSv90Fen36ZNm5aR39LSkq5cuVKhvry9vcu0VdN7Vx0H\nDx4kV1fXSo/zeDwyMjIiPp9PWlpa1L59e3r+/LnseGm9v/fee/Tzzz/LjsXGxlLjxo1JIpHQsmXL\nyrxMSKVSat68OZ09e5aIOP3t3btXdnzUqFH0xRdfyLY3btxIw4cPr1DGiIgIatSoEfH5fNnfgQMH\naOfOnVUagtJ6vXz5MrVq1apMvStXrqQpU6YQEWcI3NzcKtUTEffsb926Vbadm5tLurq69Pr1awoK\nCqKVK1dSixYtKDs7m3x9femrr74ioooNQemv22LZL168KNseM2YMBQUFVSiHn58fTZo0qcy+Nw2B\ng4OD7Njt27eJx+NRSkqKbJ+ZmRlFRUVV2/f4+vrSsGHDZC8LpanIEJQmLS2NeDweZWZmEhF3T6ZN\nmyY7vnHjRurQoUMZOfl8fpn6S+v72LFj1KZNmzJtNG/enM6fP1+pDEREGjFGAHC+NE9PT+zZsweh\noaHw8vIq41t7+fIlcnNz0bVrV5iYmMDExAQDBw7Eq1evZGXMzMxkvsWmTZsCAKysrGTHmzZtiuzs\nbADAixcvYGNjIzvWqlUrvHjxQrZtYWEBHR0d2ba1tTX69OmDP/74A+np6Thx4gQmTpxY4bWYmZmV\nqetNXrx4gZYtW5bZZ2NjIzuHx+NVKvd7772HWbNmYebMmbCyssLnn3+OrKysStt6kzfrLb2tq6sr\nawcATExMZHosllEkEslkrIrq9GtmZoZGjUoePz09vTJt16XuN+/dmyQnJ2PcuHFo0aIFjI2N4enp\nWe0g/q1bt5CWlob8/HxMnz4dffv2hVgsLldOJBKVk00ikSA5ORkikQitWrWSHePxeGjZsiWeP38u\n21eT+/Mm1tbWSEtLk/2NHj26Rv7pxMREvHjxQvb7MjExwapVq5CSkiIr06JFiyrrMDExQWZmZplr\n6NatG86ePYtz587Bzc0NvXv3xsWLF2XblVHRMyYQCGT/r8kzUxFv6hrgnp3S+7Kzs6vte+bNmwd7\ne3t88MEHaNOmDYKDgyttUyqVYuHChbC3t4exsTFat24NAGX6MUtLS9n/dXV1y2yX7guKKd2XvPlb\nAICsrCzw+fwqdaExhgDgLsLOzg7Hjx/HyJEjyxwzNzdH06ZNce/ePdmDnp6eXuahqwnW1tZISEiQ\nbT958gTW1tay7YoewsmTJ+O3337D//73P/Tu3RvNmjWrsO73338fYWFhyM3NrbTtp0+flvmRJiYm\nonnz5nLJPnv2bFy/fh337t3DgwcPZDNp9PX1kZOTIyuXlJQkV33FvHnNaWlpZa4hMTFRpqPqDEF1\n+q0Ltbl3pVm8eDG0tLRw9+5dZGRkYPfu3ZBKpXK1ra2tDR8fHzx+/Bh3796VSzZtbW0IBAJYW1sj\nMTFRdoyI8PTp0yrve0068prypp5atWqF1q1blzEmmZmZslkn8syOcnFxwYMHD8rsc3Nzw5kzZ3Dr\n1i10794dbm5uOHHiBK5evVrpLLO6DhaXfsmoK9X1PQYGBli7di3i4+Nx6NAhrF+/HhEREQDKX8ee\nPXtw6NAhnDlzBhkZGXj8+DGAut3n0rMq3/wtPH/+HGKxGI6OjlXWoVGGAABCQkIQHh5e5k0U4G7s\nZ599hjlz5uDly5cAuIs8efJkrdoZP348li9fjlevXuHVq1dYtmxZtVPLRowYgZs3b+LHH3+El5dX\npeU8PT3RsmVLjBo1CrGxsZBKpXj9+jVWrlyJ48ePo2fPntDT08Pq1atRWFgIoVCII0eOYNy4cQCq\nfiiuX7+OK1euoLCwEHp6etDV1YWWlhYAoHPnzvjrr7+Ql5eHuLg4uabflW6ronb9/PxQWFiI8+fP\n4+jRoxg9ejQA7m2qqjndtdGvPDIqou7s7Gzo6+vDyMgIz58/l2tKarEMRUVF2LFjB/T09GBnZ1eu\n3Pjx4/H9998jISEB2dnZWLx4McaNG4dGjRph9OjROHr0KMLDw1FYWIh169ZBV1cXvXv3llt2RfLm\nPXznnXdgaGiI1atXIy8vD0VFRbh79y6uX78OQL7OatCgQTh79myZfW5ubti1axecnJzQuHFjuLu7\nY/v27bCzs4OZmVmlssXHx1fZVlXyWFlZISEhQSGGtLq+5+jRo4iLiwMRwcjICFpaWjJD9OZ1ZGdn\no0mTJjA1NUVOTg4WL14s9zVVBBFh8+bNeP78OVJTU7FixQpZPwIAZ8+exYABA9C4ceOqr7FGraoA\nOzs7dOnSRbZd2qIGBwfD3t4ePXv2hLGxMTw8PMq8fbxpfat6q1iyZAm6desGFxcXuLi4oFu3bliy\nZEmV5+rq6mLkyJFISEgo98VSGh0dHZw+fRrt2rWDh4cHjI2N0aNHD6SmpqJnz55o3LgxDh8+jOPH\nj8PCwgKzZs3C7t270bZtW1nblV1LZmYmpk2bBlNTU9ja2sLc3Fy2yOrrr7+Gjo4OrKysMGXKFEya\nNKlMPRVd05vHS28LBAKYmJjA2toanp6e2Lp1q0xGHx8f3Lt3DyYmJhXqojb6rYw35apr3X5+frh5\n8yaMjY0xZMgQjBo1qtpzOnXqBENDQ5iammL37t04ePBghZ/bU6dOhaenJ/r16wc7Ozvo6elh48aN\nAABHR0f89ttvmD17NiwsLHD06FEcPnwY2traVV57ZXqoqmxl55T+/5v3sFGjRjhy5AgiIyNhZ2cH\nCwsLTJs2TfbmK88XgaurK4yNjctMk+7Vqxfy8/Nlb//t27dH06ZNy30NlK77q6++wh9//AFTU1PM\nmTOn0uutTJ7iFxYzMzN069ZNrnOruraq+p6HDx/Cw8MDhoaG6N27N2bOnClzeS1atAjLly+HiYkJ\n1q9fDy8vL9jY2KB58+ZwdnZGr169qrzH1cnJ4/EwYcIEmVvKwcGhzG9hz549mD59eqXXJauHlPnt\n+RYSGBiIhw8fYteuXeoWRakIhUJ4enri6dOn6haFUc84deoUNm/ejIMHD6pblLee1q1bIyQkBO+9\n9165Y7dv38aMGTNw8eLFautR6hfBqlWr4OTkhI4dO2LChAkoKChAamoqPDw80LZtW3zwwQdIT09X\npggKJTU1Fb/++iumTZumblEYDI3Fw8ODGQENwMXFRS4jACjRECQkJGDbtm24efMm7ty5g6KiIuzf\nvx9BQUGyz6oBAwYgKChIWSIolG3btqFVq1YYOHAg3n33XXWLoxLeltWdDAajapTmGkpNTUWvXr1w\n+fJlGBoaYsSIEfjyyy8xe/ZsnD17FlZWVkhKSoK7uzvu37+vDBEYDAaDIQdK+yIwNTXF3Llz0apV\nK1hbW4PP58PDwwPJycmy+btWVlZITk5WlggMBoPBkIPKpyvUkfj4eGzYsAEJCQkwNjbG6NGj8dtv\nv5UpU9WoP3NLMBgMRu2oqaNHaV8E169fR+/evWFmZgZtbW2MHDkS//77LwQCgWyhk0gkKrNq7k2I\nC4HR4P/8/PzULoOm/DFdMF0wXVT9VxuUZgjatWuHy5cvIy8vD0SE06dPo0OHDhgyZAhCQ0MBAKGh\noRg+fLiyRHhrKL1StaHDdFEC00UJTBd1Q2muoU6dOsHLywvdunVDo0aN0KVLF0ybNg1ZWVkYM2YM\nQkJCYGtriwMHDihLBAaDwWDIgcYuKFN3QgdNQigUwt3dXd1iaARMFyUwXZTAdFFCbfpOZggYDAbj\nLaI2fafGxRqqDlNTU9lsI/bHg6mpqbpviUoRCoXqFkFjYLoogemibihtjEBZpKWlsS+FUrBptgwG\no67UO9cQcxmVhemDwWCUpkG4hhgMBoOhWJghYNQrmC+4BKaLEpgu6gYzBAwGg9HAYYZAgaSmpmLE\niBEwMDCAra0t9u3bV2nZ77//Hs2aNYOxsTF8fHzKJELftGkTunXrBl1dXUyZMkUVotcb2FzxEpgu\nSmC6qBvMECiQmTNnQldXFykpKdizZw9mzJiBe/fulSsXFhaG4OBghIeHIzExEY8ePYKfn5/sePPm\nzbF06VJMnTpVleIzGIwGCjMECiInJwd//fUXAgMDoaenhz59+mDYsGHYvXt3ubKhoaH49NNP0b59\ne/D5fPj6+mLnzp2y4yNGjMCwYcMqTezdkGG+4BKYLkpguqgbzBAoiAcPHkBbWxv29vayfZ06dUJ0\ndHS5svfu3UOnTp1k2y4uLkhOTkZaWlqZcmxaKIPBUAVvnSHg8RTzV1Oys7NhZGRUZp+hoSGysrIq\nLGtsbCzbLj7vzbJssVh5mC+4BKaLEpgu6ka9W1lcHep6iTYwMEBmZmaZfRkZGTA0NKy2bEZGBgCU\nK8u+CBgMhip4674I1EXbtm0hkUgQFxcn2xcVFQVnZ+dyZZ2cnBAZGVmmnJWVFUxMTMqUY18E5WG+\n4BKYLkpguqgbzBAoCH19fYwcORK+vr7Izc3FhQsXcPjwYXh6epYr6+XlhZCQEMTExCAtLQ2BgYFl\npokWFRUhPz8fEokERUVFKCgoQFFRkSovh8FgNCRIQ6lMNA0WmVJTU2n48OGkr69PNjY2tG/fPiIi\nSkxMJAMDA3r69Kms7Pr168nKyoqMjIxo6tSpJBaLZcf8/PyIx+OV+QsICKiwTU3WB4PBUD216RNY\n0Ll6DtMHg8EoDQs6x3jrYb7gEpguSmC64CgVoKBGMEPAYDAY9ZyiImDrVqDUMqYaoVTXUGxsLMaN\nGyfbfvToEQIDAzFp0iSMHTsWiYmJsgT2fD6/rGDMNSQXTB8MRsPm8mVg1ixAVxfYtAlwddXgnMVS\nqRTNmzfH1atXsXHjRpibm2P+/PkIDg5GWloagoKCygrGDIFcMH0wGA2TlBRg0SLg+HEgOBiYNKl4\nQawGjxGcPn0a9vb2aNmyJQ4dOoTJkycDACZPnoy///5bVWIw6jnMF1wC00UJDUkXEgn35u/kBPD5\nwP37gKdn7SIiFKOylcX79+/H+PHjAQDJycmwsrICAFhZWSE5OVlVYjAYDEa95fx5zg1kZgYIhZwx\nUAQqMQRisRiHDx9GcHBwuWM8Hq/SFbTe3t6wtbUFAPD5fHTu3FmZYtZrit+IimOusO2GsV2Mpsij\nru3ifZoij6K3//xTiK1bgZgYd6xdC1haCvHyJQC4QygUyqIXF/eXNUUlYwT//PMPfv75Z5w4cQIA\n0K5dOwiFQggEAohEIvTv3x/3798vKxgbI5ALpg8G4+2lsBD48Udg1Srgs8+A774DDAyqPkdjxwj2\n7dsncwsBwNChQxEaGgqAi80/fPhwVYjBeAt48024IcN0UcLbqIszZ4BOnYBTp4BLlzhjUJ0RqC1K\nNwQ5OTk4ffo0Ro4cKdu3cOFCnDp1Cm3btkV4eDgWLlyobDFUgiJSVYrFYvj4+MDW1hZGRkZwdXWV\nfUkxGIy3n6dPgbFjAR8fYOVKblZQ27ZKbrQOIS2USmWiabDING7cOBo3bhzl5OTQhQsXyNjYmKKj\no8uVO3HiBFlZWdG9e/coLS2N3N3daeHChURElJOTQ/7+/pSYmEhEREeOHCFDQ0NKSEiosE1N1geD\nwZCf/HyilSuJTE2JfH2JcnJqV09t+gQWa0hB5OTkwNTUFNHR0bIsZZMnT4a1tTVWrVpVpuyECRNg\nZ2eH5cuXAwAiIiIwYcIEiESiCuvu1KkT/P39MWLEiHLHNFUfDAZDfk6cAL78EmjXDtiwAbCzq31d\nGjtG0BBQRqpKgJtq++DBAzgpap5YPedt9AXXFqaLEuqrLh4/BoYP56aEfv89cOhQ3YxAbXnrMpTx\nAhSTzIX8amZRFZWqsnRymsLCQkycOBHe3t5oq3QnIYPBUBV5ecDq1cDGjcA33wD793MhItTFW2cI\natqBKwpFp6qUSqXw9PSErq4uNm3apCSp6x8sN20JTBcl1BddEAGHDwNz5gBduwI3bwKtWqlbKuYa\nUhiKTFVJRPDx8cHLly/x559/QktLS/kXwGAwlMrDh8DgwcCCBVyk0P/9TzOMAMAMgcJQZKrKGTNm\n4P79+zh06BCaNGmiysvQeOqrL1gZMF2UoMm6yMnhFoL16gW89x4QFQV4eKhbqrIwQ6BANm/ejLy8\nPFhaWmLSpEnYsmUL2rdvjydPnsDQ0BDPnj0DAHz44YeYP38++vfvD1tbW7Rp0wYBAQEAgMTERPzy\nyy+IioqCQCCAoaEhDA0Nq1yTwGAwNA8i4I8/gA4dgIQEzgB8+y2go6NuycrDpo/Wc5g+GAzNIyYG\nmD0bSE7mIoW6uamubTZ9lMFgMNRIVhYwbx7Qrx8wdChw65ZqjUBtYYaAUa/QZF+wqmG6KEHduiAC\n9uzhFoS9egXcvcstENOuJ/My64mYDAaDoZncvs25gbKyuJlAvXurW6Kaw8YI6jlMHwyGekhPB/z8\ngH37gIAAYNo0QBNmerMxAgaDwVAyUimwYwfQvj2Qnw/cuwfMmKEZRqC2MEPAqFeo2xesSTBdlKAq\nXdy4AfTpwy0IO3yY+9fcXCVNKxVmCBgMBqMaXr/m3voHD+YyhV26BHTrpm6pFEelYwR//vlntb6m\npk2bYtCgQcoRjI0RyAXTB4OhPIqKgO3bAV9fYPRoIDAQKBUXUiOpTZ9QqSEwMzPD0KFDKz2RiHD+\n/HnEx8fXTEp5BWOGQC6YPhgM5XD5MhceumlTblFYqcjxGk2t+oTKMtZMmDCh2qw28pSpLZWJVoXI\nauf169c0fPhw0tfXJxsbG9q7d2+lZdevX08CgYCMjIxo6tSpVFBQIDs2ceJEEggEZGhoSK1bt6bl\ny5dXWo8m60MZREREqFsEjYHpogRF6iI5mWjKFCJra6Ldu4mkUoVVrRJq0ydUOkawZ8+eao2IPGUa\nEjNnzoSuri5SUlKwZ88ezJgxA/fu3StXLiwsDMHBwQgPD0diYiIePXoEPz8/2fFFixbh8ePHyMzM\nxPHjx7Fx40aWt5jBUDISCZcfwMkJMDXlwkRMmgTwFJPiRKOpdh1BXl4eNm/ejAsXLoDH46Fv376Y\nMWMGdOXMopCeno5PP/0U0dHR4PF42LFjBxwcHDB27FgkJibC1tYWBw4cAJ/PLytYPXMNKStVZWxs\nLAYMGIBDhw6hS5cu5Y5rqj4YjPrEuXOcG8jcnHMDdeigbolqh7hIjCbaTRS/jsDLywv37t3Dl19+\niVmzZiE6OrrC0MqV8dVXX2HQoEGIiYnB7du30a5dOwQFBcHDwwMPHjzAgAEDEBQUVCOhNRFFp6r8\n4osvoK+vDycnJyxZsqRCI8BgMOrGixfcW/+kScDSpcCZM/XTCGQWZGL5ueVo/UPr2lVQne+offv2\ncu2riPT0dGrdunW5/Y6OjpSUlERERCKRiBwdHcuVqUy0akXmwn7U/a+GnDt3jgQCQZl9v/zyC7m7\nu5cr26ZNGwoLC5Nti8Vi4vF4lJiYWKacVCqliIgIMjMzoytXrlRyuWyMoKHCdFFCTXUhFhOtWUNk\nZka0aBFRdrZy5FI2mfmZtPLcSrJYbUET/5xIsa9ia9UnVBtrqEuXLvj333/Rq1cvAMDly5fRtWtX\nuYzM48ePYWFhgSlTpiAqKgpdu3bFhg0bkJycDCsrKwCAlZUVkpOTKzzf29sbtra2AAA+n4/OnTtX\n36ia3CSKTlUJcG4fd3d3jB49Gvv27cM777xTafvFC2qKU/a9rdsN7Xqr2o6MjNQoedS5XZzxT57y\nZ84AU6cKIRAAly65o21b9ctf0+3jp47j7/t/4++Cv+Gc64w+9/pAO1obe2/vRa2ozEI4OzuTs7Mz\ntWvXjni/LeKtAAAgAElEQVQ8HrVq1YpsbGyIx+NRu3bt5LIy165dI21tbbp69SoREX311Ve0ZMkS\n4vP5ZcqZmJiUO7cy0aoQWa1kZ2eTjo4OPXz4ULZv0qRJtGjRonJlJ0yYQN99951s+/Tp0+W+Jkrj\n4+NTpnxpNFUfDIam8eQJ0ejRRLa2RH//Xf9mAxER5YhzaO3FtWS1xopGHxhNd5PvlitTmz6h0jMe\nP35c5Z88iEQisrW1lW2fP3+eBg0aRO3atSORSERERC9evFCsa0iNjBs3jsaPH085OTl0/vx5MjY2\npnv37pUrd+LECRIIBHTv3j1KTU0lNzc3mcFISUmhffv2UXZ2NkkkEjpx4gQZGRnJjOmbaLI+GAxN\nID+faMUKzg3k70+Um6tuiWpOrjiX1l9aT4K1Ahr5+0iKSoqqtKxCDcGbPHv2jBITEykxMZHEYrHc\nDfTt25diY2OJiMjPz4/mzZtH8+bNo6CgICIiWrVqFS1YsKC8YPXQEKSmppZZR7Bv3z4iIkpMTCQD\nAwN6+vSprOz69evJyspKto6gWKcvX74kNzc34vP5ZGxsTN27d6d//vmn0jY1WR/KgPnFS2C6KKEy\nXRw7RmRvTzRsGNGjR6qVSRHkFebRD5d/IOt11jR8/3C6JbpV7TkKNQQrVqwgf39/2XbLli3J2dmZ\n2rZtSytXrpS7gcjISOrWrRu5uLjQiBEjKD09nV6/fk0DBgwgBwcH8vDwoLS0tPKC1UNDoA4amj5Y\n51cC00UJb+ri0SOioUOJHBw4Y1DfyC/Mp5+u/kTN1zWnIXuH0I0XN+Q+tzZ9QqXrCFxdXXH+/HkY\nGBjItm/duoWioiL069cPFy9erN2ghJzUt3UE6oLpg8EoIS8PCA7m1gLMnQt88w3QpIm6pZIfcZEY\nO27twIrzK9DRqiP83fzRvXn3GtVRmz6hyllDxUYA4NYDAICWlhby8vJq1AiDwWAoEyLgn3+Ar78G\n3nmHyxXcsqW6pZKfwqJC7IzciRXnV6C9RXv8b/T/0KNFD5W1X6khyMnJgVgsho6ODgBuKicAFBQU\nICsrSyXCMRhvIhQKZVPoGjpMFxwPHgCenkJkZblj+3ZgwAB1SyQ/hUWF2H17N5afWw57U3vsG7UP\nvVr2Urkcla4s/uSTTzB9+nTk5OTI9mVnZ+Pzzz/HJ598ohLhGAwGozKys4FFi7gcwV27AlFR9ccI\nSKQShEaGov1P7bHnzh7sGrELJz1PqsUIAFXEGpJIJFiyZAm2b9+OVq1aAQCePHkCHx8frFixAtra\nys17z8YI5IPpg9HQIOKSxM+dC7i5AWvWAM2aqVsq+SiSFmHf3X1YdnYZrA2tEeAeADdbN4W2odB8\nBMXk5uYiLi4OAGBvbw89Pb3aS1gTwZghkAumD0ZDIjoamD2byxi2aRPQt6+6JZKPImkRfo/+HcvO\nLoOFvgWWuS9D/9b9ldKWQpPX37hxAwCgp6cHFxcXuLi4lDMCN2/erIWYDEbteTPUREOmIekiM5P7\nAnB3B0aO5HIHlzYCmqoLKUlxIPoAOv7cEZuubsLGgRtxzvuc0oxAbanUvzNlypQqlUtE8PHxwa1b\nt5QhF4PBYIAI2LMHWLAA+Ogj7ovA0lLdUlWPlKT4K+YvBJwNgF5jPaz/cD0+bPMheBqa3KBS15Ct\nrW21QltYWODq1avKEYy5huSC6YPxthIVxeUIyMvj3EA9e6pbouqRkhR/3/8bAWcD0LhRYwS4B2CQ\nwyCVGgCFpqpUN5WJpsEiKyxVpZubG+nq6pKBgQEZGBhUGeRPk/XBYNSG1FSiWbOILC2Jtm4lkkjU\nLVH1SKVS+jvmb+q8pTO5bnGlQ/cPkVRNUe1q0ydUm5iGIT+KSlXJ4/Hw008/ISsrC1lZWYiJiVHl\nZWg0muoLVgdvmy6kUiAkBGjfHigsBO7dA6ZNA7S0qj9XXbogIhx5cATdt3WHn9APfm5+uDHtBoY4\nDlG9Gygri1NgLVDuHNAGRE5ODv766y9ER0dDT08Pffr0wbBhw7B79+5yqSpDQ0Px6aefon379gAA\nX19fTJgwoUw5Yu4eRgPi+nVg5kygUSPg2DFA0xPyERFOxJ2An9APeZI8+Lv5Y0T7EWjEU8O79YsX\nwI8/Atu3A++9V6sq2BeBglB0qspFixbBwsIC7777Ls6ePatc4esRbCVtCW+DLl694t76hwwBZswA\nLl6snRFQlS6ICCfjT6JXSC98e+pbfNv7W0RNj8KoDqNUbwTu3AG8vQFnZ24g5do14MCBWlUl1xfB\n8+fPkZCQgKKiIhAReDwe+vXrV6sGlQ1PQZ+IVMMHKzs7G0ZGRmX2GRoaVhiOIzs7G8bGxrLt4vOy\nsrJgYmKC4OBgODk5QUdHB/v27cOQIUMQGRkJOzu7ml8Ig6GBFBUBv/wC+PkBEyYAMTEAn69uqSqH\niBD+OBx+Qj+8yn0Ff3d/jO4wGlqN5PBbKVYQLrHy2rXA7dvcooq4OMDUtE7VVmsIFixYgN9//x0d\nOnSAVilnnaYagpp24IpCkakqS6ek9PLywr59+3Ds2DHMmjVLGaLXK1h8nRLqqy4uXeJmAxkaAqdP\nAy4uda9TmboQJgjhJ/SDKEsEPzc/jHMep3oDUFgI/P47ZwAKC4Fvv+Wi7CkotGq1huDgwYOIjY1F\nk/oUy1UNtG3bFhKJBHFxcTL3UFRUFJydncuVdXJyQmRkpCxmU1RUFKysrGBiYqJSmRkMVZKczK0H\nOHWKCwsxfjygodPqAQDnEs/BT+iHpxlP4evmiwkdJ0C7kYqHVTMygG3bgB9+ANq2BVat4hZUKFpx\n1U0r+uijjygzM7PG05HqSmWiySGy2lBEqsr09HQ6ceIE5eXlUWFhIf3222+kr69fJhdyaTRZHwwG\nEVFhIdGGDUTm5kTz5hGpoTupERcSL9CA0AHUekNr+vXmr1RYVKh6IZ48IZo7l8jUlGjCBKIbyk1M\nU+0ZI0aMIDs7O/rss89o1qxZNGvWLJo9e3aNG6qxYPXQECgqVWX37t3J0NCQ+Hw+9erVi06fPl1p\nm5qsDwZDKCRydiZ6/32imBh1S1M1/z79lz7Y/QHZfG9D229sJ7FE/pS8CuPmTaKJE4lMTIjmzCFK\nSKhxFbXpE6oNOrdz504AkM2Jpf8GiydPnqzYT5M3YCuL5aOh6aO++sWVgSbr4vlzYN48bhbQ+vVc\nfCBluoHqootrz6/BT+iHuyl38V3f7zDFdQp0tHQUK2BVEAFhYZz///594KuvgM8+q/XoucIzlAFc\nQpqCggI8ePAAANCuXTs0bty4VgIyGIy3G7EY2LABWL0amD6dc2/r66tbqoq58eIG/IR+iEqOwuJ3\nF+Pg2INooq3CsdCCAmDfPmDdOs5KfvstMG4coKNCI/Qf1X4RCIVCTJ48GTY2NgC4nAShoaFwc5Mv\nhratrS2MjIygpaWFxo0b4+rVq0hNTcXYsWORmJgIW1tbHDhwAPw3rB/7IpAPpg+GpnDqFDebsU0b\nbmyz1JIajSIyKRJ+Qj9cf3Edi95dhE+7fApdbV3VCZCWBmzdyi0Cc3LiPp08PBT2yaSUWEOurq50\n//592XZsbCy5urrK7XuytbWl169fl9k3b948Cg4OJiKioKAgWrBgQbnzKhNNDpEbFEwfDHWTkEA0\nciRR69ZEhw4RqSnETrVEJUXRiP0jSLBWQN//+z3linNVK8Djx0RffcX5/z09iSIjldJMbfqEas/o\n2LGjXPsqw9bWll69elVmn6OjIyUlJRERkUgkIkdHx/KCVXIxJiYmBID9/fdnYmIi9714G4iIiFC3\nCBqDunWRl0cUGMhNbAkIIMpVcb9amqp0cSf5Dn1y4BOyWmNF6y6toxxxjuoEIyK6do1o7FhOUfPn\nE5WaNKIMamMIqh0j6Nq1Kz799FNMmjQJRIQ9e/agW7du1Z0mg8fj4f3334eWlhY+//xzfPbZZ0hO\nToaVlRUAwMrKCsnJyRWe6+3tDVtbWwAAn89H586dkZqaCqAkyFTxANHbvF06oJYmyKPO7WI0RR51\nbkdGRqqt/aAgITZuBN55xx03bgAJCUJcuaI+fURGRpY7npCegOOS4xAmCDFCdwR2dtqJj3p9pBr5\nwsOBK1fgHhYGPH4M4ccfA7t2wX3wYIW3JxQKZZN6ivvLmlLtGEF+fj5++uknXLx4EQDQt29ffPHF\nF3IvMBOJRGjWrBlevnwJDw8PbNy4EUOHDi0TV8fU1FTWwcsEY75vBkPjiI8H5swBYmM5F/dHH6lb\novLEvorFsnPLcCr+FL7p9Q1mvTMLBjoGqmk8Px/47TduALhpU87//8kngAon2CglZ7EiCQgIgIGB\nAbZt2wahUAiBQACRSIT+/fvj/v37ZQVjhoDB0Bhyc4GgIGDzZq5vmzNHYdENFMbD1w8ReC4Qx+OO\n4+ueX2P2O7Nh2KR8iBel8Po18PPPwE8/cVHzvv2Wy6uphqXTCs1ZPHr0aACAs7MzOnbsWObPRc7g\nILm5ubKgazk5OTh58iQ6duyIoUOHIjQ0FAAXknn48OE1Erqh8aZbpCHDdFGCKnRBBBw8CHToADx4\nAERGcmEiNMkIPEp7hIErBqL3r73hYOqAuNlxWNx3sWqMQHw8FzjJwQF49IgLnnT0KNC/v2bHz3iD\nSscIfvjhBwDA0aNHy1kXeRMuJCcnY8SIEQAAiUSCiRMn4oMPPkC3bt0wZswYhISEyKaPMhgMzSI2\nFvjyS+DZM+DXX2sd6l5pJKQnYPm55fj7/t/4WP9jPJz+EHxdFYUwvXyZWwB29iy3+Cs6GmjWTDVt\nK4PqRpPnz58v1z5FI4doDAZDCWRlES1YQGRmRrR+PZFYDZEWqiIhLYE+O/QZmQab0pLwJZSam6qa\nhiUSooMHifr0IbK1JfrxR05ZGkZt+s5qMymcPHmy3L5jx44pwSQxGAx1QgTs38+linzxgst78vXX\nKh3nrJKnGU8x4+gMdPmlCyz0LfBg1gME9g+ESVMlR+3NywO2bOEUs3IlFwLi4UNu9ZyBigahlUyl\nhuDnn39Gx44dERsbW2Z8wNbWVu4xAoZiYH7xEpguSlCkLu7e5Vw/q1ZxUQ927dIcT8fzzOeYdWwW\nOm/tDOMmxoidFYsV762AmZ6ZrIxSnouXLwF/f8DWFjh+nEsFeeUKMHo0oP12Zfmt9GomTJiAgQMH\nYuHChQgODpaNExgaGsLMzKyy0xgMRj0iIwMICOBmPPr5AZ9/rjl9nChLhKCLQfjt9m+Y6joVMTNj\nYKlvqfyGHzzgIuX9/jswZgw3DtCunfLbVSNyTR9NS0vD06dPIZFIZPu6KDm7NJs+ymAoDyKu81+w\nABg0iPN4WKqgj5WHpOwkBF8MRmhkKLw7e2N+n/kQGAiU2ygRlzpt7VouZOqMGcDMmZqjFDkokEpx\nKi0NQ8zNFR99dOnSpdi5cyfs7OzQqFGJJykiIqLmkjIYDLUTGcnNeCwo4KaG9uihbok4UnJSsPri\navx661d4dvJE9BfRaGaoZP9UURHw99+cAXj5khsU2bMH0NNTbrsKJDonByEiEX5LToZTbUO9Vjea\n7ODgQAUFBTUeha4rcojWYFB3TBlNgumihJrqIjWVaOZMIktLol9+4SbBaAIvc17S/FPzyTTYlGYe\nnUnPMp7VuI4aPxfZ2USbNhHZ2RH17En055+aoxA5yCwspG0vXlCPGzfI+uJFWhQfTw//C/ZUm76z\n2i8CJycnpKWlyWIDMRiM+oVUyq0DWLKESxATEwOYmqpbKuB17mus+3cdtlzfgjFOYxD5eSRaGrdU\nbqPJycCmTdwsoL59gd27gd69ldumgiAiXMrMRIhIhIOvXsGdz8cSGxt8ZGoK7TouXqt2jODatWsY\nNmwYnJ2dZfGFeDweDh06VKeGqxWMjREwGHXm2jXODaSlxfV/Sh7ak4u0vDSsv7wem69txqj2o/Bd\n3+9gw7dRbqMxMdwA8B9/AOPHcy4gBwfltqkgksVi7EpKwq9JSZASwadZM3gJBBDoVJzARikZyry8\nvLBw4UI4OzvLxgjkXVnMYDDUw6tXwKJFwJEj3JRQLy+gUbWrhpRLen46NlzegE1XN2FYu2G4/tl1\ntDZprbwGiYBz5zj//9Wr3ODvgweAhYXy2lQQEiKcSE1FiEiEiPR0jDA3xzZHR/QxMlJO/1ud76hb\nt2419jcpAjlEazAwv3gJTBclVKQLiYTop5+ILCy43Ofp6aqX600y8jNomXAZma82p8kHJ1Pc6ziF\nt1FGF4WFRPv3E3XrRuToyA2IqDNZQg14mJtLi+LjyfriRepx4wb98vw5ZRQW1qiO2vSd1X4R9O3b\nF4sWLcLQoUPLhJ5W9vRRBoNRMy5d4l56jY2BM2eAjh3VK09WQRZ+vPIjNlzZgIH2A3Fp6iU4mCnR\nHZOVBYSEcEmTbWyApUuBjz9W/6dQNeQVFeHPV68QIhIhOicHk6yscLJTp9rPAKoF1Y4RuLu7V/gp\nouzpo2yMgMGQj6Qkbj3AmTOcF2TsWPUGvswWZ2PT1U1Y/+96eLTxgG8/XziaOyqvwRcvgI0bgW3b\ngAEDgLlzgXfeUV57CoCIcDM7GyEiEX5PSUF3IyN82qwZhpqZQaeOhkspYwRsST+DoZkUFnLh71es\nAKZM4cZDDVUUfr8icsQ52HxtM9b+uxb9bftD6C1EB4sOymvw7l0uAcw//wCentzIeGsljjkogNTC\nQuxJTkZIUhIyJBJMEQhwq1s3tNLVVatc1RqCgIAAmYUp/WXg6+urVMEYJQiFQlmKuoYO0wWHUAhM\nnSqEvb07zp9XbwSE3MJcbLm+BasvrkZfm74443UGzpbOymmMiPv0WbeuZGVcXByEt2/DXUONgJQI\n4enpCBGJcDw1FQNNTbG2TRu8x+ejkYZMvKnWEOjr68sMQF5eHo4cOYIOHZRo5RkMRqU8e8ZlCLt0\nCfDx4dzg6upL8grz8MuNXxB8MRi9WvbCSc+TcLFSUkDKwkIu9s/atYBYzGUA+/tvzcqQ8wZP8/Ox\n879pn8ba2vARCPCTgwNMNSWcaylqnKqyoKAAH3zwAc6ePassmQCwMQIGozRiMfD998CaNVwYnEWL\n1BcFIV+Sj+03t2PVhVXobt0d/u7+6CzorJzGMjI43/8PP3Dz/r/9lkuUrKEDwGKpFIdev0aISISr\nmZkYa2kJn2bN0MXAQGXT7pUyRvAmOTk5eP78eU1PYzAYteTkSS70vYMDlxjL3l49chRIChByKwSr\nLqxCJ6tOODTuELpad1VOY0+fcp3/r78CH37Ivf13VVJbCuDNeD8+zZrhTycn6GlpqVs0uajWEHQs\nNQdNKpUiJSWFjQ+oGOYXL6Eh6SIhAfjmGyAqiusTP/647HFV6UJcJMaOWzuw4vwKOFs6488xf+Kd\n5kqalXPrFuf/P3YM8Pbmtm2qX3WsjuciSyLB/pQUhCQl4Wl+PiYLBLjUpQvsmzZVqRyKoFpDcPjw\n4ZLC2toQCATQ1pSA5QzGW0h+PucC2rABmDMH2LsXUMekksKiQoRGhWL5ueVwNHfEgdEH0LNFT8U3\nRASEhXH+/5gYLgPYpk0AX0X5h2sAVRDvZ6mNDT5UQLwfdVLtGEF8fDyaN28OXV1dRERE4M6dO/Dy\n8gJfzptUVFSEbt26oUWLFjh8+DBSU1MxduxYJCYmyhLXV1QXGyNgNESOHOH6wU6duNA4traql0Ei\nlWB31G4EnguEnYkdAtwD0KdVH8U3JBZz6dDWruVGvL/9Fhg3Dqgkho46SRGLsSs5GSEiEQiAj0AA\nL4EAVhooa236zmoNQadOnXDjxg0kJCRg0KBBGDZsGKKjo+XOW7x+/XrcuHEDWVlZOHToEObPnw9z\nc3PMnz8fwcHBSEtLQ1BQkEIuhsGor8THl6TC/fFHzi2uaiRSCfbe2YtlZ5ehpXFLBLgHoJ9NP8U3\nlJ4ObN3KXaiTE2cAPDzUuwquAiRECHsj3o9Ps2borax4PwqiVn1ndTEoOnfuTEREwcHB9OOPP5bZ\nVx1Pnz6lAQMGUHh4OH388cdEROTo6EhJSUlERCQSicjR0bHCc+UQrcHA4uuU8LbpIieHaMkSIjMz\noqAgopqk/lCULiRFEvot6jdy+NGB+u3oRxGPFVNvORISuABIJiZEnp5EkZEKq1qRz0Vcbi4trmO8\nH3VSm76zWme/jo4O9u7di127dsnGCwoLC+UyMl9//TXWrFmDzMxM2b7k5GRZbgMrKyskJydXer63\ntzds//s25vP56Ny5s2xAqHjFM9tuWNvFaIo8td2OiBDi/Hng11/d0asX8PPPQlhYADo68tcXGRlZ\nJ3mkUilSLFMQcDYA2onamN55Or4e/zV4PJ5ir/f6dQgXLACuXYP79OnA7dsQxsUBaWngStddn5GR\nkXU6Pyw8HOcyMnCpdWvczcmBe0ICVpiZwfu/XAXqfl6q2hYKhdi5cycAyPrLGlOdpbh79y7NmjWL\n9u7dS0RE8fHxtGrVqmotzOHDh+mLL74gIs5aF38R8Pn8MuVMTEwqPF8O0RiMesn9+0QeHkROTkTq\n+MApkhbRgbsHqMNPHajn9p4UFhdGUqlUwY0UER05QuTuTtSyJdG6dUQZGYptQwHcyMykL2JjyfT8\nefowKooOJCdTflGRusWqE7XpO2u8oExeFi9ejN27d0NbWxv5+fnIzMzEyJEjce3aNQiFQggEAohE\nIvTv3x/3798vdz4bI2C8bWRlAcuXc1PjFy/moiOocpGplKQ4GHMQAWcDoKuti2X9l+HDNh8q1t+d\nn8/l/F23jpvq9O23wOjRqr3QakgrLMSelBSEiERIk0gwVSCAt0Cg9ng/ikIpYwTnz5+n999/n+zt\n7cnW1pZsbW2pdevWNbI2QqFQ9kUwb948CgoKIiKiVatW0YIFCyo8Rw7RGgxvm1+8LtRHXUilRPv2\nEbVoQeTlRSQSKaZeeXUhlUrpYMxB6vRzJ+q6tSsdiT2i+C+AV6+IAgOJrKyIPvqI6MwZ7sJVRHW6\nKJJK6XRqKo2Pjibj8+dpbHQ0nUpNpSIVyqgqatN3VjtG4OPjgw0bNqBLly7QqsMqueK3joULF2LM\nmDEICQmRTR9lMN5W7t7l3vwzMoD9+4E+SpiFWRlEhMMPDsNf6A8CYVn/ZRjSdohivwDi47kFD3v2\nAMOHA6dPA85KCjhXC4rj/exISoKhlhZ8mjXDRgcHmGnQF4omUK1rqEePHrhy5Yqq5JHBXEOM+kxG\nBuDvz/WP/v7A559zeYNVARHh2MNj8D/rD3GRGP5u/hjebrhiDcCVK9z8/4gIYNo0LgZGs2aKq78O\nlI73c6VUvJ+uKoz3o06Uso5g4cKFKCoqwsiRI1WaoYwZAkZ9RCoFdu8GFi4EBg/m8gWrKkUuESEs\nPgx+Qj/kiHPg7+6Pke1HohFPQQHapFLg8GHOADx7xiWAnzoVMDBQTP11pHS8nw76+vARCDDKwqLe\nxPtRFEoxBO4sQ5naETag+DrVocm6uHWLcwOJxVzCGGUnySrWBRHh9KPT8BP6IT0/HX5ufhjtNFpx\nBiAvD9i1i1vqbGzMDQCPHAloQKiZLIkEv798ie8PH0aaszO8BQJMbdasXsb7URQsQxmDoQZSU4El\nS4A//+SyhU2dqpooyUSE8Mfh8I3wxcvcl/Bz88NYp7HQaqSgN+CXL4HNm7m/Hj24cNB9+6p9BTC9\nEe/Hjc/HRCsrzO/Vq17H+1En1X4RpKenIyAgAOfOnQPAfSH4+vrC2NhYuYKxLwKGhiOVcrnSlywB\nPvkECAwETE1V0/bZhLPwE/rhedZz+PbzxfiO46HdSEFv6A8ecMkPfv+du7BvvlFvCrT/SBaLseu/\nRC9SIvg0awYvgQACHc2L96NOlPJFMHXqVHTs2BH/+9//QETYvXs3pkyZgr/++qvWgjIY9Z2rV0vW\nAZw4Abi6qqbdC08uwE/oh4T0BPj288VEl4mKMQBEXNqztWuBixeB6dO5SKD/RQFQF8XxfraXivez\nzdERfTQ83k+9o7r5pS4uLnLtUzRyiNZgqI9z55WFunWRkkL06adEzZoRhYaqbqr8pSeXyGOXB9lu\nsKWQmyEklogVowuJhOiPP4h69iRq04bop5+IsrPrXm8dqWm8H3U/F5pEbfrOal8lmjZtivPnz6Nv\n374AgAsXLkBPXTnyGAw1UVQEbNkCBAQAEydyL8tK9o4CAK48uwI/oR/uv7qP7/p+h8mdJ0NHSwGu\nkJwcYOdObgDYyopLhDxsmOrmuFZAXlER/nz1CiEiEaJzcjDJygonO3WCk76+2mRqKFQ7RhAZGQkv\nLy9kZGQAAExMTBAaGopOnTopVzA2RsDQEC5e5NxAfD6wcaNq1ktdf3EdfkI/3Em+g+/6focprlMU\nYwCSk7mkL1u2cAO/c+eqdpVbBdzMykKISIT9KSl4x8gIPs2aYaiZGXRUMeL+FqKU6aPFFBsCZQ8S\nF8MMAUPdiETAggVAeDjnOh87VvkTZm6JbsFP6IeboptY3HcxfFx90ES7SfUnVkdMDPf2/8cfwPjx\n3BoAB4e611tLSsf7SZdIMOUti/ejTmrTd1ZqctetW4ft27fLto2NjWFsbIyQkBBs2LCh9lIyagyb\nwluCKnRRWMhNmnFxAaytgfv3ucRZyjQCUUlRGPH7CHy872N42Hkg7ss4fNH9iyqNQLW6IALOngWG\nDAHc3YGWLbkZQZs3q8UISIkQnpaGCffuofWVK7iYkYE1bdogvkcP+Nra1skIsN9I3ah0jGDPnj24\nfPlyuf2enp7o2rUr5syZo1TBGAx1EBHBuYFatAAuXAAcHZXb3p3kOwg4G4CLTy9iQZ8F2DtyL5o2\nruNiKImEW9Swdi2QmclN/zxwAFDTIqtnBQXYmZSEX0UiGGlrw0cgwCYHB5iyeD8aQ6WuIRcXF9y+\nfbvCk5ydnXH37l3lCsZcQwwV8uwZ5y6/coX7Ghg+XLlfANEp0Qg4G4Bziecwr/c8zOg+A3qN6zgJ\nI5QtVTgAACAASURBVCuLW9iwYQPQqhW3Avjjj1Wzuu0NxFIpDv8X7+dyA4z3o04Uuo6AiJCUlASB\nQFBmf3JyMruRjLeGggKu41+7FpgxA9ixA1DmpLj7r+4j4GwAwh+HY26vudgxbAf0deo4K+bFC24U\ne9s24L33uIVgPXooRuAacq9UvJ/2/8X7+cPJqcHF+6lvVPqqMG/ePAwePBhCoRBZWVnIyspCREQE\nBg8ejLlz56pSxgYP83+WoEhdhIVx4wCXLnFfAoGByjMCD14/wKS/JqHfjn5wsXRB3Ow4zO8zv05G\nQPjrr4C3N5cAPjubu4gDB1RuBLIkEmwXidDr5k28HxUFnUaNcMHVFcLOneEpEKjECLDfSN2o9IvA\ny8sLFhYW8PX1RXR0NADAyckJgYGBGDhwoMoEZDAUTUICN2nmzh3ghx+4KKHKIi41DoHnAnHs4TF8\n1eMrbB68GUZNjGpfIRE3jWnNGuDaNc6fFR+vutgWMjHKx/tZ3KoVBpqZsXg/9RClpaqsK2yMgKFo\n8vOB1au5zv/rrzkXurJmKz5Ke4Tl55bjUOwhzH5nNub0nANj3TpMvS4s5N72167l/FnffgtMmKC8\nC6iEFLEYu5KTESISsXg/GopSYg0xGPUdIuDIEWDOHKBzZ+DmTcDGRjltJaQnYPm55Th4/yBmdp+J\nuC/jwNfl177CzEzO9//DD4C9PZf0eOBAlQ4AF8f7CRGJEJ6ejuHm5vilbVu8a2zMxgvfEtjSvXoA\n83+WUFNdxMVxE2fmzQN+/pmbVakMI/Ak4wk+P/I5uv7SFQIDAR7Ofohl/ZfV3gg8fcoJ3bo1cOMG\ncPAg5xIaPFhmBJT9XMTn5eG7R49g8++/WJaQgI9MTfGkZ0/sbNcOffl8jTIC7DdSN6r9IigqKqpT\nrmIGQx3k5HDZwbZsAebP5/pRZXgvnmU+w6oLq7D/7n5M6zoNsbNiYa5nXvsKo6I498/Ro9xAsDI/\nXyqgdLyfu//F+wnr1AnOLN7PW021YwR2dnYYNWoUpkyZgg4dOshdcX5+Ptzc3FBQUACxWIxhw4Zh\n1apVSE1NxdixY5GYmChLXs/nl39rYmMEjNpABPz1F7eGqk8fbky1eXPFt/Mi6wVWXViFPbf34NMu\nn2Je73mw0K9lTkoi4ORJzgDExHD5fz//nAtupCJKx/vpbmQEH4EAQ83N0YTF+6l3KCXWUGZmJvbv\n34+dO3eiqKgIU6dOxfjx42FkVP3Mh9zcXOjp6UEikeDdd9/F2rVrcejQIZibm2P+/PkIDg5GWloa\ngoKCFHIxjIZNTAzw5ZdcjKBNm7ioCoomKTsJQReCsCtqF6a6TsX8PvNhqW9Zu8rEYmDfPmDdOm77\n22+5WBYqGngtHe8nTSLBVBbv562gVn1nTWJWR0REkLW1NTVt2pS8vLzo4cOHcp2Xk5ND3bp1o7t3\n75KjoyMlJSUREZFIJCJHR8cKz6mhaG81LNZ6CRXpIjOTaN48IjMzou+/JxKLFd9uUlYSfRP2DZkE\nmdCcE3NIlCWqfWVpaURBQUTW1kQeHkRhYbVKbFCb56JIKqUzqak0PjqajM+fp7HR0XTy9WsqUlVi\nBSXBfiMl1KbvrHaMQCKR4OjRo9ixYwcSEhIwd+5cTJgwARcuXMCgQYPw4MGDSs+VSqXo0qUL4uPj\nMWPGDDg5OSE5ORlW/2U9srKyQnJycqXne3t7w9bWFgDA5/PRuXNnWeLy4sEhtt2wtosRCoUgApKS\n3DFvHuDsLMQvvwAjRyq2PafuTlhzaQ1+/uNneNh54O4Xd2FtaA2hUIj7uF+z+pKT4X75MhAaCmG3\nbsCyZXD38am1fJGRkXKX/9+pUziRmooIGxsYammhX0ICdpmYYOh/7l5Nub+13Y6MjNQoeVS5LRQK\nsXPnTgCQ9Zc1pjpL0bp1a5oyZQpdvHix3LFZs2bJZW3S09OpR48eFB4eTnw+v8wxExOTCs+RQzRG\nA+b2baJ+/YhcXYkqeDTrzMucl7Tg1AIyDTalL45+QU8znta+suvXicaNIzI15T5dntahrhpQUFRE\nf6ak0KCoKDI5f56mx8bStcxMktbzt39G1dSm76zyi6CoqAje3t7w9fWt8PjGjRvlMjbGxsYYPHgw\nbty4ASsrK1kMI5FIBEvLWvpXGQ2S9HTA3x/Yu5fLFjZtmmKTaqXmpWLdv+uw5foWjO4wGrc+v4VW\nxq1qXpFUChw/zg0Ax8dzixi2bgXkGFurKzE5OQhJSsLupCRZvJ//sXg/jCqockqAlpYWDh8+XKuK\nX716hfT0dABAXl4eTp06BVdXVwwdOhShoaEAgNDQUAwfPrxW9Tck3nSLNESkUi6zYps2QuTmAvfu\ncUHiFNW3peWlwTfCFw4bHZCSk4Ib025gy8dbam4E8vO5CKDOzsCSJcBnn3GG4JtvFG4ESj8X2UVF\nCBGJ0Ls43g+Ph4tduqg03o86Yb+RulHtGMG7776LWbNmYezYsdAvNZe4S5cuVZ4nEokwefJkSKVS\nSKVSeHp6YsCAAXB1dcWYMWMQEhIimz7KYFTFzZtcjoCiImDFCmD6dMXVnZGfgQ2XN2Dj1Y0Y4jgE\n1z67BjsTu5pX9Po1t2hh0ybA1ZX7t39/pcayJiJcyshAiEiEv169gjufj8U2NvjI1JTF+2HUiGqn\nj7q7u1e4gjAiIkJpQgFs+igDSE39f3vnHVd19f/xJ67S3ChD1DRBEJlCjhQDjVLLUY6y9OsgbVqa\nDUcqaCpq5sz8poAjR45Svzn6WQqIWxkqmpKCi6EsERQE7vn9cRAcKJdxuYzzfDz44977Ge/7flzO\n+3PO+31eb5g8WW4GmzkTRowoOWWFlIwUFh1ZxOJji+ll0YspXadg3tC88Be6dEnqWK9bJ5sYfPGF\nzpsa39f78Y2JIVvp/SgeQSdaQ2rKpShtsrPl6sqUKTBwoFwGKilxzdsZt1lybAkLjyzkNfPXODjy\nIK0NWxf+QkePyvX//fvl8s+ZM7KvpY7IfkDv5+/kZN5s1IifLS3pXLdumZJ6UJRPCny+Sk5OZty4\ncTg5OeHk5MT48eNzG9krSofKFIyPHoWOHWHNGtkvYOnSh4NAUX2Rei+VOUFzMF9izpkbZwgcEcja\nN9cWLghoNLB9O7i4yI1fLi5S03r2bJ0FgUt37/JtZCTPHzmCV1QUr+Xo/fhZWZEVEqKCQA6V6X9E\nFxQ4Ixg5ciS2trZs3rwZIQRr165lxIgR/Pbbb6Vhn6KScPMmTJggC23mzIEhQ0pmef1O5h2WHV/G\nvEPzcG3hyv5h+7FurL1UCgB378rI9MMPMuH71Vfw1ltQTTfivXezs/ktR+/ndI7ez25bW2xr19bJ\n/RSKAnME9vb2hIWFFfheiRumcgSVgqwsmWOdPh2GDoWpU6FeMWT773M38y7LTyxn7qG5dG7WmWkv\nT8PW2LZwF7l5E5Ytk38dOkgJCBcXnSWAH9T7ca5TBw9TU/oqvR9FIdFJjqBmzZocOHAAFxcXAIKC\ngqily6auikpDUJCsBmrYUC61t21b/GumZ6Wz4uQKvA9608GsA3ve24O9iX3hLnLhgkwAb9wokxQB\nAWBlVXzj8uFRvZ8RJiYEOzvzvNL7UZQmBe04CwkJEba2tqJ58+aiefPmwt7eXoSGhhZ651ph0cK0\nSkNF01GJjhZiyBAhmjYVYuPGwsnsPMkX6ZnpYunRpcJsvpnos6GPCI4OLpxRGo0QQUFC9OsnROPG\nQkyZIkSOJlZJc1/v591i6v1UtN9FcVC+yKMoY2eBMwIHBwdOnTpFSkoKgFaqowpFfmRmwpIlMGuW\nLLQ5dw6Ku+x9L/seviG+zDowCztjO7a9sw3nJs7aXyA7G7ZtkxVAN2/K8s9ffgEd6O9fy8hgVWws\nvjEx1K5alfdNTVlsYYFh9eolfi+FojAUmCNISkpizZo1REVFkZWVJU8yMGDx4sW6NUzlCCoUf/8t\nZfabNYPFi8HSsnjXy8zOZFXoKr478B3Wja3xcvWivVl77S+Qlia3Kv/wAxgZyfX/fv1KVq8CuKfR\n8L+EBHxiYjiSksIgIyM8TExwrlNHVfwodIJOcgS9evWiU6dO2NnZUaVKFYQQ6ges0JqrV+UYe/Qo\nLFwIffsWL9eamZ3JmrA1fHfgO1obtmZj/410atZJ+wvExcma1OXLoUsXWQ3UuXPRDXoCZ9PS8ImJ\n4Ze4OKxq1cLD1JQtSu9HUVYpaO3I0dGx0OtNJYEWplUayuP6Z3q6ELNmyR4BU6cKkZZWvOtlZmcK\nvxA/Yfqpqei+urs4cPlA4S5w9qwQ778vRP36Qnz4oRDnzxfPoHxIycwUK6KjRceTJ4XpwYNiwsWL\n4kJxv/hTKI+/C12hfJFHUcbOAmcE7777Lj///DO9e/fmmWeeyX2/YUlt9VRUOHbvlp3CrK3h2DF4\noQjSPffJ0mSx4fQGpgdOx6yOGd90+YbP3/5cu5OFgMBAuf5/7Bh8/LGsCGpcxJaS+d5CcDglJVfv\n5+X69ZnUvDk9DQ2V3o+i3FBgjmDp0qVMnjyZ+vXrUyWnntnAwIBLly7p1jCVIyh3REbCuHEQHg6L\nFkGvXkW/VrYmm41nNjI9cDpGzxkx3XU6bi3dtDs5Kwu2bpUBICUFxo+XmxRq1iy6QY+g9H4UZRWd\n9Cxu2bIlx48fp1GjRsUyrrCoQFB+uHtX7gZeskSOuePHwwOTx0KhERo2hW/CK8CLBs82YLrbdLq3\n7K5dXio1VYoULVwos9JffglvvFFiSnWP6v30a9QIDxMTutSrp/JmijKDTpLFFhYW1CzBJylF4fH3\n989tUVeWEAJ27JA9V5ydISQEmhehhwvIALD17Fa8AryoXaM2C19byKutXn1sgM3XF9HRMgqtWAHd\nusmNYB06FM2QfLh09y6+sbGsio3FrEYNPExN8bOyoq6OJCa0paz+LvSB8kXxKPCXXKtWLRwcHHBz\nc8vNEZRG+aiibBMRIfMAUVFy/H3llaJdRyM0bPtnG57+njxT7Rnmus+lp3lP7Z6ww8Pl8s/27VKc\nqLgJiQe4m53N7/HxrHxA72ePnR02OthfoFDomwKXhu43Rb7/jylyykeHDRumW8PU0lCZJC1N9gb4\n+WeYOFHuDSjKsrgQgh3nd+AZ4IkBBni5evFG6zcKDgBCwL59MH++nIKMGSM71ZRQ8ULI7dv4xMbm\n6f2YmNBH6f0oyhE6yREA3LlzhytXrmClI72V/FCBoGwhBGzZItf/u3aFuXOLprwshGBnxE48/T3J\n0mTh6epJX8u+BQeAzEzYtEnOADIypCHvvQcloMmTlJnJ+hy9n8QcvZ/hJiZK70dRLinS2FlQfen2\n7dtF69atxfPPPy+EECI4OFj07t270HWqhUUL0yoN+q6RDg8Xont3IWxthQgIKNo1NBqN2HVhl3jx\n5xeF7TJbsfXsVpGtyS74xFu3hPj+eyGaNRPCzU3snz1biGwtziuAR/V+Bp05I/4sgt6PPtH376Is\noXyRR1HGzgJzBJ6enhw9ehQ3N1m65+joqPPSUUXZICVFykOvXi3loT/6qPAS/EII9l7ayzT/aaRk\npOD5sif9rftTxaCApZarV6UWha8vvPaa7Ffp5AT+/sWqArqv9+MXE8NzVaviofR+FIqCQ0f79u2F\nEEI4ODjkvmdra6tVlLly5YpwdXUV1tbWom3btmLRokVCCCESEhLEK6+8IiwsLIS7u7tISkp67Fwt\nTFPoCI1GiLVrhWjSRIgRI4omwqnRaMTei3vFSz4vCaulVmLD6Q0iKzur4BNDQqQ0aYMGQowdK0RU\nVOFv/ggZ2dliy40bomdYmGhw4ID44Px5cezWLaEpR0//CoW2FGXsLPD5rm3btqxbt46srCwiIiJY\nvHgxL730klZBpnr16ixYsAAHBwdSU1NxcnLC3d0dPz8/3N3d+frrr5kzZw7e3t54e3sXM6QpSoKw\nMJl/TUuTe7I6diz8Nfyj/Jm6fypxaXFMe3kab7d9m6pVnqKxIwT83//J9f+zZ+Hzz2U5aP36Rf8i\nwLm0NHxiY1kbG5ur97O5bVueU3o/CsXDFBQpUlNTxcSJE4WTk5NwcnISkyZNEnfv3i1SpOrbt6/Y\nu3evsLS0FLE5j5kxMTHC0tLysWO1MK3SUBrrn0lJQnz6qZTi/+knIbK0eHh/lICoAOG6ylW0WtRK\nrAldIzKzM59+QkaGEKtWyeSDra0Qq1fL955CQb5IycwUK6OjRaeTJ4VJKej96BO1Lp6H8kUeRRk7\nC5wRPPfcc8yaNYtZs2YVK+BERUUREhJChw4diIuLw9jYGABjY2Pi4uLyPWf48OG0aNECgPr16+Pg\n4JC7aeR+s2r1univu3Z1ZdUq+PJLf7p0gXPnXDE0LNz1Dl45yGc/fUZ0ajSzRs5iqP1QggKDCAoM\nyv/85GT8v/kGtm7F1dER5s3Dv0YNMDDANacW9Un3u8+Dnwsh+HHXLnYlJHD4hRfoWq8er1+9Sse6\ndemes6+grPi7JF+HhoaWKXv0+To0NLRM2VOar/39/XPL/O+Pl4XlieWjvXv3fmIZkoGBATt27ND6\nJqmpqbz88stMmTKFfv360aBBA5KSknI/b9iwIYmJiY/d4wmmKUqIEydkq0iQyszOhejnAnD46mGm\n+U/jQsIFvu36LcPsh1G96lOSrpcvSxGiVavg9delBIR9IdtIPsCDej9Z9/V+jI0xLaq+hUJRAShR\niYkjR47QtGlTBg8eTIec7fr3L14YXZXMzEz69+/P0KFD6devHyBnAbGxsZiYmBATE4ORkVGhjFYU\nj4QEmDxZbsidNQuGDStcIc6x68eY5j+N8BvhfNv1W4Y7DKdG1afsKjt5Um4A+/NPGDlSJiKaNSuS\n7fnp/fy3dWul96NQFIMn/vvHxMQwa9Yszpw5w9ixY9m7dy+NGzfG1dWVl19+WauLCyHw8PDA2tqa\nsWPH5r7fp08fVq9eDcDq1atzA4Qifx5dFikq2dmyH0ubNlC9umwVOWKE9kHgZPRJ3lj/Bv039adP\n6z5EjIlgtNPo/IOARgO7dkntn379oF07uHQJ5s0rUhC4dPcu30ZGYrJsGV5RUbzasCGXO3ZklZUV\nLvXrV8ogUFK/i4qA8kUx0SaRkJ6eLvz8/IShoaFYsmSJ1gmIAwcOCAMDA2Fvby8cHByEg4OD2L17\nt0hISBDdu3dX5aNaUhKJsEOHhGjXTggXFyHCwgp3bnB0sOizoY9oMr+JWHJ0ibib+ZRigbt3hVi5\nUog2bYRwcBDil1+EuHevSDbfycoSv8TGCreQENEoKEiMjYgQPrt2FelaFRGVIM1D+SKPooydT5WY\nSE9PZ+fOnWzcuJGoqCj69OnDyJEjMTMz03mAUjmCkiEuDiZMkNWZc+fCu+9q3yryVNwpPP09OXLt\nCBO6TGC002ierfYE2YXERPjpJ5lscHCQ6//duhWpL+V9vZ8NcXFS78fUlL5K70eh0IoSzREMHTqU\n8PBwevXqxdSpU7G1tS22gYrSIysLli2DGTNkDuDcOahbV7tzz9w4g1eAF0FXgvj6pa9Z99Y6alZ/\nghT5pUuwYAGsWycbEu/dCzY2hbY3P72fYGdnpfejUJQGT5wqGBiI2rVr5/tXp06dIk9btOUpplU6\nCjvtDQiQZfndukmdIG05e+OseHvz28J4nrGYd3CeSM1IffLBR44IMXCgbEo8caIQ168XykYhpN7P\nvsRE8d7Zs6LegQPi7fBw8X8F6P2oJYA8lC/yUL7Ioyhj5xNnBBqNpvSikaJEiI6Gr76CAwfghx+g\nf3/tVmbOx59neuB0/rr0F190/IKVfVZSu0btxw/UaOCPP+QO4KtXZV9KX1+onc+xT+F6jt6Pb47e\nz/umpiwyN1d6PwqFntBKhlofqByB9ty7J/XZvL3hgw9g0iTQpn9KREIEMwJnsOffPYztOJYx7cdQ\n55k6jx949y6sXStLQOvWlev//fsXSoHunkbDHwkJ+MTEcDglhUFGRniYmOBcp06lrPhRKHSFTlpV\nKso2f/0ltYFatoTDh8HCouBzLiZeZEbgDHZG7OTzDp+ztNdS6j6TTwIhPl4mGpYtg/btZSsyF5dC\nJYD/uXMHn5gY1jyi91NL6f0oFGUGVYZRDsivRvrKFRgwAEaPljOBnTsLDgKRSZF47PCgw8oOtKjf\ngogxEXzb9dvHg0BEhNScbt0arl2D/ftlc+KuXbUKAqnZ2fjGxNA5OJhuoaFUMzAgyNGRAEdH/mNi\nUqwgoOrF81C+yEP5onioGUE5IyNDLtEvWCBnAmvXQs0nFPTc53LyZWYemMnWc1v55MVPiBgTQYOa\nDR4+SAg4dEhePChItn88dw5yNKEKQgjBkZQUfGJj2XrzJl3r1WNC8+b0NDSkmlr6USjKNCpHUI7Y\ntUsqNNvYyGRwy5ZPP/7qravMPDCTzWc386Hzh3zR8QsMaxk+fFB2NmzbJgPAjRvwxRcwfLh2SQak\n3s/aHL2fTKX3o1DoHZUjqKBcugRjx8I//0iZ/h49nn78tZRrzA6azYbTGxjtNJrzn56nUa1GDx+U\nlibF3374AYyMZLlR376gxbLNo3o/fQ0N+al1a1yU3o9CUS5ROYIyzJ07MG0aODj406kTnD799CAQ\nfTuaz3Z/ht1PdtSqXot/Pv0H71e8Hw4CcXEwZYqcTvz9t1xbOnwY3nqrwCBwX+/n+SNH8HxA72d1\nmzZ0LSW9H7UWnIfyRR7KF8VDzQjKIEJIZdBx42SxzsqVMGjQk4+PTY1lzsE5rA5dzXCH4Zz95Cwm\ntU0ePujcOfn0v2ULDB4MBw9qVWJ0Nzub3+PjWRkTw+m0NN4zNma3rS22hdw7oFAoyi4qR1DGuHAB\nPvtMVgUtWQLduz/52BtpN5h7cC6+Ib4MtR/KhM4TMK1jmneAEHJ32bx5cOwYfPKJrAZq3LhAO5Te\nj0JRPlE5gnJMairMnClL9SdOlMHgSRtt4+/EM+/QPFYGr2SwzWBOf3Qas7oPCAFmZcmGw/PnQ3Iy\njB8PmzYVWF70oN5PQmYmI0xNld6PQlEJUI93ekYIOUa3aSNVG06fluP2g0Hg/vpnwp0EJv09Ccul\nltzOuE3oB6Es7bU0LwikpsoOYBYWUgV00iSZYf7ggycGAY0Q7EtK4r2zZ2l59CiBycl4v/AClzp2\nxLNFizIXBNRacB7KF3koXxQPNSPQI+Hhci9AQgKsXy837ebH7YzbTNk/hWXHlzHAegDBo4N5vv7z\neQdER8t1pBUrwM0NNmyAjh2feu9H9X48TE1ZbGGh9H4UikqIyhHogZQU8PKCNWtkVdCHH+Yv25Oc\nnsyCIwv48diP9LPqx2SXybRs8MDmgTNn5PLP9u0wZIisMc1p1p4fSu9Hoaj4qBxBGUcIKdv/zTey\nDDQ8XJbwP8qt9FssOrqIJceW8EbrNzj6/lFaNWyVd5F9++QGsNBQOaWIiABDw8cvlIPS+1EoFE9D\n5QhKibAwKdWzcKHM4/r4PB4EbmfcZmbgTMyXmPNv4r8cGnkIv75+XD11FTIz5fqRk5Mc/AcMgMhI\nmQfIJwg8qPfjVsJ6P/pErQXnoXyRh/JF8VAzAh2TlARTp8qE8IwZ4OHx+L6t1HupLD22lB8O/4B7\nK3eCRgRh2chSfpiSIk/+z3+gVSt5kZ498+04n5/ezzfNm9NL6f0oFIqnoNMcwciRI9m5cydGRkac\nPn0agMTERN5++20uX75MixYt2LRpE/Xr13/csHKeI9BowM8PJk+GN9+E7757/ME97V4aPx7/kfmH\n5+PWwo2pL0/FurG1/PDaNdlkwMcHXn1VlhI5O+d7r5s5ej8+Su9Hoaj0FGXs1OnS0IgRI9izZ89D\n73l7e+Pu7s6FCxfo3r073t7eujRBL5w4AZ06yR3Bu3bJnu4PBoE7mXeYf2g+rRa34kT0Cfb9Zx8b\nB2yUQSAsTD7929nJ5aCTJ2UV0CNBIFsIdickMCA8nNbHjnEqLY3lrVtzvn17vmneXAUBhUKhPcVq\njqkFkZGRwsbGJve1paWliI2NFUIIERMTIywtLfM9rxRMK3Fu3hRi1CghTEyE8PMTIjv74c/v3Lsj\nFhxeIEy/NxVv/fqWCIsNkx9oNEL8+acQ7u5CNGkihLe3EImJuec92I/10p074ttLl0TTQ4fEiydO\niOXXr4vkzEzdf7kygupNm4fyRR7KF3kUZews9RxBXFwcxjka98bGxsTFxT3x2OHDh9OiRQsA6tev\nj4ODA66urkBecqgsvM7Ohi+/9MfPD4YNc+XcOQgN9ScwUH6enpXO1yu+Zv3p9XTp2oVd7+0i+Z9k\nEk/FQcwa+P57/FNTYdAgXP/4A2rUeOj69zQapvz+OzsTErjapg3vGRvjlZzMCzVr4urkpPfvX5qv\n71NW7NHn69DQ0DJljz5fh4aGlil7SvO1v78/q1atAsgdLwuLzvcRREVF0bt379wcQYMGDUhKSsr9\nvGHDhiQmJj5uWDnJERw+LCV86tSRe7rs7PI+y8jKwCfEh9lBs3EwccDzZU+cmjhJ2Yeff5Y5gDZt\nZA/gV199rPvXfb2fjTdu0K52bTxMTemn9H4UCsVTKBf7CIyNjYmNjcXExISYmBiM8iukLwfExcn9\nAHv3Sk23wYPzxvF72ffwC/Fj5oGZ2Brb8tug33jR7EW4fFk2flm9Gl5/Hf74AxwcHrpufno/J52c\nypzUg0KhqDiU+qNlnz59WL16NQCrV6+mX79+pW1CscjKknI+NjZSxPOff+Ddd2UQyMzOZGXwSiyX\nWvL7P7+zaeAmdr67kxdjq8iD2rWTtaNhYXJbcU4Q0AjB/qQkhpw7l6/eT+SRI3r+1mWHR5eIKjPK\nF3koXxQPnc4IBg8eTEBAAPHx8TRr1ozp06czYcIEBg0ahI+PT275aHkhIAA+/VS28Q0MlKs6AFma\nLNaGrWVG4AxaNWzFurfW8ZJZR9izB/7TDf79V8o/LF8OdfMaxT+o91MrR+9nobk5jZTej0KhYVkW\npQAAD3pJREFUKEWU1pAWXL8uOzkGBcneLv37yxlAliaLdafWMSNwBs3rNcfL1QsXk/ZSR2L+fKhR\nQ67/DxqUKyf6qN7PwMaN8TA15UWl96NQKEqAcpEjKE/cuyeXgebMkcJwK1bInu7Zmmw2nN7A9IDp\nmNYxZWWflbjWtZNP/EsGgb29TAR365abOHhQ78cyR+9nU9u2PFdOpR4UCkXFQZWfPIG9e+V47u8P\nR47IncHP1pQBwOYnG5afWM7yN5bj7+KL6/ytYG4uxd/+7//kklD37qRqNA/p/VQ1MOCAoyOBjo4M\nMzHROgio9c88lC/yUL7IQ/mieKgZwSNcuSILe4KD5WzgjTdAoGFT+BY8/T2p/2x9FvdYzCs362Dw\n9XzYvx9GjZKS0E2aSL2fW7dy9X5c6tXj6+bN6dWwIdVV2adCoSiDqBxBDunpcll/wQLZJvKrr+CZ\nZzX8du43vAK8qFW9Fl5dp/Ha2XsYzJ8v24mNGwcjR0KdOtzIR+9nmNL7USgUpYzKERSRnTvh88/l\nZrATJ+D55wXb/tmGZ4An1apUY25nL3ocvolB73Fy59hXX0H//mRXrcqfiYn4nDnD38nJ9DU0ZHnr\n1rjUq6cSvwqFotxQqQPBxYuyqvP8efjxR3j1VcH/LvyPt372RCCY4/AVr/15EQP3j6B9e7kbuGtX\nItPT8b16lVWxsZjWqIGHqSm+VlbUy6/NWAng7++fu7W8sqN8kYfyRR7KF8WjUgaCO3fA2xuWLZMP\n95s3C/6+sosXV0wjU5PJvBajcd8RjsGEMbJW1N+fdEtLfrt5E5+wME6lpfGesTG7bG2xrV1b319H\noVAoikWlyhEIAdu2yaX9jh1h3jzBmfQ9eAZ4knYvjSX1BuO69SQGBw7IetFPPiG0dm18YmLYcOMG\nTjl6P32V3o9CoSijFGXsrDSB4Px5mQSW/V4E2S32Ms1/GrfvJLM8uxedNx3GIC4OvviC5CFDWJ+a\nik9MDPE5ej8jTEyU3o9CoSjzlLnGNGWB1FSYMAE6d4bXXhP8sO1vpl124evtn7I4sg2nF2XSZeNB\nGD8e/2PHGNKtGy1OnyYgOZnZD+j96DMIqBrpPJQv8lC+yEP5onhU2ByBEPDrrzIH4OYGP/8ZwKLT\nU9m86Sr/vWKP7e8XMOicRPSqVaxq2hTfuDhqXrqk9H4UCkWlo0IuDZ05A2PGQGIijJ55gK0J06h2\n4V+W/tMKi32hZA0ezB8ffIBPlSocvHWLgY0b877S+1EoFBWASp8juHULvLzgl19g6KRDhDWYiuHJ\ns8wLM6bZueuc//JLfHr2ZO3t21jUrImHqSkDGzdWej8KhaLCUGlzBELA2rVSFvrf9KPYzXyV9JC+\nrJ93kZX7Dfnrw6/psmsXbl26UKVWLQIcHDjg6MjwQuj96BO1/pmH8kUeyhd5KF8Uj3KfIwgNlT0C\nEp89gfVXk3EMPMYX26ty5mV3Jv0wgq21akm9H1NTpfejUCgU+VBul4aSkmDKFFi/PxjHvt/Q79hR\n+kbUYdOoD/Fz6cq9Z5/Fw9SU/xgb00Tp/SgUikpCpcgRaDTg6wvfLAjFqdMXDDt9jNq12rHGYxR/\nN2tOHyMj3jc1VXo/CoWiUlLhcwTHj4O9+yn+2OHCwvp9aPesJRO8tvCd9zzcu3XncufOrGnThq71\n61eoIKDWP/NQvshD+SIP5YviobdAsGfPHqysrLCwsGDOnDlPPTY+Ht4eHcqir7vwboMvSewxiHHT\nfbn76efs7NKF4x068GGTJjoTfdM3oaGh+jahzKB8kYfyRR7KF8VDLyNndnY2n376KX/99RdmZma8\n+OKL9OnThzb3u8HnHgfe848TEehJLStzto//hthnnuETWzv6GhnxbCVJ/CYnJ+vbhDKD8kUeyhd5\nKF8UD70EgmPHjmFubk6LFi0AeOedd9i+fftjgeCdMR8S4diOuPc9GGloSPCLHWih9H4UCoWiRNFL\nILh+/TrNmjXLfd20aVOOHj362HGxbdvi2cGJ3rbtqFqB1vwLS1RUlL5NKDMoX+ShfJGH8kXx0Esg\n0DaRG/TpZwTp2JbywurVq/VtQplB+SIP5Ys8lC+Kjl4CgZmZGVevXs19ffXqVZo2bfrQMWW0qlWh\nUCgqHHrJtjo7OxMREUFUVBT37t3j119/pU+fPvowRaFQKCo9epkRVKtWjaVLl/Laa6+RnZ2Nh4fH\nY4lihUKhUJQOequ/7NmzJ4sWLaJatWr4+vo+cS/BZ599hoWFBfb29oSEhJSylaVLQXsr1q1bh729\nPXZ2dnTu3JlTp07pwUrdo+0ek+PHj1OtWjV+++23UrSudNHGF/7+/jg6OmJjY1OhG7gX5Iv4+Hh6\n9OiBg4MDNjY2rFq1qvSNLCVGjhyJsbExtra2TzymUGOn0BNZWVmiVatWIjIyUty7d0/Y29uLs2fP\nPnTMzp07Rc+ePYUQQhw5ckR06NBBH6aWCtr449ChQyI5OVkIIcTu3bsrpD+08cP949zc3MTrr78u\ntmzZogdLdY82vkhKShLW1tbi6tWrQgghbt68qQ9TdY42vpg2bZqYMGGCEEL6oWHDhiIzM1Mf5uqc\nwMBAERwcLGxsbPL9vLBjp95mBA/uJahevXruXoIH2bFjB8OGDQOgQ4cOJCcnExcXpw9zdY42/ujU\nqRP16tUDpD+uXbumD1N1ijZ+AFiyZAkDBgygcePGerCydNDGF+vXr6d///65xRaNGjXSh6k6Rxtf\nmJqakpKSAkBKSgqGhoZUq6BqAy4uLjRo0OCJnxd27NRbIMhvL8H169cLPKYiDn6gnT8exMfHh169\nepWGaaWKtr+L7du389FHHwHalyOXN7TxRUREBImJibi5ueHs7MzatWtL28xSQRtfjBo1ivDwcJo0\naYK9vT2LFi0qbTPLDIUdO/UWLrX95xWPlJFW1H/6wnyv/fv34+vry8GDB3VokX7Qxg9jx47F29s7\nV2Xx0d9IRUEbX2RmZhIcHMzff//NnTt36NSpEx07dsTCwqIULCw9tPHFrFmzcHBwwN/fn4sXL+Lu\n7k5YWBh16tQpBQvLHoUZO/UWCLTZS/DoMdeuXcPMzKzUbCxNtPEHwKlTpxg1ahR79ux56tSwvKKN\nH06ePMk777wDyATh7t27qV69eoUrQdbGF82aNaNRo0bUrFmTmjVr0rVrV8LCwipcINDGF4cOHWLy\n5MkAtGrVipYtW3L+/HmcnZ1L1dayQKHHzhLNYBSCzMxM8cILL4jIyEiRkZFRYLL48OHDFTI5eh9t\n/HH58mXRqlUrcfjwYT1ZqXu08cODDB8+XGzdurUULSw9tPHFuXPnRPfu3UVWVpZIS0sTNjY2Ijw8\nXE8W6w5tfDFu3Djh6ekphBAiNjZWmJmZiYSEBH2YWypERkZqlSzWZuzU24zgSXsJ/vvf/wLwwQcf\n0KtXL3bt2oW5uTnPPfccfn5++jJX52jjj+nTp5OUlJS7Nl69enWOHTumT7NLHG38UFnQxhdWVlb0\n6NEDOzs7qlSpwqhRo7C2ttaz5SWPNr6YNGkSI0aMwN7eHo1Gw9y5c2nYsKGeLdcNgwcPJiAggPj4\neJo1a4aXlxeZmZlA0cbOMtuhTKFQKBSlQ+UQ9FcoFArFE1GBQKFQKCo5KhAoFApFGUEb6Yj7XL58\nme7du2Nvb4+bm9tT9x0VhAoECoVCUUYYMWIEe/bs0erYL7/8kuHDhxMWFsbUqVOZOHFike+rAoGi\nwhMbG8s777yDubk5zs7OvP7660REROj0ntHR0QwcOBCAsLAwdu/erdP7KSoG+UlHXLx4kZ49e+Ls\n7EzXrl05f/48AOfOnaNbt24AuLq65ivFoi0qECgqNEII3nzzTbp168a///7LiRMnmD17ts41q5o0\nacLmzZsBCAkJYdeuXTq9n6LiMnr0aJYsWcKJEyeYN28eH3/8MQD29vZs3boVgN9//53bt2+TlJRU\npHuoQKCo0Ozfv58aNWowevTo3Pfs7OxwdHTklVdewcnJCTs7O3bs2AHI3rdWVlYMGTIEa2trBg4c\nyN27dwGYMWMG7du3x9bW9qH9DP/++y+vvPIKDg4OODk5ERkZSVRUFLa2tmRmZjJ16lR+/fVX2rVr\nx6ZNm2jdujXx8fEAaDQaLCwsSEhIKEWvKMoLqampHD58mIEDB+Lo6MiHH35IbGwsAN9//z0BAQG0\na9eOwMBAzMzMqFq1atFuVLJ73RSKssWiRYvEuHHjHns/KytLpKSkCCGkZLG5ubkQQu7WNDAwEIcO\nHRJCCDFy5Ejx/fffCyGESExMzD1/6NCh4n//+58QQoj27duLbdu2CSGEyMjIEHfu3Hlo1+eqVavE\nmDFjcs/18vISCxcuFEII8eeff4oBAwaU6HdWlG8e/O3cunVLmJqaFnjO7du3RdOmTYt8TzUjUFRo\nniS0pdFomDhxIvb29ri7uxMdHc2NGzcAqd/TqVMnAIYMGUJQUBAA+/bto2PHjtjZ2bFv3z7Onj3L\n7du3iY6Opm/fvgDUqFGDmjVrPnQv8Ygw3siRI1mzZg0Avr6+jBgxomS/tKLCULduXVq2bMmWLVsA\n+Vu635AqISEBjUYDwOzZs/Hw8CjyfVQgUFRo2rZty8mTJx97f926dcTHxxMcHExISAhGRkakp6cD\nDwcPIQQGBgZkZGTw8ccfs3Xr1lzhv/T09CKp4TZt2hRjY2P27dvH8ePH6dmzZ9G/oKJCMXjwYF56\n6SXOnz9Ps2bN8PPzY926dfj4+OR2Xru/jLl//36srKywtLTk5s2buYJ7RaFidm1QKHLo1q0bkyZN\nYsWKFYwaNQqQCq5XrlzByMiIqlWrsn//fi5fvpx7zpUrVzhy5AgdO3Zk/fr1uLi45A76hoaGpKam\nsnnzZgYNGkTt2rVp2rQp27dvp2/fvmRkZOQ+pd2nbt263L59+6H33n//fYYMGcKwYcMqrLS6ovBs\n2LAh3/fzqzobMGAAAwYMKJH7qhmBosLz+++/89dff2Fubo6NjQ2TJ0+mV69enDhxAjs7O9auXUub\nNm1yj7e0tOTHH3/E2tqaW7du8dFHH1GvXj1GjRqFjY0NPXr0oEOHDrnHr127lsWLF2Nvb0/nzp1z\nK5LuD/Bubm6cPXsWR0dHNm3aBEDv3r1JS0tTy0KKMoESnVMoHiAqKorevXtz+vRpnd7nxIkTjB8/\nnoCAAJ3eR6HQBrU0pFA8gq6Xary9vVm+fDnr16/X6X0UCm1RMwKFQqGo5KgcgUKhUFRyVCBQKBSK\nSo4KBAqFQlHJUYFAoVAoKjkqECgUCkUlRwUChUKhqOT8P2TpB5Br6KH/AAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 57 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Do I really need the microsecond resolution ?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for e,error in enumerate(errors):\n", " for c,capacity in enumerate(capacities):\n", " mems[e,c] = mem_vs_errors_and_capacity(error, capacity, 6)\n", "\n", "for e,error in enumerate(errors):\n", " plt.plot(capacities,mems[e])\n", "plt.grid(True)\n", "plt.legend([str(item) for item in errors], loc=0)\n", "plt.xlabel('Capacity')\n", "plt.ylabel('Memory Consumtion [Gb]')\n", "plt.title('Memory Consumption for a Bloom Filter (6 bits \"timestamp\")')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 58, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 58 }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Efficient way to use a low precision timestamp : Countdown" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Countdown Bloom Filter\n", "\n", "* A Bloom Filter where each element leave the set after t time units:\n", " 1. We instantiate an array of small integer (counter) initialized with a fixed value *c* (ex: 255)\n", " 2. Each filter updates **reinitialized** this counter in the k positions\n", " 3. Membership if all k buckets are **non-zero**\n", " 4. With a certain **fixed frequency**, positions are slowly **decremented** (maintenance procedure).\n", "\n", "
\n", "\n", "* Maintenance procedure\n", " - Ensures that items are **expired after t time units on average**.\n", "\n", "
\n", "\n", " - Refresh period *s*:\n", "$$ s = \\frac{t}{M \\left( c - 1 + \\frac{1}{z \\cdot (k + 1)} \\right)} $$\n", "\n", "* **Good**:\n", " - Memory usage: 4-8 bits counter\n", " - Can tweak expiration precision\n", " - Good fit for high frequency stuff\n", "* **Limitation**:\n", " - Addtional CPU and memory access overhead for the maintenance (memory vs cpu)\n", " - False Positive and **False negative** (temporal error)\n", " - Running the maintenance could be a pain\n", " " ] }, { "cell_type": "code", "collapsed": false, "input": [ "from pds import CountdownBloomFilter" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Stable Bloom Filter (quick mention)\n", "\n", "* Counting Bloom Filter where we decrement some random positions periodically -> make room for fresh elements.\n", "* No precise TTL (?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pattern: First class only\n", "\n", "* Considere only the first class items\n", "* Ex:\n", " - Increase the refresh rate of the most popular urls\n", " - Detect active users\n", " - More broadly : expensive Query / analysis" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from collections import Counter # <== Probabilistic version of this" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 112 }, { "cell_type": "code", "collapsed": false, "input": [ "urls = Counter()\n", "urls['foo'] += 2\n", "urls['bar'] += 100\n", "\n", "print urls" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Counter({'bar': 100, 'foo': 2})\n" ] } ], "prompt_number": 113 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Count-Min Sketch\n", "\n", "* Count items in a Multiset\n", "\n", "* Precedure:\n", " 1. We instantiate an array of small integer (**counter**) initialized to zero\n", " 2. Each filter updates **increment** the counter in the k positions\n", " 3. Get the count of each items -> **min()** values of the k positions\n", "\n", "
\n", "\n", "* Almost identical to a Counting Bloom Filter\n", " - But here we want to control the precision differently\n", " - No simple error rate\n", " - What is the error on the estimate of the items count ?\n", " - Two parameters $\\epsilon$ and $\\delta$: ex: $\\epsilon=1E-3$ and $\\delta=0.01$\n", " - For **m events** seen in the stream, the upper bound error is on the estimate $f_i'$:\n", " - if count << m -> large rel. error\n", " \n", " $ k = log \\left( \\frac{1}{\\epsilon} \\right) $\n", "\n", " $ n = \\frac{e^1}{\\delta} $\n", " \n", " $ Pr[f_i' <= f_i + \\epsilon m] >= 1 -\\delta $\n", " \n", " \n", " - In English: there 99% chance that estimate <= real estimate + some error\n", " \n", "\n", "* Work well for skewed distribution\n", "* Point Query : Single frequency of a single value ($f_i$)\n", "* Range Query ($\\sum\\limits_{i=1}^r{f_i}$):\n", " - Sum of the estimate for a range of value\n", " - For small ranges, the range sum can be estimated as a sum of point queries; however, **as the range grows, the error in this approach also grows linearly**.\n", " - Use a set of CMS instead: log(m) CMS using dyadic interval" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s = np.random.zipf(2.0, 10000)\n", "skew_dist = ((s/float(max(s)))*1000).astype(np.int)\n", "count, bins, ignored = plt.hist(skew_dist[skew_dist<50], 50)\n", "plt.grid(True)\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nB5ABk+BVAJ1rAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 109 }, { "cell_type": "code", "collapsed": false, "input": [ "class CountMinSketch(object):\n", " \"\"\" Basic Count-Min Sketch \"\"\"\n", "\n", " def __init__(self, delta, epsilon):\n", " self.bits_per_slice = int(np.ceil(np.exp(1) / epsilon))\n", " self.nbr_slices = int(np.ceil(np.log(1 / delta)))\n", " self.bitarray = np.zeros((self.nbr_slices, self.bits_per_slice), dtype=np.int32)\n", " self.make_hashes = generate_hashfunctions(self.bits_per_slice, self.nbr_slices)\n", "\n", " def update(self, key, increment):\n", " for row, column in enumerate(self.make_hashes(key)):\n", " self.bitarray[int(row), int(column)] += increment\n", "\n", " def get(self, key):\n", " value = sys.maxint\n", " for row, column in enumerate(self.make_hashes(key)):\n", " value = min(self.bitarray[row, column], value)\n", " return value\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 96 }, { "cell_type": "code", "collapsed": false, "input": [ "import random\n", "\n", "cms = CountMinSketch(1E-1, 0.03)\n", "\n", "# Create a fake randomized stream for n occurences of str(n)\n", "stream = []\n", "for i in range(100):\n", " stream = stream + [str(i)] * i\n", "random.shuffle(stream)\n", "\n", "for s in stream:\n", " p = cms.update(s,1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 97 }, { "cell_type": "code", "collapsed": false, "input": [ "cms.get('1')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 98, "text": [ "1" ] } ], "prompt_number": 98 }, { "cell_type": "code", "collapsed": false, "input": [ "cms.get('19')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 102, "text": [ "19" ] } ], "prompt_number": 102 }, { "cell_type": "markdown", "metadata": {}, "source": [ "* **Good**:\n", " - Keep track of the frequency of the top items\n", "* **Limitation**:\n", " - Work ok for skew distribution\n", "\n", "* Cool use case:\n", " - Keep track of the top-N items using (count-min sketch + heap)\n", " - q-Quantile on a stream (set of count-min sketch counter)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pattern: Uniques items\n", "\n", "* Ex:\n", " - Number of uniques visitors on a site, post or section (with union)\n", " \n", "* Only cardinality, No membership, No content\n", "* => Proabilistic counting (Hyperloglog)\n", "* observable in the bitpattern of the hash" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Let's flip some coins\n", "\n", "* Longest Run in the coin tossing experiment:\n", " - If I **flip a coin n time**, what is the probability P to have the Rn consecutive heads ?\n", " - independent Bernoulli trials, (q=0.5), if **n is large**:\n", " - expected value of longuest consecutive heads : $ R_n \\approx log_{1/q} (nq) $\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "\n", "ns = [50,200,1000,1E4,1E5,1E6]\n", "\n", "def Rn(n,q):\n", " return int(round(np.log2(n*q)))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 64 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can have an approximation of the distribution by using an *extreme value distribution*:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def prob_longest(a, b, n, p):\n", " r = Rn(n,1-p)\n", " cdf = lambda x: np.exp(- p**x )\n", " return cdf(b + 1 - r) - cdf(a - r)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 65 }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example, for 1000 coin flips (n=1000, p=0.5 for a fair coin), the probability of having a longest run of 10 is 27%:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "prob_longest(10,11,1000,0.5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 66, "text": [ "0.27596624287196203" ] } ], "prompt_number": 66 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The longuest runs distribution will looks like" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ns = range(1,30)\n", "ps_50 = pd.Series([prob_longest(ns[i],ns[i+1], 50, 0.5) for i in ns[:-2]])\n", "ps_50.plot(kind='bar')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 67, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 67 }, { "cell_type": "code", "collapsed": false, "input": [ "ps_200 = pd.Series([prob_longest(ns[i],ns[i+1], 200, 0.5) for i in ns[:-2]])\n", "ps_200.plot(kind='bar')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 68, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n6brOo5auDT+aZm/18apavB05dFiTijX4SAhvvPGGlJeX+7Zffvllqaio8IuZNGmSvP/++77tcePG\nyYcffmi6LZifYbzwwgsvvERwCSTkH+mc+YxueF0/gxjoOH6Ol4io54QcmzgcDrS0tPi2W1pakJqa\nGjLmiy++gMPh6OFlEhFRZyGbd35+Pnbv3o2mpiacOHECK1euRHFxsV9McXExXnrpJQDApk2bkJKS\ngvPPPz92KyYiotDfbRIfH48lS5agqKgIXq8XZWVlcLlcqK2tBQDMnj0b119/PdauXYv09HScc845\nWLp0qS0LJyLqz2z7bpOudu7cibq6OrS2tgIAUlNTUVxcDJfL1WO3v2/fPowdOxaJiYm+691uNyZM\nmGCK/9e//oXBgwcjOzsbHo8HH374IfLy8jBu3LgeWU9X7733HhoaGjBy5Ehcd911pv2bNm2Cy+XC\nwIED8d1332H+/PnYunUrcnJy8Mgjj2DgwIGmYxYvXowpU6YgLS0tojUcP34cr732GhwOB8aPH4/l\ny5fjgw8+QHZ2Nn7xi18gISHBdMxnn32G1atX44svvsCAAQOQmZmJW2+9FcnJydbvBCKKWq/8hWVN\nTQ1uueUWAGc+Xjh27FicPn0at9xyC+bNm2fptgK90l+8eDEmT56Mp59+Gjk5OVizZo1v38MPP2yK\nf/jhh/HAAw9g5syZeOihhzBnzhx8//33qK6uxh//+MeI13LHHXcE3VdQUOD793PPPYd7770X3377\nLaqrqwPWfOedd+Kcc84BAPzyl79Ee3s75syZgx/+8IeYNWtWwByPPvooCgoKcNVVV+HPf/4zvv76\n65DrnTVrFtauXYtFixZhxowZWLVqFS6//HI0NDSgvLzcFL9o0SLcddddOH78OBoaGnD8+HE0Nzdj\n7NixqK+vD5lLNwcOHIjp7R86dCimt6+6iRMnmq775ptvMGfOHNx+++149dVX/fbdc889MVlHrM8z\n0I1zHeqjgrGSnp4uJ06cMF1//PhxGTZsmKXbSk1NNV2Xk5MjR48eFRGRvXv3yujRo+VPf/qTiIjk\n5uaa4l0ul5w8eVKOHTsmiYmJcuTIERER+e6772TkyJEB806aNEluuOEGmTRpku9y9tln+67vqnPe\n0aNHy4EDB0RE5Ntvv5WcnBxTfFZWlu/feXl5fvsuvfTSgGvKzc0Vr9crf//732XWrFnyox/9SIqK\n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\n2rJ8iV1ZjgAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 68 }, { "cell_type": "code", "collapsed": false, "input": [ "ps_100k = pd.Series([prob_longest(ns[i],ns[i+1], 1E6, 0.5) for i in ns[:-2]])\n", "ps_100k.plot(kind='bar')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 69, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nyPTp0+XHP/6xlJWVyaJFi6Srq8unftiwYSIicuTIETnrrLPkyJEjIiJy7Ngxz2PdFRQUyNGjR0VE\n5ODBg/Kzn/1MRES++OILGTFihE99Z2en1NbWSm5urqSnp8vAgQMlNzdXamtrpbOz0+8eghk3bpzP\nffv375fa2lq55ZZb5NVXX/V67M477/Spb2trk6qqKs8aKisrpaCgQG699VbZtWuX33n37t3rdduz\nZ49ccMEFnuOeVq5c6fl3Z2en3H777TJs2DC56aab5Ouvv/apf+CBBzyvh/Xr18vgwYNlyJAhkpWV\nJU1NTT71hYWF8oc//EG2b9/ud73+NDc3S2lpqdxyyy3S1tYmY8eOlbS0NCkuLpYNGzb41Hd1dcnD\nDz8s+fn50r9/fznzzDOlpKREXnzxRb/PH821/vjjj/3ePvroIznnnHN86q+//nqpra2VZcuWyYQJ\nE2TSpEnyww8/eM5JT5Fe60ivs0j8r3UwvdK8c3NzZceOHT7379ixQ4YOHepz/7BhwwLeTjvtNJ/6\n/Px8r+MDBw7I1VdfLTNnzvTbZLrf1/Nxf/Uix18sN998s6xevVqcTqc0NTXJueeeK06nU5xOp0/9\n8OHDPS+Ini80f3NMnjxZnn/+eRERqayslObmZhER2bp1qxQXFwdcU3eHDh2S5cuXy4033ihnnnmm\nT31+fr7873//k3379klqaqrs2bNHRI5/0up5DkWOXwf3B8vevXtl5MiRXs/V01VXXSVz586Vr776\nSo4dOyYiIjt37pQ5c+bIVVdd5XcP8f6A/vnPfy4LFiyQ2bNnS25ursyZM0e++OILWbBggUyaNMnv\nmpKSksRms3ndkpOTxWazyeDBg33qu897++23y29+8xvZsWOHPPnkk3Ldddf51Hf/5H3llVd6XeuL\nL77Yp95ms8m9994rWVlZUlxcLE8++aR0dHT4XbtbcXGxrFixQl577TXJyMiQN954Q44dOyarVq2S\nSy65xKf+2muvlRdeeEHa2trkiSeekLq6Otm6datMnTpVHnzwQZ/6aK51v379pLS01O/t//7v/3zq\ne75peeyxx+Syyy6Tb775JibXOtLrLBL/ax1MrzTvlStXypAhQ6SsrEyqq6ulurpaysrK5MILL5QV\nK1b41J999tmyYcMG2bFjh8/tJz/5iU99aWmpbNy40eu+w4cPy9SpUyUpKcmnvqSkRA4ePCgiIi6X\ny3N/Z2enz7tet6NHj8oTTzwhY8aM8bxzsdlsAfd8wQUXeF4QgwcPlp07d4rI8Xc4gd613nbbbTJ4\n8GApKSnxvIiuuOIKaWlp8TuHvxew23fffedz3+zZs2Xw4MEydOhQaWhoELvdLlVVVVJQUCD19fU+\n9fPmzZNhw4ZJVVWVDB061PPJZdeuXXLFFVf41Ofk5ARcT6DH4v0B3f1cZ2VlBXysu8cff1zKysrk\nk08+8dwX7Fp3n/eiiy7yNDN/6xU5/lWW+yvR0aNHez3m7ysg9/MfO3ZM3nvvPbnjjjvknHPOkdLS\nUmloaAi5pnD23fMrTvcnapfL5fcNVjTXOj8/X7Zu3er3MX9fUefl5Xl9fIqIvPjii5Kfny/nn3++\nT32k1zrS6ywS/2sdTK80b5Hjze/DDz+UN998U5YuXSpr1qzxfNne0/Tp0+Vf//qX38cqKip87mtr\na5OvvvrK5/5jx47J+++/73O/+51aT998841s2rQp2Dakvb1dpkyZInfddZffF1woBw8elP/+978B\nH9+/f79s3LhR1q9f73dP3X322WcRz79jxw7Pl4Tbt2+X119/PeAnBxGRTz/9VN58803ZsmVLyOce\nO3as1NfXe335+NVXX8ncuXNlzJgxfsfE+wO6+wfUQw895PVYsA+etrY2mTJlisycOVO+/fbboB/U\nGRkZ8sQTT8jjjz8uF1xwgdcHtL8YbsGCBTJ27Fh599135ZFHHpF77rlHnE6n/O53v5Nbb73Vp97f\nJ6UjR47IypUrpbKy0u+aRo0aJQ6HQ5YsWSKZmZmybNkyERFxOp1SUlLiU3/JJZd4PuaWL18uV199\ntecxf807mmv9xhtvBHwd/fWvf/W577777pN//vOfPvevXLlSsrOzfe6P5lpHcp1F4n+tg+m15m2a\nv/3tb36/nOzL9u7dK/fff78nB01PT5fc3Fy5//77A2aI8f6A/u1vf+s3///Pf/4jkydPDrUlWb58\nuZSUlMjZZ58dsOaRRx6RRx991HNz56s7d+6UqVOn+h2zevVqueGGG6SwsFCGDRsm48aNk6efftrv\n94ZuvPHGkOvsad26dXLllVdKRUWFtLa2ypgxY6R///5SVFQk69ev96lvaWmR4uJiGTBggFx22WWe\nNwa7d++W+fPn+9RHc61FRDZv3iyrVq3yfI/Kzd9X4JHWn8q1Duc6i0R/rX/xi1+Eda2DYfOmXvHC\nCy9EPMYd0/R2/cGDBz1fkUW6j0jXFOnzR3NeY7WHzZs3yzvvvOPTMLt/U6+7+fPny9ChQ+W6666T\n888/3+uuMczBAAABZ0lEQVSTs7+vLiKtd68p2k8O3a9zoHr3mHfeeSeiOSI5T4GweVOviCZiinRM\nvOutmCNR9hBNY430p8Iirbfik4MVcwTC/z2e4mb48OEBHwv0Z4MjHRPv+lBj/P0ccCzXFOnzB/q5\n5Hifp2eeeQYff/wxUlNT0draismTJ6O1tRUzZ84M+Dwi4vkFOpvNBqfTicmTJ+OLL77w+4fsIq3v\nuaYpU6YEXVOk9VbNEQibN8XN7t274XA4MHDgQJ/HLrvsspiMiXe9xjVp3EPPxvree+8FbawAcPbZ\nZ6OlpQWFhYUAgNTUVPz9739HVVUVNm3adMr18f7kYNUcAUX0Pp0oApH+lFA0Y+Jdr3FNGvcQ6Y/n\nikT+U2GR1ke6pmj2YMUcgfTa3zYhInO0t7cjJSUF5557rtf9IoIPPvgAl19+ufo1RbMHK+YIhM2b\niCgB9cofpiIiolPD5k1ElIDYvImIEhCbNxFRAvp/ctu81gx4KxMAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 69 }, { "cell_type": "markdown", "metadata": {}, "source": [ "* length of the longest run shift towards larger value at a rate $\\propto$ log()\n", "\n", "* By looking at the longuest run we can now estimate n simply using $n\\approx (1/q) \\cdot {2^{R_n}}$.\n", "\n", "* The **Hyperloglog** : Estimate the cardinality by counting the longest sequence on zero in hashed input stream" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Hyperloglog\n", "\n", "* In the simple flipping coin the observables use to estimate the cardinality is **longuest sequence on zero**\n", "* In Hyperloglog we use a differente observable: bit-pattern $ O^{\\rho-1}1$\n", "* Evaluate this pattern is very fast -> least signifiant bit\n", "* Cardinality : $\\sim 2^\\rho.$\n", "* More precision: m experiments (hash functions) instead of 1\n", "* We can emulate m experiment using *stochastic averaging*\n", "* Error rate: $\\frac{1.04}{\\sqrt{m}}$\n", "* Cardinality is estimate using the average (harmonic mean) of $\\rho$\n", "\n", "** Longuest run **\n", "\n", "
\n", "\n", "** bit-pattern $ O^{\\rho-1}1$ **\n", "
\n", "\n", "** bit-pattern $ O^{\\rho-1}1$ with stochastics averaging with 32 registers**\n", "
\n", "\n", "* ** Good** :\n", " - Really efficient memory usage: \"All the uniques\" of one the bigger publisher in US: **2kB** (2.5% error)\n", " - Union\n", "* **Limitation**:\n", " - Only query for cardinality\n", " - Intersection not really possible (with a predictable error)\n" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 69 } ], "metadata": {} } ] }