Created
March 25, 2026 22:39
-
-
Save michaelchughes/9802a5d01d65e847a9395bf41cac5fc5 to your computer and use it in GitHub Desktop.
Integral Of MaxArea Given Uniform On CRatio
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "id": "5628d633-5bc2-414f-9d3b-51332bc061f8", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import numpy as np\n", | |
| "import scipy.integrate" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "id": "fab68c79-b6ea-4e17-81f4-1fc0c0a6daf6", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import matplotlib.pyplot as plt" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "7e59c2c7-84af-42ca-99ee-055c79b5b1ee", | |
| "metadata": {}, | |
| "source": [ | |
| "### Define uniform distribution on C, the cost ratio" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 91, | |
| "id": "72ac2a05-f015-4965-a5a9-dca8b9b5d801", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "min_fp_cost_ratio = 1./9\n", | |
| "max_fp_cost_ratio = 1./6" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 92, | |
| "id": "ece3dac6-d42d-4095-84e6-f2dd05e4c5ba", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def pdf_of_C(C, min_fp_cost_ratio, max_fp_cost_ratio):\n", | |
| " if isinstance(C, float):\n", | |
| " if min_fp_cost_ratio <= C and C <= max_fp_cost_ratio:\n", | |
| " return 1.0 / (max_fp_cost_ratio - min_fp_cost_ratio)\n", | |
| " else:\n", | |
| " return 0.0\n", | |
| " else:\n", | |
| " C_A = C\n", | |
| " mask_A = np.logical_and(min_fp_cost_ratio <= C, C <= max_fp_cost_ratio)\n", | |
| " pdf_A = 1.0 / (max_fp_cost_ratio - min_fp_cost_ratio) * np.ones_like(C_A)\n", | |
| " pdf_A[np.logical_not(mask_A)] = 0.\n", | |
| " return pdf_A" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "def01d95-6108-4f6d-a41f-b89692982986", | |
| "metadata": {}, | |
| "source": [ | |
| "### Define a mapping from C to t\n", | |
| "\n", | |
| "Requires picking particular sizes of pos and neg set." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 93, | |
| "id": "6d9b7488-fb7d-43b4-868c-1cf874ea50be", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "P = 100\n", | |
| "N = 900" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 94, | |
| "id": "34dca438-7f87-49a4-b9dd-56a791b7dce0", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def to_t(Cratio_G):\n", | |
| " return (N * Cratio_G) / (N * Cratio_G + P)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 95, | |
| "id": "07fd4517-89e7-4742-b2e1-cacea0f814aa", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def to_C(t_G):\n", | |
| " return P * t_G / (N - N * t_G)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "c6ccd20d-f872-4546-95ba-3254e56ad443", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Verify the mapping is invertible" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 101, | |
| "id": "f59cf83e-faf2-4674-bd14-363a8ec3924c", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "started with these t vals:\n", | |
| " [1.00000000e-04 2.57358974e-02 5.13717949e-02 7.70076923e-02\n", | |
| " 1.02643590e-01 1.28279487e-01 1.53915385e-01 1.79551282e-01\n", | |
| " 2.05187179e-01 2.30823077e-01 2.56458974e-01 2.82094872e-01\n", | |
| " 3.07730769e-01 3.33366667e-01 3.59002564e-01 3.84638462e-01\n", | |
| " 4.10274359e-01 4.35910256e-01 4.61546154e-01 4.87182051e-01\n", | |
| " 5.12817949e-01 5.38453846e-01 5.64089744e-01 5.89725641e-01\n", | |
| " 6.15361538e-01 6.40997436e-01 6.66633333e-01 6.92269231e-01\n", | |
| " 7.17905128e-01 7.43541026e-01 7.69176923e-01 7.94812821e-01\n", | |
| " 8.20448718e-01 8.46084615e-01 8.71720513e-01 8.97356410e-01\n", | |
| " 9.22992308e-01 9.48628205e-01 9.74264103e-01 9.99900000e-01]\n", | |
| "mapping to C and back gave:\n", | |
| " [1.00000000e-04 2.57358974e-02 5.13717949e-02 7.70076923e-02\n", | |
| " 1.02643590e-01 1.28279487e-01 1.53915385e-01 1.79551282e-01\n", | |
| " 2.05187179e-01 2.30823077e-01 2.56458974e-01 2.82094872e-01\n", | |
| " 3.07730769e-01 3.33366667e-01 3.59002564e-01 3.84638462e-01\n", | |
| " 4.10274359e-01 4.35910256e-01 4.61546154e-01 4.87182051e-01\n", | |
| " 5.12817949e-01 5.38453846e-01 5.64089744e-01 5.89725641e-01\n", | |
| " 6.15361538e-01 6.40997436e-01 6.66633333e-01 6.92269231e-01\n", | |
| " 7.17905128e-01 7.43541026e-01 7.69176923e-01 7.94812821e-01\n", | |
| " 8.20448718e-01 8.46084615e-01 8.71720513e-01 8.97356410e-01\n", | |
| " 9.22992308e-01 9.48628205e-01 9.74264103e-01 9.99900000e-01]\n", | |
| "max error 1.1102230246251565e-16\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "my_t_S = np.linspace(0.0001, 0.9999, 40)\n", | |
| "ans_t_S = to_t(to_C(my_t_S))\n", | |
| "\n", | |
| "print(\"started with these t vals:\\n\", my_t_S)\n", | |
| "print(\"mapping to C and back gave:\\n\", ans_t_S)\n", | |
| "\n", | |
| "error = np.max(np.abs(my_t_S - ans_t_S))\n", | |
| "print(\"max error\", error)\n", | |
| "assert error < 1e-9" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "ad6f82c8-e4f2-4d76-bb77-9ea514f36281", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Define the jacobian (first derivative) of C(t) wrt t\n", | |
| "\n", | |
| "I got this formula by asking wolfram alpha for the first deriv of the to_C function above" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 102, | |
| "id": "24c65087-6088-4d80-acb7-02f5e08e37da", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def jac_to_C(t_G):\n", | |
| " return P / (N * np.square(t_G - 1))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "d1ece18a-a5a7-461b-b131-abd19190b623", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Use Change of Vars formula to get PDF of t when we have an invertible mapping and we know PDF of C" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 103, | |
| "id": "d5973e9c-80af-4366-a6d0-0ba344832ec7", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def pdf_of_t(t_G, *args):\n", | |
| " return pdf_of_C(to_C(t_G), *args) * np.abs(jac_to_C(t_G))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "a948da96-be5b-4b4d-ae8b-9061c35e7647", | |
| "metadata": {}, | |
| "source": [ | |
| "How can we verify these formulas?\n", | |
| "\n", | |
| "Let's show that we can both sample t and evaluate its pdf, and recover the same intended distribution" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "6e9c04f0-7f39-4f69-9ce6-aa9702915f38", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Show sampled distribution's PDF and explicit PDF match\n", | |
| "\n", | |
| "We'll compare:\n", | |
| "\n", | |
| "* making a histogram with 10000 samples of Cratio, mapped to t\n", | |
| "* using change of variables to compute the pdf of t\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 104, | |
| "id": "58862a06-fbe6-46dd-a498-8185c0029a59", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "0.9801950000000001 from histograms\n", | |
| "0.9999938499380415 from trapz on pdf_of_t\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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+f1+NSgfHhQYGKj27dsrMTGx2PLExER16dLlql9nz549io6Odj+Pi4u77DVXr159Ta/pa7w1VpL06quv6h//+IdWrlypDh06eCSvlbwxVk2aNNHevXuVlJTkfgwePFg333yzkpKSFBsb69HPYBZv/V517dpVBw8eLPaHMzk5WdHR0QoMDLzx4Bbx1njl5eXJz6/4nxe73S7j4kUONxbaItczVl27dlVaWppycnLcy5KTk+Xn56eaNWtKKpvf71fFmvNcy65Ll2K9++67xvfff2+MHTvWCA0NNY4cOWIYhmGMHz/euOeee9zbT5kyxVi4cKGRnJxsfPvtt8b48eMNScann37q3mbLli2G3W43XnrpJWPfvn3GSy+9VCYuxfLGWL388stGYGCg8cknnxS7DPDcuXOmfz5P8sZY/VxZudrFG2N17Ngxo0KFCsajjz5q7N+/31i6dKlRrVo148UXXzT983maN8brueeeM8LCwoz58+cbKSkpxurVq4369esbd9xxh+mfz5OudazOnTtn1KxZ0xg2bJjx3XffGRs2bDAaNmxoPPjgg+5tyur3+6+hfHjB9OnTjdq1axuBgYFGu3btjA0bNrjX3XvvvUbPnj3dz19++WWjfv36RlBQkFGxYkWjW7duxrJlyy57zY8//tho3LixERAQYDRp0uQX/4iUJp4eq9q1axuSLns899xzJn0i7/HG79X/KivlwzC8M1Zbt241OnfubDgcDqNevXrGxIkTS5w3pTTy9HgVFBQYzz//vHu72NhYY/To0dd0mbyvupaxMgzD2Ldvn9GnTx8jODjYqFmzpjFu3DgjLy+v2DZl9fv9l9gMo5TuAwMAAKUS53wAAABTUT4AAICpKB8AAMBUlA8AAGAqygcAADAV5QMAAJiK8gEAAExF+QAAAKaifAAAAFNRPgAAgKkoHwAAwFSUDwAAYKr/Dwtpu0OCPF+IAAAAAElFTkSuQmCC", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "## Draw 100000 samples of Cratio\n", | |
| "S = 100000\n", | |
| "prng = np.random.RandomState(101)\n", | |
| "C_S = prng.uniform(low=min_fp_cost_ratio, high=max_fp_cost_ratio, size=S)\n", | |
| "t_S = to_t(C_S)\n", | |
| "\n", | |
| "ys_B, xedges_A, _ = plt.hist(t_S, bins=51, density=True);\n", | |
| "xmids_B = xedges_A[:-1] + 0.5 * (xedges_A[1] - xedges_A[0])\n", | |
| "\n", | |
| "area = scipy.integrate.trapezoid(ys_B, xmids_B)\n", | |
| "print(area, 'from histograms')\n", | |
| "\n", | |
| "## Now show explicit pdf\n", | |
| "G = 100000\n", | |
| "tmin = to_t(min_fp_cost_ratio) - 0.01\n", | |
| "tmax = to_t(max_fp_cost_ratio) + 0.01\n", | |
| "t_G = np.linspace(tmin, tmax, G)\n", | |
| "pdf_G = pdf_of_t(t_G, min_fp_cost_ratio, max_fp_cost_ratio)\n", | |
| "plt.plot(t_G, pdf_G, 'k--');\n", | |
| "\n", | |
| "area = scipy.integrate.trapezoid(pdf_G, t_G)\n", | |
| "print(area, 'from trapz on pdf_of_t')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "9a79d15f-d21e-4d08-8651-4ba83e7d0f75", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Verify that trapezoid area needs to include pdf_of_t to be valid" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 106, | |
| "id": "6ba38a4e-782e-42f7-9205-60365070e1b7", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "area using trapz(pdf_of_t * maxA)\n", | |
| "0.5841607653415819\n", | |
| "area using just 1/(b-a) * trapz(maxA)\n", | |
| "0.5833333350003334\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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q4UuXboIarW6JaOaNWM855dfflm4//776xybO3euMHTo0GbnNVeGPue9e/cKSqVSKCgouO01W+OzkF1gTaRWqxEdHY2IiIg6xyMiIhAVFXXH9/br1w8eHh4YMWIEDh06VOd7J0+erHfNBx988K7XbKuM9Zz/rry8HNXV1XB2dm52ZnNlzGe9aNEidOzYETNmzGjRzObIWM95586dCAsLw8svvww3NzcEBQVhyZIl0Gg0LX4P5sBYz3no0KGIjo7Wd5mnpKRgz549eOihh1r2BsxEU57zzp07ERoaig8//BCenp7o3r073njjDVRUVOjPaY3PQm6G2kT5+fnQaDRwc3Orc9zNzQ25ubkNvsfDwwNr1qxBSEgIqqqq8O2332LEiBE4fPgwhg8fDgDIzc016JptnbGe89/NmzcPnp6eGDlyZIvfg7kw1rM+ceIE1q1bh9jYWGPfglkw1nNOSUnB77//jqeffhp79uxBcnIyXn75ZdTU1ODtt982+n2ZGmM95yeeeAI3btzA0KFDIQgCampq8OKLL2LevHlGvydT1JTnnJKSguPHj0OhUGDHjh3Iz8/HSy+9hMLCQv04oNb4LGQB1EwSiaTO14Ig1DtWq0ePHujRo4f+67CwMGRkZODjjz+u88FsyDUthTGec60PP/wQmzZtwuHDh6FQKFo2uBlqyWddUlKCKVOm4KuvvoKLi4tRc5ublv6Z1mq1cHV1xZo1ayCTyRASEoLs7Gx89NFHFlkA1Wrp53z48GEsXrwYq1atwqBBg3DlyhW89tpr8PDwwMKFC413IybOkOes1WohkUjw/fff63duX758OR5//HGsXLkStra2Bl+zKdgF1kQuLi6QyWT1qtG8vLx6VeudDB48GMnJyfqv3d3dm33NtsRYz7nWxx9/jCVLluDAgQMIDg5udl5zZoxnffXqVaSlpWHcuHGwsrKClZUVNm7ciJ07d8LKygpXr15t0XswB8b6mfbw8ED37t0hk8n0xwICApCbmwu1Wt384GbGWM954cKFmDp1KmbOnInevXvj0UcfxZIlS7B06VJotdoWy28umvKcPTw84OnpqS9+AN3PqiAIyMzMBNA6n4UsgJpILpcjJCQEkZGRdY5HRkYiPDy80deJiYmBh4eH/uuwsLB61zxw4IBB12xLjPWcAeCjjz7Ce++9h3379iE0NLRF8pozYzzrnj174sKFC4iNjdW/Hn74Ydx3332IjY2Ft7d3i96DOTDWz/SQIUNw5cqVOh/Cly9fhoeHB+RyefODmxljPefy8nJIpXU/OmUyGQTdpKLmhTZDTXnOQ4YMQXZ2NkpLS/XHLl++DKlUCi8vLwCt9FnYYsOpLVDt1L9169YJCQkJwuzZswV7e3shLS1NEARBmDdvnjB16lT9+Z988omwY8cO4fLly0J8fLwwb948AYCwbds2/TknTpwQZDKZ8MEHHwiJiYnCBx98wGnwRnjOy5YtE+RyufDTTz/Vme5aUlLS6vdnSozxrP+Os8CM85zT09OFdu3aCa+88oqQlJQk/Prrr4Krq6vw/vvvt/r9mQpjPOd33nlHaN++vbBp0yYhJSVFOHDggODv7y9MmjSp1e/PVBj6nEtKSgQvLy/h8ccfFy5evCgcOXJE6NatmzBz5kz9Oa3xWcgCqJlWrlwp+Pj4CHK5XOjfv79w5MgR/feeeeYZ4Z577tF/vWzZMsHf319QKBSCk5OTMHToUGH37t31rrl161ahR48egrW1tdCzZ887fphYipZ+zj4+PgKAeq933nmnle7IdBnjZ/qvWADpGOM5R0VFCYMGDRJsbGyELl26CIsXL25wTSZL0tLPubq6WvjPf/6jP8/b21t46aWXDFp2oy0y5DkLgiAkJiYKI0eOFGxtbQUvLy9h7ty5Qnl5eZ1zjP1ZKBEEC2yzIyIiIovGMUBERERkcVgAERERkcVhAUREREQWhwUQERERWRwWQERERGRxWAARERGRxWEBRERERBaHBRARERFZHBZAREREZHFYABGRRbn33nsxe/ZssWMQkchYABEREZHF4V5gRGQxnn32WXzzzTd1jqWmpsLX11ecQEQkGhZARGQxiouLMXr0aAQFBWHRokUAgI4dO0Imk4mcjIham5XYAYiIWotSqYRcLoednR3c3d3FjkNEIuIYICIiIrI4LICIiIjI4rAAIiKLIpfLodFoxI5BRCJjAUREFsXX1xenT59GWloa8vPzodVqxY5ERCJgAUREFuWNN96ATCZDYGAgOnbsiPT0dLEjEZEIOA2eiIiILA5bgIiIiMjisAAiIiIii8MCiIiIiCwOCyAiIiKyOCyAiIiIyOKwACIiIiKLwwKIiIiILA4LICIiIrI4LICIiIjI4rAAIiIiIovDAoiIiIgszv8DANpjGGPtI+8AAAAASUVORK5CYII=", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "G = 10000\n", | |
| "\n", | |
| "tmin = to_t(min_fp_cost_ratio)\n", | |
| "tmax = to_t(max_fp_cost_ratio)\n", | |
| "\n", | |
| "t_G = np.linspace(tmin, tmax, G)\n", | |
| "pdf_of_t_G = pdf_of_t(t_G, min_fp_cost_ratio, max_fp_cost_ratio) \n", | |
| "\n", | |
| "maxA_G = 0.5 + 100 * (t_G - 0.55)**2\n", | |
| "\n", | |
| "plt.plot(t_G, maxA_G)\n", | |
| "plt.xlabel('t')\n", | |
| "plt.ylabel('pretend maxA(t)');\n", | |
| "\n", | |
| "print(\"area using trapz(pdf_of_t * maxA)\")\n", | |
| "print(scipy.integrate.trapezoid( pdf_of_t_G * maxA_G, t_G))\n", | |
| "print(\"area using just 1/(b-a) * trapz(maxA)\")\n", | |
| "print(1/(tmax-tmin) * scipy.integrate.trapezoid( maxA_G, t_G))\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "id": "258b85cb-c23f-4082-8587-74ff5bc8058a", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3 (ipykernel)", | |
| "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.11.13" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 5 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment