{ "metadata": { "name": "", "signature": "sha256:9e53c998db9d67da45f4d273901de464d9de90d78834e4168b3117a64f54d6b7" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Sebastian Raschka](http://sebastianraschka.com) \n", "last updated: 06/02/2014\n", "\n", "- [Open in IPython nbviewer](http://nbviewer.ipython.org/github/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day6_string_is_number.ipynb?create=1) \n", "- [Link to this IPython notebook on Github](https://github.com/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day6_string_is_number.ipynb) \n", "- [Link to the GitHub Repository One-Python-benchmark-per-day](https://github.com/rasbt/One-Python-benchmark-per-day)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "I would be happy to hear your comments and suggestions. \n", "Please feel free to drop me a note via\n", "[twitter](https://twitter.com/rasbt), [email](mailto:bluewoodtree@gmail.com), or [google+](https://plus.google.com/118404394130788869227).\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Day 6 - One Python Benchmark per Day" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Determining if a string is a number" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "**[-> skip to the results](#Results)**\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
\n", "For this benchmark, we will be testing different approaches to determine is a string is a number. \n", "\n", "**Note that methods like `.isdigit()` and `.isnumeric()` are only evaluating if a string in an integer**, \n", "e.g., both `'1.2'.isdigit()` and `'1.2'.isnumeric()` return `False`. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Functions" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def is_number_tryexcept(s):\n", " \"\"\" Returns True is string is a number. \"\"\"\n", " try:\n", " float(s)\n", " return True\n", " except ValueError:\n", " return False" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "from re import match as re_match\n", "\n", "def is_number_regex(s):\n", " \"\"\" Returns True is string is a number. \"\"\"\n", " if re_match(\"^\\d+?\\.\\d+?$\", s) is None:\n", " return s.isdigit()\n", " return True" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "from re import compile as re_compile\n", "\n", "comp = re_compile(\"^\\d+?\\.\\d+?$\") \n", "\n", "def compiled_regex(s):\n", " \"\"\" Returns True is string is a number. \"\"\"\n", " if comp.match(s) is None:\n", " return s.isdigit()\n", " return True" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "def is_number_repl_isdigit(s):\n", " \"\"\" Returns True is string is a number. \"\"\"\n", " return s.replace('.','',1).isdigit()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "**Quick note on why I am importing `re.search` as `re_search`: \n", "To decrease the overhead for the lookup.**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import re\n", "\n", "%timeit re_match(\"^\\d+?\\.\\d+?$\", '1.2345')\n", "%timeit re.match(\"^\\d+?\\.\\d+?$\", '1.2345')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 1.3 \u00b5s per loop\n", "1000000 loops, best of 3: 1.36 \u00b5s per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Testing the functions for correct behavior" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a_float = '1.1234'\n", "inv_float = '1.12.34'\n", "no_number = 'abc123'\n", "an_int = '12345'\n", "\n", "funcs = [\n", " is_number_tryexcept, \n", " is_number_regex,\n", " compiled_regex,\n", " is_number_repl_isdigit\n", " ]\n", "\n", "for f in funcs:\n", " assert (f(a_float) == True), 'Error in %s(%s)' %(f.__name__, a_float)\n", " assert (f(inv_float) == False), 'Error in %s(%s)' %(f.__name__, inv_float)\n", " assert (f(no_number) == False), 'Error in %s(%s)' %(f.__name__, no_number)\n", " assert (f(an_int) == True), 'Error in %s(%s)' %(f.__name__, an_int)\n", "print('ok')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "ok\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Special cases where those functions do not work" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a_float = '.1234'\n", "\n", "print('Float notation \".1234\" is not supported by:')\n", "for f in funcs:\n", " if not f(a_float):\n", " print('\\t -', f.__name__)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Float notation \".1234\" is not supported by:\n", "\t - is_number_regex\n", "\t - compiled_regex\n" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Scientific notations" ] }, { "cell_type": "code", "collapsed": false, "input": [ "scientific1 = '1.000000e+50'\n", "scientific2 = '1e50'\n", "\n", "\n", "print('Scientific notation \"1.000000e+50\" is not supported by:')\n", "for f in funcs:\n", " if not f(scientific1):\n", " print('\\t -', f.__name__)\n", " \n", "print('Scientific notation \"1e50\" is not supported by:')\n", "for f in funcs:\n", " if not f(scientific2):\n", " print('\\t -', f.__name__)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Scientific notation \"1.000000e+50\" is not supported by:\n", "\t - is_number_regex\n", "\t - compiled_regex\n", "\t - is_number_repl_isdigit\n", "Scientific notation \"1e50\" is not supported by:\n", "\t - is_number_regex\n", "\t - compiled_regex\n", "\t - is_number_repl_isdigit\n" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Timing the functions" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import timeit\n", "\n", "test_cases = ['1.12345', '1.12.345', 'abc12345', '12345']\n", "times_n = {f.__name__:[] for f in funcs}\n", "\n", "for t in test_cases:\n", " for f in funcs:\n", " f = f.__name__\n", " times_n[f].append(min(timeit.Timer('%s(t)' %f, \n", " 'from __main__ import %s, t' %f)\n", " .repeat(repeat=3, number=1000000)))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Preparing the plots" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "import platform\n", "import multiprocessing\n", "\n", "def print_sysinfo():\n", " \n", " print('\\nPython version :', platform.python_version())\n", " print('compiler :', platform.python_compiler())\n", " \n", " print('\\nsystem :', platform.system())\n", " print('release :', platform.release())\n", " print('machine :', platform.machine())\n", " print('processor :', platform.processor())\n", " print('CPU count :', multiprocessing.cpu_count())\n", " print('interpreter:', platform.architecture()[0])\n", " print('\\n\\n')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy import arange\n", "import matplotlib.pyplot as plt\n", "\n", "def plot():\n", " labels = [('is_number_tryexcept','Try-except method'),\n", " ('is_number_regex', 'Regular expression'),\n", " ('compiled_regex', 'Compiled regular expression'),\n", " ('is_number_repl_isdigit', 'replace-isdigit method')\n", " ]\n", "\n", " x_labels = ['float: \"1.12345\"',\n", " 'invalid float: \"1.12.345\"',\n", " 'no number: \"abc12345\"',\n", " 'integer: \"12345\"']\n", " \n", " plt.rcParams.update({'font.size': 12})\n", "\n", " ind = arange(len(test_cases)) # the x locations for the groups\n", " width = 0.2\n", "\n", " fig = plt.figure(figsize=(12,8))\n", " ax = fig.add_subplot(111)\n", " colors = [(0,'c'), (1,'b'), (2,'g'), (3,'r')]\n", "\n", " for l,c in zip(labels,colors):\n", " ax.bar(ind + c[0]*width,\n", " times_n[l[0]], \n", " width,\n", " alpha=0.5,\n", " color=c[1],\n", " label=l[1])\n", " plt.grid()\n", " ax.set_ylabel('time in microseconds')\n", " ax.set_title('Methods for determening if a string is a number')\n", " ax.set_xticks(ind + width)\n", " ax.set_xticklabels(x_labels)\n", " plt.legend(loc='upper right', fontsize=13)\n", " plt.xlim([-0.2, 3.8])\n", " plt.ylim([-0, 2])\n", " plt.show()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Results" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print_sysinfo()\n", "plot()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Python version : 3.4.0\n", "compiler : GCC 4.2.1 (Apple Inc. build 5577)\n", "\n", "system : Darwin\n", "release : 13.2.0\n", "machine : x86_64\n", "processor : i386\n", "CPU count : 4\n", "interpreter: 64bit\n", "\n", "\n", "\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n5PF4vvfHDWbBbdSokXbv3q20tDTNnTtXkrR//37dcccdqlevnqKiopSRkXHejzF27Fi1bNlSFStW\nLDEq88EHH+iGG25QUlKS6tSpowceeEA5OTn+2x9//HGlpqYqPj5e9evX16hRo1RYWPIE8m+88Yai\noqICmrA5c+aoQoUKiouL87+dvaiV9rlFgn/+85/q1KmTax5z3Lhx+t///V9lZ2erZ8+elyzvwfwQ\nGhV1einq3LmzVq5cKen053brrbeqZs2a/tvP58EHH9TVV1+tChUqlMjV3Llzdd111ykhIUENGjTQ\n6NGjVVRUVOrHOXTokDp27KgaNWooISFBbdu21XvvvVfqsT/+8Y9LNHydO3dWlSpV/Nlv1qyZ/7YV\nK1bopptuCvicYYf09HRNmDBBK1eu9P8fXUiw3y9ZWVnnXct/+ctfqmnTpoqPj1ezZs0C/sAZ+XTm\nYtZGr9er5cuXh7ii4Ph8PjVq1EjS6TrPZOWTTz7RTTfdpMTERP/tZ3z33Xfq37+/6tWrp8TERN1w\nww36/PPP/bd/8sknatWqlZKSkpScnKxbbrml1L9IffjwYdWsWVM/+tGPAq6PiopStWrV/Bl68MEH\n/bcF830UCdz93XKJ7d69W82bNw+4LtxTMGcv1hUqVNDtt9+ud955x9F9r7zySk2bNk3dunUrsehn\nZ2dr3Lhx2r9/v7Zu3aq9e/fqscce898+dOhQbdmyRdnZ2fr888+1dOlS/f73vw/4GEeOHNHkyZPV\nokWLEh+/Y8eOOn78uP+ttEXtUjRuCF5GRkaJvIfb2Q19pUqV1K9fP8fPlrdp00YzZ87UtddeWyJb\nubm5eumll3To0CGtX79ey5Yt0/Tp00v9ONWqVdNrr72mgwcP6tixY0pPT9fdd98d8MOmJM2fP1+F\nhYUlHsvj8ei3v/2tP/tbt251+ukjREp7IuBcwaxHwe4PUVFR513Lq1WrpkWLFik7O1tz587VyJEj\ntXbtWv9t5PPS8ng8YdnrjTEX9bhn/19Wq1ZNw4YN07Rp00ocl5OTox/+8If66quvdOTIEd1///3q\n1q2bTpw4Ien0WdMWL16sI0eO6MCBA2rbtq2GDBlS4uOMHj1azZs3L/V74x//+Ic/Q6+++mqpNV5O\naKb/o0uXLlqxYoUeeeQRxcfH69tvvy1xzO9+9ztdeeWVql69unr27Kn9+/f7bxs5cqRSU1OVkJCg\n6667TmvWrJEkffTRR3r22Wf11ltvKS4uTm3btnVUz9mBPPN+rVq1NHz4cF133XWOPsagQYPUtWtX\nxcXFlfiG7d+/v2655RbFxMQoMTFRDzzwgD799FP/7VdddZWqVasm6fQ3fFRUlOrUqRPwMZ588kmN\nHDlS1atXL/Hxz7dAlPa5RYKzn904s8Hdf//9io+PV4sWLfTll19KkqZOnaq77ror4L4jR47UyJEj\nJUmvv/66mjdvrvj4eDVu3DhgoSrtMZctWybpdMOYlpam5ORkXXPNNfriiy/KvF/jxo21c+dO9ejR\nQ/Hx8SooKAi43RijSZMmyev1KiUlRffff7+ys7P9t991112qU6eOEhMTdeONN/qf1Xj11Vf1hz/8\nQc8995zi4uLUs2dPR1+70nLQtGlTDR482HHDP2LECHXp0kUxMTElbhs+fLg6duyo6Oho1a1bV/fd\nd19A3s9WuXJlXXXVVf5n9KKiolSjRg1VqlTJf8yxY8f09NNP67nnnis162Xl/+wfFsoz+16vV88/\n/7xat26txMRE9evXT/n5+f7bz7e2ne3M6MUbb7yhhg0bqmbNmpo8ebL/9nN/K3HuqJHX69X06dPV\nqlUrxcXFaejQoTpw4IBuu+02JSQk6Oabb9bRo0cDHnP27NmqV6+e6tatq+eff95/vTFGU6ZMUZMm\nTVSjRg3dc889/r+Ue6bO1157TQ0bNtRPfvITR1+n0v5vylrbzxyXl5enfv36KT4+Xv/zP/+jr7/+\n2n/7nj171KdPH9WqVUs1atTQo48+KunCa3l6erqaNm0qSWrXrp1+9KMf+ZvpSMxnKDhdjwcOHKiM\njAz16NFDcXFx/h+y161bp+uvv15JSUlq06aN/zdmkrRr1y516tRJ8fHxuvnmm/Xwww8H/Pb5fPft\n3LmznnrqKXXs2FFVq1bVrl27Lvi5lPZ/8YMf/ED33XdfiWelpdO//f3Zz36mlJQUeTwePfDAAyoo\nKND27dslnc5fvXr1JMmfoXP3988++0ybN2/W4MGDS83L+cavIiVDF8XxX165DHTu3NnMnj3bfzkt\nLc089dRTxhhjli1bZmrUqGE2bNhg8vPzzaOPPmo6derkP3bevHnm8OHDpqioyDz//POmdu3aJj8/\n3xhjTHp6uhk4cGDAYz377LOme/fuQdV56tQp4/F4zO7dux0dP2DAAJOenn7eY0aOHGn69+9fosZq\n1aoZj8djnnzyyYDb1q9fb37wgx+Y4uLiEl+3OXPmmKpVq5oaNWqYpk2bmokTJ5rCwkKHn517eb1e\ns2zZMmOMMePHjzcxMTFm8eLFpri42Dz55JOmffv2xhhjfD6fiY2NNcePHzfGGFNYWGjq1Klj1q9f\nb4wx5oMPPjA7d+40xhizcuVKExsba7766itjjDGffPKJqV+/fqmPOXr0aNOpUydz5MgRs2fPHnPN\nNdeYBg0aOKrXmMD8z5492zRp0sTs2rXL5OTkmD59+gRk+PXXXzc5OTmmoKDA/OxnPzNt2rTx35aW\nlmbGjh0b8FgjRowwI0aMuJgvp9+3335rPB6P4+NvuOEGM3fu3PMe07NnzxKZPlfLli1NpUqVTHJy\nslm3bl3AbSNGjDAvvvii2bVrl/F4PKaoqMh/W+fOnU3NmjVNjRo1TMeOHc2KFSsc1x4qXq/X/PCH\nPzT79+83hw8fNs2aNTOzZs0yxlx4bTvbmc/3wQcfNHl5eWbTpk2mcuXKZtu2bcaYkv/3peW1Q4cO\n5uDBg2bv3r2mVq1apm3btmbjxo0mLy/PdOnSxUyYMCHgse69915z8uRJ849//MPUrFnT/O1vfzPG\nGPPiiy+aDh06mL1795qCggLz05/+1L+Gnbnv/fffb06ePGny8vLM7t27TWJiotmzZ89Ffe3Ot7aP\nHz/eVKxY0bzzzjumsLDQTJ8+3TRq1MgUFhaawsJC06pVKzNq1Ch/DWvWrAn42E7W8pMnT5o6deqY\nJUuWBFwfSfkMBafr8bnHGmNMZmamqV69ulm8eLExxpiPP/7YVK9e3fz73/82xhjTvn1789hjj5lT\np06ZNWvWmPj4eP/6eKH73njjjaZhw4Zmy5YtpqioyJw6dcp0797dTJ06NajP8+OPPzZer/e8x2zY\nsMHExMSY7Oxs/3Vnvh+ioqJMy5YtzaFDh/y3FRYWmmuvvdZ89dVX5vXXXzc33HBDwMfzeDymbt26\npnbt2qZPnz7G5/MFVXskoZk+S+fOnc3vf/97/+WzN4YhQ4aY0aNH+2/LyckxFStWLHMRTEpKMl9/\n/bUx5vQ38oABAy5ZnZe6mV66dKlJSkoy3377bam3f/XVVyY1NdW88847xpjT32jXXXedv/k7t5ne\nuXOn/5vrH//4h2nevLl59tlnHdXqZucu3jfffLP/ts2bN5sqVar4L99www3mjTfeMMac/vo3bty4\n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\njh07piVLligvL0+FhYWaP3++Vq9era5du16Sr8el5GRtu1ht2rTRhx9+qCNHjigrK0svvvji965z\n0qRJys3N1ebNmzVnzhx/ozh8+HCNGTPG/0Pjd999p4ULF37vxzvbhdZ2Sfryyy/1l7/8RYWFhXrx\nxRcVExOj9u3b6wc/+IHq1KmjJ554QidPnlReXp4+++wz//3Ot5Y/++yzWrBggT7++GMlJSUFPN7l\nks/ylJKSoh07dvgvDxgwQO+//76WLl2qoqIi5eXlacWKFdq7d68aNmzo3/NOnTqltWvXatGiRY7u\ne8al6AWMMcrLy9OpU6dkjFF+fr5/rTx16pTuvPNOxcbGas6cOSXu+5e//EXbt29XcXGxvvvuO40a\nNUq33367KleurNtvv127d+/2Z+jpp59W27ZttXHjRnk8Hm3ZskUbN25UUVGRcnJyNGrUKNWvXz/g\nFIuXI5rpc5x7pokzl3/84x9r4sSJ6tu3r+rWratdu3bpj3/8oySpa9eu6tq1q5o2bSqv16sqVaoE\nbERnztxQvXp1/0Y+efLkEk2sE7GxsYqPj5fH49HVV1/tf7ZYkh566CE99NBD/svDhg1TbGys/vjH\nP+qZZ55RbGys5s2bJ0l6/vnndejQIQ0ZMsR/rsiWLVtKOv1N+t5776lx48ZKSEjQ0KFDNWnSJH8z\nnZCQoFq1aqlWrVpKSUlRpUqVFB8fr7i4OEmnG5fWrVurWrVq6tatm/r27Vui4Yp0pZ2z+dzL9957\nr5YtW6Z7773Xf11cXJxefvll3X333UpOTtaCBQtKnBGjrGc1xo8fr4YNG6pRo0bq2rWrBg0aFPQz\nIEOGDNHAgQPVqVMnXXHFFYqNjfU354MGDVLDhg1Vr149tWjRQh06dAh4nDOnVUxKSvJnZvjw4QHZ\ndMLn8yk2NtZ/6sUqVaoELNi33367pkyZ4r988803KzY2VuvWrdODDz6o2NhYrV69WtLphuz48eO6\n7bbb/Hnv1q1bqR8rPz9fjzzyiGrUqKHU1FStWrVKH330kf/ZwTPZP3OGBo/Ho5SUFFWsWFGnTp3S\n2LFjVatWLdWsWVO//e1v9de//rXMEapwcbq2lXXfsgwcOFCtW7eW1+tV165d1a9fvwtmsKw198zl\nG2+8UU2aNNFPfvITPfbYY/4zc4wcOVJ33HGHbrnlFsXHx6tDhw4B59I993EzMjIUFxenzMzM89Zz\ntgut7R6PR7169dJbb72l5ORkzZ8/X++++64qVKigChUq6P3339e//vUvpaamqkGDBgHjGudby3/1\nq19pz549atKkiT+vl1M+L7ULrcdPPvmkJk2apKSkJP36179W/fr19de//lWTJ09WrVq1lJqaquef\nf97/ZNT8+fO1du1aVa9eXWPHjtU999zjP5tKWfc9u4E+t5Zz1zInVq5cqdjYWHXr1k179uxRlSpV\n/D8UffbZZ/rggw/08ccfKzEx0Z+hM2cw2rt3r7p27ar4+Hhde+21SkpK8p+bv1KlSgEZSkhI8F8n\nSQcOHFC/fv2UkJCgxo0ba8+ePVq0aFFQv32JJPw5cQAAgCDdc889at68ucaPHx/uUhAmPDMNAADg\n0N///nft2LFDxcXFWrx4sRYuXMgo42WOFyACAAA4lJWVpT59+ujQoUNq0KCBZs2apdatW4e7LIQR\nYx4AAABAkBjzAAAAAIJEMw0AAAAEiWYaAAAACBLNNAAAABAkmmkAAAAgSP8PmIDmx4CIXWkAAAAA\nSUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 32 }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `try-except` approach appears to be slower than the replace-isdigit method for cases where the string is not a number - executing the `except-block` seems to be very costly. However, we have to consider that it also works for special cases like: \n", "- '1.000000e+50' \n", "- '1e50' \n", "- '.12345' \n", "\n", "So it really depends on the data set which method to choose - the more thorough \"try-except\" or the faster \"replace-isdigit\"" ] } ], "metadata": {} } ] }