{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# More Classes of Profiles" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:44.808533Z", "start_time": "2021-02-15T09:49:39.793972Z" } }, "outputs": [], "source": [ "from fractions import Fraction\n", "from matplotlib import pyplot as plt\n", "import poisson_approval as pa" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Up to now, we have always used the class of profiles *ProfileNoisyDiscrete*. The package provides other kinds of profiles." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ProfileHistogram" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*ProfileHistogram* is probably the closest class to *ProfileNoisyDiscrete*, because both are:\n", "\n", "* *Cardinal*: the voters have explicit utilities (unlike *ProfileOrdinal*, cf. below).\n", "* *Continuous*: there is no concentration of voters on a specific utility (unlike *ProfileDiscrete*, cf. below)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A *ProfileHistogram* can be defined manually (cf. the *Reference* section), but it is more common to use a random factory:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:44.832326Z", "start_time": "2021-02-15T09:49:44.812268Z" } }, "outputs": [ { "data": { "text/plain": [ " (Condorcet winner: a, c)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rand_profile = pa.RandProfileHistogramGridUniform(\n", " denominator=100,\n", " denominator_bins=100,\n", " n_bins=10\n", ")\n", "profile = rand_profile()\n", "profile" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, the share of voters $abc$ is:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:44.874681Z", "start_time": "2021-02-15T09:49:44.837309Z" } }, "outputs": [ { "data": { "text/plain": [ "Fraction(3, 25)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.abc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The distribution of their utility for their middle candidate $b$ is given by a histogram:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:44.904863Z", "start_time": "2021-02-15T09:49:44.877664Z" } }, "outputs": [ { "data": { "text/plain": [ "array([Fraction(43, 100), 0, Fraction(1, 10), Fraction(1, 25),\n", " Fraction(1, 50), Fraction(1, 10), Fraction(2, 25), 0,\n", " Fraction(1, 25), Fraction(19, 100)], dtype=object)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.d_ranking_histogram['abc']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above notation means for example that for a voter $abc$, the probability that her utility for her second candidate $b$ is in the first of the ten bins (i.e. between 0 and 0.1) is:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:44.931173Z", "start_time": "2021-02-15T09:49:44.907208Z" } }, "outputs": [ { "data": { "text/plain": [ "Fraction(43, 100)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.d_ranking_histogram['abc'][0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Voters in a bin are distributed uniformly. This histogram and the CDF of this distribution can be visualized by:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.311228Z", "start_time": "2021-02-15T09:49:44.933167Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAAArKklEQVR4nO3dd5gV5fn/8fdN71VUpEgRpAiCFFFBQU0CRsFesMXEGH6xEBMTzTdGjeabYL4GDdFIiEHUqIAFwR4bIhGkBFyaIp2lKCJdQHb3/v0xB1jWZXcWzpzZc87ndV17eabfs6xzn3memfsxd0dERLJXhbgDEBGReCkRiIhkOSUCEZEsp0QgIpLllAhERLJcpbgDKKsjjjjCW7RoEXcYIiJpZfbs2V+6e6PilqVdImjRogWzZs2KOwwRkbRiZisPtkxNQyIiWU6JQEQkyykRiIhkubTrIyjOnj17yM3NZdeuXXGHknGqVatG06ZNqVy5ctyhiEhEMiIR5ObmUrt2bVq0aIGZxR1OxnB3Nm7cSG5uLi1btow7HBGJSGRNQ2Y22sy+MLP5B1luZjbCzJaYWY6ZnXSox9q1axcNGzZUEkgyM6Nhw4a60xLJcFH2EYwB+pewfADQJvFzA/Do4RxMSSAa+r2KZL7IEoG7TwG+KmGVQcCTHpgO1DOzxlHFIyKS1ibfD+tyItl1nE8NNQFWF5rOTcz7FjO7wcxmmdmsDRs2pCS4sqpVq9YB02PGjOGmm24CYOTIkTz55JMH3Xby5Ml8+OGHkcYnImls1uMw+Q+wYEIku4+zs7i4NodiR8lx91HAKIDu3bun3Ug6Q4YMKXH55MmTqVWrFqeeeuphHys/P5+KFSse9n5EpJxYNR1e+yUcdzaceWckh4jzjiAXaFZouimwNqZYInXPPffwwAMPADBixAg6dOhA586dufzyy1mxYgUjR47kwQcfpEuXLnzwwQesXLmSs846i86dO3PWWWexatUqAJYuXUqvXr3o0aMHd9111767kMmTJ9OvXz8GDx5Mp06dADj//PPp1q0bHTt2ZNSoUftiqVWrFrfffjvdunXj7LPPZsaMGfTt25dWrVoxadKkFP9mRKREW9bAuKuhXjO46DGoEM2XvDjvCCYBN5nZWOBkYIu7rzvcnf7u5QUsXLv1sIMrrMMxdbj7vI4lrrNz5066dOmyb/qrr75i4MCB31pv2LBhLF++nKpVq7J582bq1avHkCFDqFWrFrfddhsA5513Htdccw3XXnsto0eP5pZbbuGll15i6NChDB06lCuuuIKRI0cesN8ZM2Ywf/78fY95jh49mgYNGrBz50569OjBRRddRMOGDdmxYwd9+/bl/vvv54ILLuDOO+/krbfeYuHChVx77bXFxiwiMdizE8ZdGfz32pehev3IDhXl46PPAtOA480s18x+ZGZDzGxvO8lrwDJgCfAP4KdRxZIK1atXZ+7cuft+7r333mLX69y5M1deeSX/+te/qFSp+Dw8bdo0Bg8eDMDVV1/N1KlT982/5JJLAPYt36tnz54HPOs/YsQITjzxRHr16sXq1av57LPPAKhSpQr9+wcPc3Xq1IkzzjiDypUr06lTJ1asWHHovwARSR53eHkorJ0DF46CI9tFerjI7gjc/YpSljtwY7KPW9o397i9+uqrTJkyhUmTJnHfffexYMGCUrcJ8whnzZo1932ePHkyb7/9NtOmTaNGjRr07dt337sAlStX3re/ChUqULVq1X2f8/LyDuWURCTZpj0COeOg353Q7pzID6daQylUUFDA6tWr6devH3/605/YvHkz27dvp3bt2mzbtm3feqeeeipjx44F4Omnn6Z3794A9OrVixdeeAFg3/LibNmyhfr161OjRg0++eQTpk+fHuFZiUhSLXkH3vottB8Ip9+WkkMqEaRQfn4+V111FZ06daJr167ceuut1KtXj/POO48JEybs6yweMWIEjz/+OJ07d+app57iL3/5CwAPPfQQw4cPp2fPnqxbt466desWe5z+/fuTl5dH586d+e1vf0uvXr1SeZoicqg2LoXnfwiN2sP5j0KKXui0oIUmfXTv3t2LDkyzaNEi2rdvH1NEqfP1119TvXp1zIyxY8fy7LPPMnHixMiPmy2/X5FY7d4Gj50N2z+HH78HDZJb38vMZrt79+KWZUTRuWwxe/ZsbrrpJtydevXqMXr06LhDEpFkKCiACUPgy8/g6heTngRKo0SQRvr06cPHH38cdxgikmzv3w+fvAL9h0Grvik/vPoIRETitOhleH8YnDgYTi65CkFUlAhEROLy+UJ48SfQpBuc+2DKOoeLUiIQEYnD11/B2Cugai247GmoXC22UNRHICKSavl58Px1sHUt/OBVqBNvBX7dESTR+vXrufzy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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ranking = 'abc'\n", "profile.plot_histogram(ranking, label='Histogram')\n", "profile.plot_cdf(ranking, label='CDF')\n", "plt.ylabel('Proportion of the voters %s' % ranking)\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All other features are defined as usual. For example:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.328617Z", "start_time": "2021-02-15T09:49:45.315133Z" } }, "outputs": [ { "data": { "text/plain": [ " ==> c" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rand_strategy = pa.RandStrategyThresholdGridUniform(denominator_threshold=100, profile=profile)\n", "strategy = rand_strategy()\n", "strategy" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.366414Z", "start_time": "2021-02-15T09:49:45.333502Z" } }, "outputs": [ { "data": { "text/plain": [ "EquilibriumStatus.NOT_EQUILIBRIUM" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "strategy.is_equilibrium" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ProfileTwelve" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a *ProfileTwelve*, the voters behave as if their utility for their middle candidate was either infinitely close to 0 or to 1. For example, voters with the ranking $abc$ are split in two categories: voters *a_bc* (whose utility for $b$ is very low) and voters *ab_c* (whose utility for $b$ is very high). This can be interpreted in two ways:\n", "\n", "* As a model of their preferences: voters *a_bc* have a utility for $b$ that is very close to 1,\n", "* As a behavioral model: when their best response is utility-dependent, voters *a_bc* always choose to vote $a$ only, no matter the utility threshold of the best response." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a profile:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.389351Z", "start_time": "2021-02-15T09:49:45.369404Z" } }, "outputs": [ { "data": { "text/plain": [ " (Condorcet winner: b)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile = pa.ProfileTwelve({'ab_c': Fraction(1, 10), 'b_ac': Fraction(6, 10),\n", " 'c_ab': Fraction(2, 10), 'ca_b': Fraction(1, 10)})\n", "profile" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Share of voters *ab_c*:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.414285Z", "start_time": "2021-02-15T09:49:45.391346Z" } }, "outputs": [ { "data": { "text/plain": [ "Fraction(1, 10)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.ab_c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Which types are in the profile?" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.436237Z", "start_time": "2021-02-15T09:49:45.416279Z" } }, "outputs": [ { "data": { "text/plain": [ "{ab_c, b_ac, c_ab, ca_b}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.support_in_types" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Are all possible types in the profile?" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.468461Z", "start_time": "2021-02-15T09:49:45.439220Z" } }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.is_generic_in_types" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Is one type shared by a majority of voters?" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.498085Z", "start_time": "2021-02-15T09:49:45.471133Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.has_majority_type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to the usual *StrategyOrdinal* and *StrategyThreshold*, this kind of profile also accepts a *StrategyTwelve*:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.523019Z", "start_time": "2021-02-15T09:49:45.500079Z" } }, "outputs": [ { "data": { "text/plain": [ " ==> b" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "strategy = pa.StrategyTwelve({'abc': 'ab', 'bac': 'b', 'cab': pa.UTILITY_DEPENDENT}, profile=profile)\n", "strategy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the example above, the strategy for $cab$ is utility-dependent, meaning that voters *c_ba* vote for $c$ and voters *cb_a* vote for $c$ and $b$. One can envision it as a threshold strategy, but it is useless to specify the value of the threshold because we're dealing with a *ProfileTwelve*." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.547014Z", "start_time": "2021-02-15T09:49:45.525015Z" } }, "outputs": [ { "data": { "text/plain": [ "EquilibriumStatus.EQUILIBRIUM" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.is_equilibrium(strategy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since there is a finite number of pure strategies for a *ProfileTwelve*, it is possible to analyze them all:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.637537Z", "start_time": "2021-02-15T09:49:45.548975Z" } }, "outputs": [ { "data": { "text/plain": [ "Equilibria:\n", " ==> b (FF)\n", " ==> a (D)\n", " ==> b (FF)\n", "\n", "Non-equilibria:\n", " ==> b (FF)\n", " ==> b (FF)\n", " ==> a (D)\n", " ==> a (D)\n", " ==> b (FF)\n", " ==> b (FF)\n", " ==> a, b (FF)\n", " ==> a (D)\n", " ==> a (D)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.analyzed_strategies_pure" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All other features are defined as usual." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ProfileDiscrete" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A *ProfileDiscrete* is similar to a *ProfileNoisyDiscrete*, but of course without noise:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.648701Z", "start_time": "2021-02-15T09:49:45.639725Z" } }, "outputs": [ { "data": { "text/plain": [ " (Condorcet winner: b)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile = pa.ProfileDiscrete({\n", " ('abc', 0.9): Fraction(1, 10),\n", " ('bac', 0.2): Fraction(6, 10),\n", " ('cab', 0.25): Fraction(2, 10),\n", " ('cab', 0.75): Fraction(1, 10)\n", "})\n", "profile" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-03-12T14:22:56.012010Z", "start_time": "2020-03-12T14:22:56.006038Z" } }, "source": [ "In the above example, the share of voters with ranking $abc$ and a utility 0.9 for their middle candidate $b$ is 1/10, the share of voters with ranking $bac$ and a utility 0.2 for their middle candidate $a$ is 3/5, etc." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The difficulty is that there is now a concentration of voters, for example, on $(abc, 0.9)$. This opens the door to mixed strategies where voters of this type split their ballots between $a$ and $ab$. To account for this fact, a *StrategyThreshold* can include ratios of *optimistic voters*:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.668648Z", "start_time": "2021-02-15T09:49:45.650696Z" } }, "outputs": [ { "data": { "text/plain": [ " ==> b" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "strategy = pa.StrategyThreshold({\n", " 'abc': (0.9, 0.7),\n", " 'bac': 0.5,\n", " 'cab': 0.5\n", "}, profile=profile)\n", "strategy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above notation means that voters $abc$ have:\n", "\n", "* A utility threshold of 0.9: they vote for $a$ (resp. $ab$) if their utility for their second candidate $b$ is lower (resp. greater) than 0.9;\n", "* An ratio of optimistic voters of 0.7: voters whose utility for $b$ is equal to the utility threshold 0.9 are split, with 0.7 of them voting for $a$ and the rest voting for $ab$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Like for *ProfileTwelve*, there is a finite number of pure strategies, so it is possible to analyze them all:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.773886Z", "start_time": "2021-02-15T09:49:45.670643Z" } }, "outputs": [ { "data": { "text/plain": [ "Equilibria:\n", " ==> b (FF)\n", " ==> a (D)\n", " ==> b (FF)\n", "\n", "Non-equilibria:\n", " ==> a (D)\n", " ==> a (D)\n", " ==> a, b (FF)\n", " ==> b (FF)\n", " ==> b (FF)\n", " ==> a (D)\n", " ==> a (D)\n", " ==> b (FF)\n", " ==> b (FF)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.analyzed_strategies_pure" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All other features are defined as usual." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ProfileOrdinal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A *ProfileOrdinal* is a bit special, in the sense that it does not represent a profile, strictly speaking, but rather a family of profiles that have the same ordinal representation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Definition and Strategic Analysis" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.783860Z", "start_time": "2021-02-15T09:49:45.775882Z" } }, "outputs": [ { "data": { "text/plain": [ " (Condorcet winner: b)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile = pa.ProfileOrdinal({\n", " 'abc': Fraction(1, 10), \n", " 'bac': Fraction(6, 10), \n", " 'cab': Fraction(3, 10)\n", "})\n", "profile" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us analyze its ordinal strategies:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.874787Z", "start_time": "2021-02-15T09:49:45.785854Z" } }, "outputs": [ { "data": { "text/plain": [ "Equilibria:\n", " ==> b (FF)\n", " ==> a (D)\n", "\n", "Utility-dependent equilibrium:\n", " ==> b (FF)\n", "\n", "Non-equilibria:\n", " ==> b (FF)\n", " ==> a (D)\n", " ==> b (FF)\n", " ==> a, b (FF)\n", " ==> a (D)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.analyzed_strategies_ordinal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the example above, there are not only equilibria and non-equilibria but also a new category of strategies: utility-dependent equilibria. For example:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.900696Z", "start_time": "2021-02-15T09:49:45.878704Z" } }, "outputs": [ { "data": { "text/plain": [ " ==> b" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "strategy = profile.analyzed_strategies_ordinal.utility_dependent[0]\n", "strategy" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.937994Z", "start_time": "2021-02-15T09:49:45.906730Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "strategy.d_ranking_best_response['abc']" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:45.972454Z", "start_time": "2021-02-15T09:49:45.943531Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "strategy.d_ranking_best_response['bac']" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:46.002374Z", "start_time": "2021-02-15T09:49:45.975446Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "strategy.d_ranking_best_response['cab']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What happens here? For example, the best response for voters $bac$ is utility-dependent, with a utility threshold of 0.84 approximately. The fact that they vote $b$ in *strategy* is indeed a best response if and only if their utility for their second candidate $a$ is lower than this value. Overall, *strategy* is an equilibrium if and only if:\n", "\n", "* The utility of voters $bac$ for $a$ is lower than 0.84,\n", "* And the utility of voters $cab$ for $a$ is lower than 0.16." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Probability computations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following functions compute probabilities. They are based on the assumption that voters $abc$ have the **same** utility for their second candidate $b$ and that it is drawn uniformly in [0, 1]. And similarly for voters $acb$, $bac$, etc." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Probability that there exists an equilibrium:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:46.028314Z", "start_time": "2021-02-15T09:49:46.005366Z" } }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.proba_equilibrium()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, the probability is 1 because there exists some equilibria that do not depend on the utilities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Probability that there exists an equilibrium where voters $abc$ cast a ballot $ab$:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:46.059221Z", "start_time": "2021-02-15T09:49:46.031296Z" } }, "outputs": [ { "data": { "text/plain": [ "0.13709468816628012" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def test_abc_vote_ab(strategy):\n", " return strategy.abc == 'ab'\n", "profile.proba_equilibrium(test=test_abc_vote_ab)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Probability that there exists an equilibrium where candidate $c$ wins:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:46.084154Z", "start_time": "2021-02-15T09:49:46.062214Z" } }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def test_c_wins(strategy):\n", " return 'c' in strategy.winners\n", "profile.proba_equilibrium(test=test_c_wins)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Distribution of the number of equilibria:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:46.095131Z", "start_time": "2021-02-15T09:49:46.086471Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0. , 0. , 0.86290531, 0.13709469])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.distribution_equilibria()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above array means that it is impossible that there is 0 or 1 equilibrium, a probability 0.86 to have 2 equilibria, and a probability 0.14 to have 3 equilibria." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can access the distribution of equilibria, conditionally on a given test:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:46.107114Z", "start_time": "2021-02-15T09:49:46.097140Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0.86290531, 0.13709469])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.distribution_equilibria(test=test_abc_vote_ab)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above array means that there is a probability 0.86 to have no equilibrium, and a probability 0.14 to have one equilibrium (conditionally on the given test)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Distribution of the number of winners at equilibrium:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:46.119098Z", "start_time": "2021-02-15T09:49:46.109110Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 1, 0])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.distribution_winners()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The array above means that there are always 2 candidates (namely $a$ and $b$) who can win at equilibrium." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can access the distribution of winners, conditionally on a given test:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "ExecuteTime": { "end_time": "2021-02-15T09:49:46.133045Z", "start_time": "2021-02-15T09:49:46.122075Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0.86290531, 0.13709469, 0. , 0. ])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.distribution_winners(test=test_abc_vote_ab)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-03-12T15:02:21.506602Z", "start_time": "2020-03-12T15:02:21.501650Z" } }, "source": [ "The above array means that there is a probability 0.86 of having 0 winner (i.e. when there is no equilibrium), and a probability 0.14 to have 1 winner (conditionally on the given test)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }