Skip to content

Instantly share code, notes, and snippets.

@jietang
Created July 5, 2019 22:31
Show Gist options
  • Save jietang/06edaf1837edfac8b01de00b747c5cb3 to your computer and use it in GitHub Desktop.
Save jietang/06edaf1837edfac8b01de00b747c5cb3 to your computer and use it in GitHub Desktop.
toy trueskill simulation notebook
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import trueskill\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"import scipy\n",
"\n",
"# make 10 \"agents\" with different mean skill, sigma 8.3333 \n",
"SIGMA = 8.33333\n",
"agent_mus = np.arange(0, 50, 5) \n",
"\n",
"# true win prob is difference of normals\n",
"def win_prob(a, b):\n",
" mu1, mu2 = agent_mus[a], agent_mus[b]\n",
" return scipy.stats.norm.cdf(0, mu2 - mu1, np.sqrt(2) * SIGMA)\n",
" \n",
"exact_win_probs = np.array([[win_prob(i, j) for j in range(10)] for i in range(10)])"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [],
"source": [
"import itertools\n",
"import math\n",
"\n",
"BETA = 4.166666666666667\n",
"\n",
"def win_probability(team1, team2):\n",
" delta_mu = sum(r.mu for r in team1) - sum(r.mu for r in team2)\n",
" sum_sigma = sum(r.sigma ** 2 for r in itertools.chain(team1, team2))\n",
" size = len(team1) + len(team2)\n",
" denom = math.sqrt(size * (BETA * BETA) + sum_sigma)\n",
" ts = trueskill.global_env()\n",
" return ts.cdf(delta_mu / denom)\n",
"\n",
"def empirical_win_probs(rating):\n",
" return np.array([[win_probability([rating[i]], [rating[j]]) for j in range(10)] for i in range(10)])\n",
"\n",
"def loss(rating):\n",
" return np.linalg.norm(exact_win_probs - empirical_win_probs(rating))\n"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.732673064133224\n",
"0.7619774207250152\n",
"0.478610403883482\n",
"0.4303209380451774\n",
"0.27906019032097745\n",
"0.35831079864065485\n",
"0.3029006743053226\n",
"0.2962059309856477\n",
"0.2102523157444045\n",
"0.20752165400479453\n",
"0.19908174432951445\n",
"0.26221738034556374\n",
"0.23796344741241937\n",
"0.21890737759583337\n",
"0.23093232704883168\n",
"0.22625058050359226\n",
"0.2525731527494799\n",
"0.2312541267262886\n",
"0.24125293486144583\n",
"0.2170955752201308\n",
"0.19884313695914285\n",
"0.1904870190224114\n",
"0.1969093568380898\n",
"0.19991006751759205\n",
"0.17006011842339352\n",
"0.16371733064111882\n",
"0.14888035207227313\n",
"0.16297051175923555\n",
"0.18578193999119552\n",
"0.17986901314344236\n",
"0.174506723893724\n",
"0.14915731794981607\n",
"0.1428341904012664\n",
"0.13351843053954954\n",
"0.14580142471484323\n",
"0.14352570097415543\n",
"0.1741392587007858\n",
"0.17013502251475596\n",
"0.16773946175768017\n",
"0.16596134791091008\n",
"0.1644012403689129\n",
"0.16879101727685794\n",
"0.1639025795763988\n",
"0.17201823812809722\n",
"0.16244634190068605\n",
"0.15142086226643994\n",
"0.1479665284574357\n",
"0.1525549844763984\n",
"0.14594176561588493\n",
"0.14279705318517322\n",
"0.1357882621135596\n",
"0.13109122742422774\n",
"0.13322224174579578\n",
"0.12809397366439498\n",
"0.12240737964717167\n",
"0.11974974606353803\n",
"0.1142809038350734\n",
"0.10471100797053674\n",
"0.10458554180326134\n",
"0.1079437916946763\n",
"0.11271224605678133\n",
"0.10319063244083478\n",
"0.10322472127065137\n",
"0.10736341770345056\n",
"0.09592988794991598\n",
"0.08946693383988152\n",
"0.08489947430782564\n",
"0.08258667197906554\n",
"0.08890851500130083\n",
"0.0893631182570721\n",
"0.09799611745271385\n",
"0.09548614149501891\n",
"0.08831254883686268\n",
"0.08489123931611284\n",
"0.0868290146061946\n",
"0.0811675086438264\n",
"0.08529535604237998\n",
"0.08679220554436383\n",
"0.08422969035245875\n",
"0.0834883569997581\n",
"0.0816696070183367\n",
"0.08148302675605892\n",
"0.08338214038786018\n",
"0.08126904726904946\n",
"0.07872763809802535\n",
"0.0749255618711735\n",
"0.07441262125558906\n",
"0.07240338540135836\n",
"0.07402994595328576\n",
"0.071902952883182\n",
"0.0735288183486295\n",
"0.07390045383319946\n",
"0.0723115224240298\n",
"0.072072162976106\n",
"0.07574981823633117\n",
"0.0785912692399946\n",
"0.0767599984668436\n",
"0.07565398342846104\n",
"0.07535205836868093\n",
"0.07417920653941108\n",
"0.07366560078169357\n",
"0.07598526931211955\n",
"0.07574982678462519\n",
"0.07845246006094458\n",
"0.07799072519210218\n",
"0.07941272236900157\n",
"0.07917762985604408\n",
"0.08043153578781646\n",
"0.07716444055432219\n",
"0.07666851923318319\n",
"0.06952436946449549\n",
"0.0703475643068167\n",
"0.07001606429008807\n",
"0.06755481720840194\n",
"0.06507521695328705\n",
"0.06382051407736865\n",
"0.06238287773399256\n",
"0.06418073909547553\n",
"0.06282717328293076\n",
"0.06229056260605688\n",
"0.05937603753516991\n",
"0.06109119704849316\n",
"0.05957981520171373\n",
"0.056021967527313025\n",
"0.054527028773152714\n",
"0.055400369493241945\n",
"0.05351124854328266\n",
"0.05229051147542423\n",
"0.05327493659262955\n",
"0.052304449843951155\n",
"0.05541439867647227\n",
"0.058201779750110046\n",
"0.05730709539019338\n",
"0.054680918815035874\n",
"0.05646888302423784\n",
"0.05875485402247214\n",
"0.057552018115710105\n",
"0.05706944770425654\n",
"0.05723155549478364\n",
"0.05652408280935895\n",
"0.05590166024593177\n",
"0.05729481077234881\n",
"0.06079962401961784\n",
"0.06203573914224076\n",
"0.06361067077643365\n",
"0.06149213161607702\n",
"0.06096554704527007\n",
"0.06334937610569003\n",
"0.06391928109479164\n",
"0.0633423664061691\n"
]
}
],
"source": [
"NUM_GAMES = 30000\n",
"\n",
"# simulate games while sampling from matchups in band, print loss\n",
"\n",
"# initialize trueskills for each agent\n",
"draw_probability = 0.0\n",
"tau = 0.0\n",
"trueskill_env = trueskill.TrueSkill(draw_probability=draw_probability, tau=tau)\n",
"rating = {i: trueskill_env.create_rating(mu=25.0, sigma=SIGMA) for i in range(10)}\n",
"\n",
"losses = []\n",
"for i in range(NUM_GAMES):\n",
" if i % 200 == 0:\n",
" print(loss(rating))\n",
" losses.append((i, loss(rating)))\n",
" \n",
" agent_a, agent_b = -1, -1\n",
" while agent_a == agent_b:\n",
" agent_a = np.random.randint(10)\n",
" agent_b = np.random.randint(10)\n",
" \n",
" agent_a_win_prob = exact_win_probs[agent_a][agent_b]\n",
" if np.random.random() < agent_a_win_prob:\n",
" winner = agent_a\n",
" loser = agent_b\n",
" else:\n",
" winner = agent_b\n",
" loser = agent_a\n",
" \n",
" rating[winner], rating[loser] = trueskill.rate_1vs1(rating[winner], rating[loser], drawn=False, env=trueskill_env)\n",
" \n"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.732673064133224\n",
"2.0138907739915157\n",
"1.7635707142944645\n",
"1.693842086918897\n",
"1.6544352712468626\n",
"1.6122334448170677\n",
"1.5789063250884678\n",
"1.5391845286592385\n",
"1.5158961315345671\n",
"1.4820451669540111\n",
"1.4756005480893477\n",
"1.453233434496831\n",
"1.4330595528913397\n",
"1.425530351895948\n",
"1.4132405945618618\n",
"1.3950521142094536\n",
"1.376388701459695\n",
"1.3520916831905128\n",
"1.3404252449704137\n",
"1.3307398789381268\n",
"1.326341771257169\n",
"1.3255408417119128\n",
"1.3246273231445191\n",
"1.3076340525599186\n",
"1.3026691733569986\n",
"1.297421914993027\n",
"1.29856454239155\n",
"1.2918228259394104\n",
"1.28976159675304\n",
"1.2850704234461725\n",
"1.2791688269867432\n",
"1.2771530554945452\n",
"1.2752926333218981\n",
"1.2654980721598068\n",
"1.257808624183433\n",
"1.2519806065542194\n",
"1.2446810599989544\n",
"1.239455715083673\n",
"1.2337351485524877\n",
"1.2271116666682949\n",
"1.222690087921376\n",
"1.2178177454058345\n",
"1.215426227295183\n",
"1.213496385819764\n",
"1.2116140065460301\n",
"1.2064572347472124\n",
"1.2058761854393105\n",
"1.2020023991901327\n",
"1.2005330596221528\n",
"1.1972992146099133\n",
"1.1937108335306907\n",
"1.19167913239586\n",
"1.187952801545861\n",
"1.187195702239876\n",
"1.1825459600565302\n",
"1.1798618362396527\n",
"1.178238169098782\n",
"1.1762923840004709\n",
"1.1747949024705382\n",
"1.17248825769746\n",
"1.1701696156690284\n",
"1.1700167339114762\n",
"1.1683155149910123\n",
"1.165544253794536\n",
"1.1641846739759059\n",
"1.163632227850198\n",
"1.1594924059482883\n",
"1.1575208626454727\n",
"1.1537379620015291\n",
"1.1511499364286186\n",
"1.14913685118548\n",
"1.148179718421358\n",
"1.1456210090200563\n",
"1.1430084745744675\n",
"1.141930141743311\n",
"1.1386394918380967\n",
"1.1361490913384555\n",
"1.134420872802889\n",
"1.132148325513027\n",
"1.1312216644479145\n",
"1.1304174259299018\n",
"1.1303547367159332\n",
"1.1305604687785287\n",
"1.1271298527531421\n",
"1.1248160691509572\n",
"1.1225937249539224\n",
"1.1197450551075419\n",
"1.1194617973192817\n",
"1.118782486936293\n",
"1.1166506605755366\n",
"1.114710072504178\n",
"1.112022073087617\n",
"1.10963092750876\n",
"1.1084234381485154\n",
"1.107597901216996\n",
"1.1051335054190876\n",
"1.1046352113942637\n",
"1.1031767136419157\n",
"1.1028633170927327\n",
"1.1023359777689699\n",
"1.1005455525328913\n",
"1.09857247394866\n",
"1.0975104432021512\n",
"1.0957810813975815\n",
"1.0942182450424185\n",
"1.0935026302639026\n",
"1.0924091593659893\n",
"1.09123632358097\n",
"1.0895265826806484\n",
"1.0899711964841385\n",
"1.0885621229050406\n",
"1.0871876063214527\n",
"1.0853878272874458\n",
"1.0840585335965716\n",
"1.0816761790234863\n",
"1.081726345232076\n",
"1.0803050627239645\n",
"1.0790177556806988\n",
"1.078142285938409\n",
"1.0773168643738213\n",
"1.076042185758132\n",
"1.075352091015731\n",
"1.0737158407146192\n",
"1.0719986892527746\n",
"1.0712713866089614\n",
"1.0706525971623417\n",
"1.0700386880693782\n",
"1.0681876217213153\n",
"1.0675545488950235\n",
"1.06582498367535\n",
"1.0643805105358428\n",
"1.062793411603899\n",
"1.0610728282532818\n",
"1.0604587763588604\n",
"1.0596036665181523\n",
"1.0589995551082068\n",
"1.0575945296063074\n",
"1.056802427836153\n",
"1.056269819463824\n",
"1.055776894423376\n",
"1.0543691604262269\n",
"1.0538550910296918\n",
"1.0527227371915815\n",
"1.0531359834707432\n",
"1.0519201704857903\n",
"1.0513477495859729\n",
"1.0492420140636687\n",
"1.0486580056822252\n",
"1.0485546828954437\n",
"1.0474399550589704\n"
]
}
],
"source": [
"# simulate games while sampling from matchups within +/- 1, print loss\n",
"\n",
"# initialize trueskills for each agent\n",
"draw_probability = 0.0\n",
"tau = 0.0\n",
"trueskill_env = trueskill.TrueSkill(draw_probability=draw_probability, tau=tau)\n",
"rating = {i: trueskill_env.create_rating(mu=25.0, sigma=SIGMA) for i in range(10)}\n",
"\n",
"losses_band = []\n",
"for i in range(NUM_GAMES):\n",
" if i % 200 == 0:\n",
" print(loss(rating))\n",
" losses_band.append((i, loss(rating)))\n",
" \n",
" agent_a, agent_b = -1, -1\n",
" while agent_a == agent_b:\n",
" agent_a = np.random.randint(10)\n",
" agent_b = min(9, max(0, agent_a + np.random.choice([-1, 1])))\n",
" \n",
" agent_a_win_prob = exact_win_probs[agent_a][agent_b]\n",
" if np.random.random() < agent_a_win_prob:\n",
" winner = agent_a\n",
" loser = agent_b\n",
" else:\n",
" winner = agent_b\n",
" loser = agent_a\n",
" \n",
" rating[winner], rating[loser] = trueskill.rate_1vs1(rating[winner], rating[loser], drawn=False, env=trueskill_env)\n"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.732673064133224\n",
"1.6883742137283795\n",
"1.1032659361639552\n",
"1.0637339425197205\n",
"0.9256138420684543\n",
"0.8884100484619311\n",
"0.8697851813077013\n",
"0.8358837416105932\n",
"0.8218305644403419\n",
"0.8234127642264386\n",
"0.7976074760794768\n",
"0.7872756357917224\n",
"0.7868867581478075\n",
"0.7643662282719739\n",
"0.7560662954892478\n",
"0.7522426143902955\n",
"0.7518203853628238\n",
"0.7225625411075927\n",
"0.7115380407132427\n",
"0.7020001464358723\n",
"0.6936409059990216\n",
"0.6856587762126679\n",
"0.6744991282740672\n",
"0.6670595102231196\n",
"0.6619811245533065\n",
"0.6536468207754053\n",
"0.6490797273218062\n",
"0.6497944204303522\n",
"0.6459129094362742\n",
"0.6433869563605356\n",
"0.6364712985121201\n",
"0.633206210988024\n",
"0.63398918461873\n",
"0.6264913601103335\n",
"0.6196858316056861\n",
"0.6157560858952249\n",
"0.6133723123895044\n",
"0.6117587037239295\n",
"0.6075706656930185\n",
"0.603339320234678\n",
"0.5997441122869093\n",
"0.5970892803614313\n",
"0.5907014523295445\n",
"0.5868386677854649\n",
"0.5847373640456731\n",
"0.5831227481348975\n",
"0.5791267961012309\n",
"0.5782133676577156\n",
"0.5777528812991721\n",
"0.5768367935031116\n",
"0.575642316595695\n",
"0.5744991233535605\n",
"0.5723340776966935\n",
"0.5703291599824066\n",
"0.5672857865910365\n",
"0.5638131655561243\n",
"0.5621555542376022\n",
"0.5607691123855183\n",
"0.5583423886832025\n",
"0.5580957339472759\n",
"0.5566542045040335\n",
"0.5563607743700244\n",
"0.5535512927530746\n",
"0.5534094136875762\n",
"0.5525732245780353\n",
"0.5509790989096132\n",
"0.5496687057839289\n",
"0.5481233553613825\n",
"0.5475068259346075\n",
"0.5453682746732563\n",
"0.5424097580327658\n",
"0.5396627853735309\n",
"0.5377612773334788\n",
"0.5362930155401545\n",
"0.5345470004198281\n",
"0.5330637807398793\n",
"0.5298017211064675\n",
"0.5282243453833252\n",
"0.527999846837331\n",
"0.5269374604597027\n",
"0.5263496930439652\n",
"0.5260391947070866\n",
"0.5248626166076649\n",
"0.5244156571686656\n",
"0.5213310869251527\n",
"0.5204628258840507\n",
"0.5190573333109874\n",
"0.5175771648318502\n",
"0.5171792725435922\n",
"0.5175577241652507\n",
"0.5159720676328294\n",
"0.5157207562315957\n",
"0.5141064127046722\n",
"0.5131703008087882\n",
"0.5132573983963482\n",
"0.511797893327214\n",
"0.5104264285190747\n",
"0.5102104772527406\n",
"0.5091484883297736\n",
"0.5076816322563832\n",
"0.5079403000025777\n",
"0.5075232911850964\n",
"0.5071035828061248\n",
"0.5068694466811726\n",
"0.5057160014750829\n",
"0.5043105723638261\n",
"0.5043841381362646\n",
"0.5041495193622996\n",
"0.503364913456678\n",
"0.5028562690806186\n",
"0.5032101989840589\n",
"0.5024463343406136\n",
"0.501337134586856\n",
"0.500828447595661\n",
"0.5003911220317491\n",
"0.49931270451994014\n",
"0.4987059183250141\n",
"0.4978039603093176\n",
"0.4974007371905918\n",
"0.4957270683516512\n",
"0.49451723823759763\n",
"0.4939437734546547\n",
"0.49314363739090666\n",
"0.492003616620395\n",
"0.49231768668178577\n",
"0.4914104717596143\n",
"0.49054719272558944\n",
"0.4898701049991792\n",
"0.4890127872324652\n",
"0.4883068093055317\n",
"0.4882773839385245\n",
"0.48731636175508436\n",
"0.48614309620628177\n",
"0.48493435714952204\n",
"0.4841457876412707\n",
"0.48304272594127834\n",
"0.48195023053263575\n",
"0.4814193592544477\n",
"0.4809303273982943\n",
"0.4806593814071245\n",
"0.48017004386001544\n",
"0.4799546586807792\n",
"0.48015104765699235\n",
"0.47980935129161073\n",
"0.4796812521127401\n",
"0.47893536471644815\n",
"0.4786620497000216\n",
"0.4779410218869142\n",
"0.47722228680464995\n",
"0.47660753332326045\n"
]
}
],
"source": [
"# simulate games while sampling from matchups within +/- 2, print loss\n",
"LOSS_BAND = 2\n",
"\n",
"# initialize trueskills for each agent\n",
"draw_probability = 0.0\n",
"tau = 0.0\n",
"trueskill_env = trueskill.TrueSkill(draw_probability=draw_probability, tau=tau)\n",
"rating = {i: trueskill_env.create_rating(mu=25.0, sigma=SIGMA) for i in range(10)}\n",
"\n",
"losses_band2 = []\n",
"for i in range(NUM_GAMES):\n",
" if i % 200 == 0:\n",
" print(loss(rating))\n",
" losses_band2.append((i, loss(rating)))\n",
" \n",
" agent_a, agent_b = -1, -1\n",
" while agent_a == agent_b:\n",
" agent_a = np.random.randint(10)\n",
" agent_b = min(9, max(0, agent_a + np.random.choice(np.arange(-LOSS_BAND, LOSS_BAND+1))))\n",
" \n",
" agent_a_win_prob = exact_win_probs[agent_a][agent_b]\n",
" if np.random.random() < agent_a_win_prob:\n",
" winner = agent_a\n",
" loser = agent_b\n",
" else:\n",
" winner = agent_b\n",
" loser = agent_a\n",
" \n",
" rating[winner], rating[loser] = trueskill.rate_1vs1(rating[winner], rating[loser], drawn=False, env=trueskill_env)"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.732673064133224\n",
"1.4009557430828146\n",
"1.214170787970079\n",
"0.9903762491680613\n",
"0.9614891368836245\n",
"0.8826200137550807\n",
"0.7888731770256145\n",
"0.7308835878988363\n",
"0.6984268362946175\n",
"0.6753384662264371\n",
"0.6491178609127409\n",
"0.6348817618179856\n",
"0.6314704518168126\n",
"0.6362303712302507\n",
"0.6057230868285467\n",
"0.6027316806475972\n",
"0.5906909324911903\n",
"0.5911372545291765\n",
"0.5759958558091228\n",
"0.5710649710406084\n",
"0.5693111270355999\n",
"0.5583377256109752\n",
"0.5630422606635535\n",
"0.5643276849803536\n",
"0.5621681169884623\n",
"0.5483644848876584\n",
"0.5473496226018393\n",
"0.5385353501384103\n",
"0.5467097597650185\n",
"0.5416998122641752\n",
"0.541000125969437\n",
"0.5319268901896429\n",
"0.5263478243338506\n",
"0.520758735656518\n",
"0.5205830205907084\n",
"0.5193092191923225\n",
"0.5112584345858228\n",
"0.5082608173895803\n",
"0.5051546817618847\n",
"0.499851897014059\n",
"0.49886328658058077\n",
"0.49686175555282314\n",
"0.4873925082813313\n",
"0.49050619012795765\n",
"0.49144669143005826\n",
"0.485777523422613\n",
"0.4844625337175747\n",
"0.48026644320061795\n",
"0.47953972471000667\n",
"0.4810343922192326\n",
"0.4791943135293274\n",
"0.47626669409878136\n",
"0.47561551252914097\n",
"0.47016862691783434\n",
"0.46571945210434706\n",
"0.4653681224111716\n",
"0.4670896362943322\n",
"0.46502597332804774\n",
"0.4594635782246468\n",
"0.4550976280702808\n",
"0.45494132498025314\n",
"0.4544982887236686\n",
"0.4542269971606091\n",
"0.4559235563625305\n",
"0.4548630344664162\n",
"0.45592324138687823\n",
"0.45796881451694976\n",
"0.4585887199456538\n",
"0.455801400490371\n",
"0.4538336079384711\n",
"0.45404120361038247\n",
"0.45472320323409626\n",
"0.45332434043328407\n",
"0.45001329239789223\n",
"0.45022300515184194\n",
"0.4509317224483467\n",
"0.44919159465607095\n",
"0.44675500887612496\n",
"0.44494527574018883\n",
"0.4423957310466148\n",
"0.43978708471312555\n",
"0.44061857403661514\n",
"0.4376955320808191\n",
"0.4390293501816439\n",
"0.43730319938589846\n",
"0.4393779410212781\n",
"0.43774548772143795\n",
"0.4367563738530956\n",
"0.4364568637289371\n",
"0.4341449187592038\n",
"0.4320232934800463\n",
"0.4318159459692336\n",
"0.4324186485607285\n",
"0.4304821881352364\n",
"0.4288317131291926\n",
"0.4285124548681974\n",
"0.42912168300303055\n",
"0.42674397035760603\n",
"0.42545150395026\n",
"0.42428065872282017\n",
"0.42375865783215744\n",
"0.4250995888496773\n",
"0.4249667501557627\n",
"0.4235868276842922\n",
"0.4223839185668895\n",
"0.4213232781369435\n",
"0.419179459350187\n",
"0.41621926915630186\n",
"0.41526106821926173\n",
"0.41522946356565343\n",
"0.41533762255943185\n",
"0.41751195696184873\n",
"0.4155384360132173\n",
"0.4149638821890604\n",
"0.4149326865116576\n",
"0.41541832608698914\n",
"0.413317572800427\n",
"0.4132548496986579\n",
"0.4122978253983058\n",
"0.4118245813844443\n",
"0.41186349630648755\n",
"0.4116627257837901\n",
"0.4112020446909972\n",
"0.4098104123498122\n",
"0.40782738772871957\n",
"0.4070187792064321\n",
"0.40728968247899333\n",
"0.4063768521997038\n",
"0.40702874254962873\n",
"0.4056693889345411\n",
"0.4035122230126291\n",
"0.4020199081165001\n",
"0.40190419962791946\n",
"0.402274876843495\n",
"0.40209568442017146\n",
"0.4007429532600862\n",
"0.4000443528939433\n",
"0.39927168942779373\n",
"0.39862111532074784\n",
"0.397943953749005\n",
"0.3976907927866103\n",
"0.39804234587719123\n",
"0.39660282668999025\n",
"0.3967071338382615\n",
"0.3959660348239449\n",
"0.39642076029666345\n",
"0.3959626039812585\n",
"0.39527065443355536\n",
"0.39602411343235777\n",
"0.39635258778584814\n"
]
}
],
"source": [
"# simulate games while sampling from matchups within +/- 1, plus the endpoints are allowed. print loss\n",
"LOSS_BAND = 1\n",
"\n",
"# initialize trueskills for each agent\n",
"draw_probability = 0.0\n",
"tau = 0.0\n",
"trueskill_env = trueskill.TrueSkill(draw_probability=draw_probability, tau=tau)\n",
"rating = {i: trueskill_env.create_rating(mu=25.0, sigma=SIGMA) for i in range(10)}\n",
"\n",
"losses_band1_ends = []\n",
"for i in range(NUM_GAMES):\n",
" if i % 200 == 0:\n",
" print(loss(rating))\n",
" losses_band1_ends.append((i, loss(rating)))\n",
" \n",
" agent_a, agent_b = -1, -1\n",
" while agent_a == agent_b:\n",
" agent_a = np.random.randint(10)\n",
" agent_b = min(9, max(0, agent_a + np.random.choice(np.hstack([[-100, 100], np.arange(-LOSS_BAND, LOSS_BAND+1)]))))\n",
" \n",
" agent_a_win_prob = exact_win_probs[agent_a][agent_b]\n",
" if np.random.random() < agent_a_win_prob:\n",
" winner = agent_a\n",
" loser = agent_b\n",
" else:\n",
" winner = agent_b\n",
" loser = agent_a\n",
" \n",
" rating[winner], rating[loser] = trueskill.rate_1vs1(rating[winner], rating[loser], drawn=False, env=trueskill_env)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEICAYAAABvQ5JRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzsnXmcHUW5v5+3+6wzk5nJLFknCwmQhSUkhCyAMYEriwoiiIrLhYuIuOF6VfCHRK+AKwKiclFZxAXh4gIiyiLIGiBACAkBQkjInsxMMvuctev3R/WZOZnMnjNLzrzPfPrT3VXVVW/36enveaveUy3GGBRFURRlsHCG2gBFURRlZKHCoyiKogwqKjyKoijKoKLCoyiKogwqKjyKoijKoKLCoyiKogwqPQqPiGwSkf8YDGMGAhFZLiK/HWo7lP4jIreJyHf7eWy3n7+IrBWRpR3LishkEWkSEbebY5tEZFp/7BoMDuS65diOm0Tkim7y3yEir+egnYPyWSUiRkQO7eexXZ5zx+uaXVZELheRX3VT70dF5MH+2NQb+uTxiMj5IvKCiDSIyFYR+YGIBAbKuKFGRWt/RGSq/4+SF5+7MeYIY8xjnaRvNsYUGWPSACLymIhc1KFMkTHmrUEy9aDFGHOJMeZ/usl/whgzY6DaF5EH/C8JTSKSFJFE1v5NfpnLRWSjn7ZVRP44UPYMFt1dV2PM1caYi6Dz/2ljzO+MMacMlG197WorAL4IVAALgZOBr+bCkM6+WXb3bbOLOvLiYTiS0M9sZDMYn78x5nT/S0IR8DvgB5l9Y8wlInI+8HHgP/wy84FHctG23t+d0yfhMcb8wlfRhDFmG/ZDPKGr8iIyU0QeEpE9IvK6iHwwK+82EfmFiPxdRJqBZV2klYjIb0SkWkTeFpH/JyKOX8cFIvKUiPxERGqB5V2YEhGRP4pIo4i8KCJzsuyYICL3+PVvFJFL/fTTgMuBD/nfgl4WkWUi8krWsQ+JyPNZ+0+IyFnd1evnOSLyDRHZICK1InKXiJT5eZlvH+eLyGYRqRGRb3ZzjcMi8iO/7C6/WyPq531dRJ7N3Pwi8mmxXUsRf/9uEdkpIvUi8riIHJFVb1REfuxf83oRedKv93G/SJ1/XRZ3YtNyEfm/bq75Jt+21UCziAREZJbvVdT5Np7ZodoK/3o3isi/RWRKVn3Xi8gWsZ74CyLyjj58/p12VWR9DgERuQp4B3Cjf843+mXaukh6+BwqRORv/rnt8e+TTv/3ujsX/7reJfb/odG/TvOz8uf659co9ht7pLM2sspfKCLrRGSviPyzwzU1IvIZEVnv1/c/IjJdRJ72bbtLREJ+2aVivYTL/ft1k4h8NKuuti6/rLJfF5GdwK2ZtKzyk0TkT2L/d2qzrvd0EfmXn1YjIr8TkdLuzrGXHAf80xizAcAYs9MYc3M3122TiFwmIq/61+7WrP+p/c7PT/+kiLzpf/73isiEDtW+W0Te8s/rh9L+jOvNOR/XnS1dnEN2b85+/9Nin61PZpXv7ln+br/9RhHZJiI9OyPGmG4XYBP2m0BneX8BvtdFXiGwBfgvIADMBWqA2X7+bUA9Vrgc7D9JZ2m/Af4KjAKmAm8An/DruABIAZ/324h2YsdyIAl8AAhiPbSN/rYDvAB8CwgB04C3gFOzjv1tVl1RIIb1+ILALmCbb1sUaAXKe1HvF4AVQBUQBv4X+IOfNxUwwC/9OucAcWBWF9f5J8C9QJlvx33ANX6eg72plgOHAXuBuVnHXugfEwauA1Zl5f0MeAyYCLjA8X65jH2Bbu6ZLq951j21Cpjkn2MQeBMr9CHgJKARmJF1rzQCS3wbrgeezGrvY/51DwBfAXYCkT7Y8h8dP++O5+lfi4s6nKcBDu3F53ANcJPffhArYtLFtevpXGLAu/3P5BpghZ8XAt4GvuS38QH/vL/bRTvv86/5LL+t/wc83eHc/goUA0dg78FHsPdyCfAqcL5fdin2//Ba//N5J9Dc4fP7boey3/fLRv20rX6+C7zsX89C7DPgRD/vUOBd/nGV2Hv7ut48q7LKtNnS4ZrvAf4b6+24vXgmrsHev2XAUz2c30nYZ988P+2nwOMdrvWjfl2Tsc+4i/pwzt3ZsrWz60M393rWs/XJXj7LdwDv8LdHA/N61JX+Cg/2obUVqOjiuA8BT3RI+1/gyqwb4Ded3BS/ydp3gUTmBP20TwGPZV2czT3Yvxz/nzPrYbwD+8+/sOPxwGXArR0/nKz8J4CzgUXAg8BdwGnAMmC1X6anetcBJ2fljcc+JAJZN0FVVv5zwIc7OTfB/oNPz0pbDGzM2p+K/adaB1zWzXUq9dst8a9RKzCnk3L73aR9ueZZ99SFWfnvwD5gnay0PwDLs+6LO7PyioA0MKmL9vdmbO+lLQckPD19DsB3sA/xQ3v6f+vFuTyclTcbaPW3lwDbyRI04Gm6Fp4H8L/AZV2XFmBK1rmdkJX/AvD1rP0f4z8AaX/YFmbl3wVckfX5ZT8ME/himpWWEZ7FQHV391fWcWcBL2Xtt32W3RzTZkuH9I8CD/ufY232uXZSdhNwSdb+u4EN3Zzfr7Hde9n3bxKYmnWtT8vK/wzwSB/OuTtbciE8PT3LN2Ofy8W9va/71f8otjvpGv8karooNgVYKCJ1WWkB4I6s/S2dHJedlvEs3s5Kexv7Lby7Orqs0xjj+e7nBOzFntDBRhcrLl3xb/wP1N/ei/2GF/f3wZ57d/VOAf4sIl5WfhoYm7W/M2u7BXuzdqQSO+72gohk0sRvCwBjzCYReRR7Q/6srZAdP7sKONevJ2NLBfbbVQTY0EmbvaWra75fvp++xRiTfT26/JyNMU0isidznO/af4L2z7TYP4/e2nKg9PQ5/BD7j/6gn3+zMeZ7nVXUi3PpeF9ExHalTgC2Gf9J4JP9f9ORKcD1IvLj7Oax1zxz3K6svNZO9sdl7e81xjR3aLura1xtjIl1kTcJeNsYk+qYISJjsd7uO7BepYP9/ztgjDG/A34nIkHsw/13IrLKGPPPLg7Jvn87nmvH85sAvJjVVpPYoYGJWDHosr5ennN3tuSCnp7l52A95u+J7T7/hjHmme4q7PPveMSOffwSOMMY80o3RbcA/zbGlGYtRcaYT2eVMZ0cl51Wg/1mMCUrbTK2e6u7OjoyKct+B9vFtd23cWMHG0cZY97dTd0Z4Vnib/8bKzzvpF14eqp3C3B6h/yIseNmfaEG+wA4IqueEmMHSDPn+x7st8hHsA/ADB/Bdrf8B9bLmZo5xK83BkzvpM3eXG/o+pp3Vs92YJLsO+7R8XPOrq8I262wXewYyNeADwKjjTGl2O5a6eLYzmzpDd2dd7efgzGm0RjzFWPMNOBM4MsicnLHSnp5Ll2xA5goWcqHvYZdsQX4VId7MGqMeboXbXXGaBEp7NB2V9e4u2u5BZgsnQ/KX+0fe5QxphjbRdaba9NrjDFJY8zdwGrgyG6KTsra7niuHc9vO1nPMP86ldPF/d2hvt6cc3e29Iae/qe7fZYbY543xrwPGIMdfrmrpwb7Gk59Ejag4BxjzHM9FP8bcLiIfFxEgv5ynIjM6m17xoay3gVcJSKjxA5+fhnoa4jzsSJytn8zfxHrnazAdmE1+gOBURFxReRIETnOP24XMLXDA/FpYAawAHjOGLMW/xsB7YN0PdV7k39OUwBEpFJE3tfHc8L3EH4J/ERExvh1TRSRU/3tCuBXwEXA+cAZIpIRv1H+dajFflu/ukO9twDXig2ScP0BxzC2G8TD9vV3R1fXvDOexX57/5p/nywFzgDuzCrzbhE5UeyA9v9gu8+2+OeR8u0KiMi3sF5Cf23pil10cc69+BzeKyKH+qJQj/VuvU6q6s25dMUz/rGX+tfwbOw92hU3AZeJH1AiNojn3F621RXfFpGQL6DvBe7uRx3PYUX0eyJSKCIREckEMI0CmoB6EZmIHZM5YPyB9Pf4zxhHRE7Hjms9281hnxWRKrFBQd8Eugu//gPwXyJyjP8/dDXwrDFmU1aZ/xaR0SIyCTsGnKmvN+fcF1s6o6f/6S6f5f7n/VERKTHGJIEGOr+396GvHs8V2G/Hf5f2OPgHOitojGkETgE+jFXgnbQPuPWFz2P7Xd8CngR+j30o9oW/Yvsp92LDJs/2v9mksf8gx2AHnGuwD+oS/7jMP06tiLzon1cz1m1ea4xJ+PnPYLsHdvtleqr3euxA9IMi0oh9CC7s4zll+Dp2kHiFiDRg+6kzsfs3A381xvzdGFOL7cL5lYiUY4M23sZ+63qV/R/EXwVeAZ7HjhF9HzsG04LtontKbJTWoi7s6vSad1bQv45nAKdjr9XPgf80xryWVez3wJW+Lcdiv/kB/BP4B3ZA9m2sp9ax+7XXtnTD9cAHxEYO3dBJfnefw2H+fhP2Xvm5MebRTurozbl0in8Nz8b2ze/Bnu+fuin/Z+xneqdv7xrs9e8vO7HXdzv2y+klHT6/XuH/75yBHTvbjO3S/pCf/W3sAH09cD/dnF8facAGtmwG6oAfAJ82xjzZzTG/x47xvoXtku7yh7rGmIexz857sKI6HftczOav2HG0Vdhz+7Wf3ptz7rUtXdjX7f90L57lHwc2+ffRJdjxsm6RfbuEFeXAEZHl2IH0j/VUVjn48T3U3xpjqobalsFARDZhA00eHmpbDlZ0rjZFURRlUFHhURRFUQYV7WpTFEVRBhX1eBRFUZRBZdhPYFdRUWGmTp061GYoiqIcNLzwwgs1xpjKobajK4a98EydOpWVK1cOtRmKoigHDSLS3awVQ452tSmKoiiDigqPoiiKMqio8CiKoiiDyrAf41EUZXiTTCbZunUrsVhXE04rA0UkEqGqqopgMDjUpvQJFR5FUQ6IrVu3MmrUKKZOncq+k2MrA4kxhtraWrZu3cohhxwy1Ob0Ce1qUxTlgIjFYpSXl6voDDIiQnl5+UHpaarwKIpywKjoDA0H63XPW+H5wyXL+PMPLhlqMxRFUZQO5K3wTHtuJ8kXnh9qMxRFGSKmTp1KTU0NAEVFnb05Xhkq8lZ4PAExPb4IT1EURRlk8ld4HJC0zrytKCOBs846i2OPPZYjjjiCm2++eajNUXogb8OpPQdEX/mgKIPKt+9by6vbG3Ja5+wJxVx5xhHdlrnlllsoKyujtbWV4447jnPOOSenNii5Jb+FRz0eRRkR3HDDDfz5z38GYMuWLaxfv36ILVK6I2+FxwiIp8KjKINJT57JQPDYY4/x8MMP88wzz1BQUMDSpUsPyt+2jCTydown7WpXm6KMBOrr6xk9ejQFBQW89tprrFixYqhNUnogb4XHE1GPR1FGAKeddhqpVIpZs2bxjW98g0WLFg21SUoP5G9XmwOORlMrSt4TDod54IEH9kvftGlT23ZTU9MgWqT0RP56PBrVpiiKMizJifCISEREnhORl0VkrYh8u5MyF4hItYis8peLctF2VxgRnPRAtqAoiqL0h1x1tcWBk4wxTSISBJ4UkQeMMR1H+f5ojPlcjtrsFs8BR8d4FEVRhh058XiMJdOJGvSXIX3qe47oGI+iKMowJGdjPCLiisgqYDfwkDHm2U6KnSMiq0Xk/0RkUjd1XSwiK0VkZXV1db/sMY4gKjyKoijDjpwJjzEmbYw5BqgCFojIkR2K3AdMNcYcDTwE3N5NXTcbY+YbY+ZXVlb2zx5HcLSnTVEUZdiR86g2Y0wd8ChwWof0WmNM3N/9FXBsrtvepz0NLlCUEcOFF17ImDFjOPLI9u+7S5cuZeXKlTlv67bbbuNznxuUoeq8JVdRbZUiUupvR4F3Aa91KDM+a/dMYF0u2u4KTz0eRRkxXHDBBfzjH/8YajOUXpIrj2c88KiIrAaex47x/E1EviMiZ/plLvVDrV8GLgUuyFHbneI5jo7xKMoIYcmSJZSVle2Xfscdd3DMMcdw5JFH8txzzwHw3HPPsXjxYubOncvxxx/P66+/DlhP5uyzz+a0007jsMMO42tf+1pbPbfeeiuHH344CxYs4Kmnnhqck8pjchJObYxZDcztJP1bWduXAZflor1e2aRRbYoy+DzwDdj5Sm7rHHcUnP69fh3a0tLCqlWrePzxx7nwwgtZs2YNM2fO5IknniAQCPDwww9z+eWXc8899wCwatUqXnrpJcLhMDNmzODzn/88gUCAK6+8khdeeIGSkhKWLVvG3Ln7Pe6UPpDHU+Y4Vng8D5y8naBBUZRuOO+88wDrETU0NFBXV0djYyPnn38+69evR0RIJpNt5U8++WRKSkoAmD17Nm+//TY1NTUsXbqUTKDThz70Id54443BP5k8Ir+FxwBeEpzwUJujKCODfnomA4WI7Ld/xRVXsGzZMv785z+zadMmli5d2pYfDrc/K1zXJZVKDZapI4q8dQWM4+CmgXSyx7KKouQnf/zjHwF48sknKSkpoaSkhPr6eiZOnAjYcZ2eWLhwIf/+97+pra0lmUxy9913D6TJI4L8FR7XwTVAOjHUpiiKMsCcd955LF68mNdff52qqip+/etfAxCJRJg7dy6XXHJJW9rXvvY1LrvsMubOndsrj2b8+PEsX76cxYsXc8IJJzBr1qwBPZeRgJhhPoPz/PnzTX9i8X//8SXMWlXN0U89gls8YQAsUxQFYN26dfowHkI6u/4i8oIxZv4QmdQj+evxOA6uB6mUvgJXURRlOJHHwuP6wtMy1KYoiqIoWeSt8OC6OAaSidahtkRRFEXJIm+Fx7g2UjwVU49HURRlOJG/wuP4whNvHmJLFEVRlGzyVngI+MKjXW2KoijDirwVnozHk06q8ChKvrNlyxaWLVvG7NmzOeKII7j++usBfTXCcCVvp8zBDQLq8SjKSCAQCPDjH/+YefPm0djYyLHHHsu73vWuoTZL6YL89Xh84UnGVXgUJd8ZP3488+bNA2DUqFHMmjWLbdu2AfpqhOFI3no8Esh4PPoDUkUZLL7/3Pd5bc9rPRfsAzPLZvL1BV/vdflNmzbx0ksvsXDhQkBfjTAcyVvh8Xzh0d/xKMrIoampiXPOOYfrrruO4uJiQF+NMBzJW+GRgJ3ePJXQSUIVZbDoi2eSa5LJJOeccw4f/ehHOfvss9vS9dUIw4+cjfGISEREnhORl/1XXH+7kzJhEfmjiLwpIs+KyNRctb8f/hhPOqldbYqS7xhj+MQnPsGsWbP48pe/vE+evhph+JFLjycOnGSMaRKRIPCkiDxgjFmRVeYTwF5jzKEi8mHg+8CHcmhDG+0eT3wgqlcUZRjx1FNPcccdd3DUUUdxzDHHAHD11VcD7a9GSCaT3HLLLYB9NcL555/Pd7/7Xd7znvf0WH/2qxFKS0vb2lD6x4C8FkFECoAngU8bY57NSv8nsNwY84yIBICdQKXpxoj+vhbh9h9dxYJf/ZadX3kHyz55c99PQlGUXqGvRRhaRvxrEUTEFZFVwG7goWzR8ZkIbAEwxqSAeqA8lza02RK0Ho9J6htIFUVRhhM5FR5jTNoYcwxQBSwQkSP7U4+IXCwiK0VkZXV1db9skWAUgFRKgwsURVGGEwPyA1JjTB3wKHBah6xtwCQAv6utBKjt5PibjTHzjTHzM+GLfSXj8aSTKjyKoijDiVxGtVWKSKm/HQXeBXT8Jdm9wPn+9geAf3U3vnMgOMEIAF5aQyEVRVGGE7mMahsP3C4iLlbQ7jLG/E1EvgOsNMbcC/wauENE3gT2AB/OYfv74AZCAHgag68oijKsyJnwGGNWA/vNIWGM+VbWdgw4N1dtdkcgqMKjKIoyHMnbSUKdNuHRqDZFUZThRN4KT8D/AamXTg+xJYqiDDQXXnghY8aM4cgj2wNpD9Z38Sxfvpwf/ehHA1b/cCB/hcf3eIwKj6LkPRdccAH/+Mc/htoMpZfk7SShgZCNajNpb4gtUZSRw86rrya+LrevRQjPmsm4yy/vtsySJUvYtGnTful33HEHF110EalUiltuuYUFCxbw3HPP8YUvfIFYLEY0GuXWW29lxowZ3Hbbbdx77720tLSwYcMG3v/+9/ODH/wAsO/iueaaaygtLWXOnDn7TCTakerqai655BI2b94MwHXXXccJJ5zA8uXL2bx5M2+99RabN2/mi1/8IpdeeikAV111Fbfffjtjxoxh0qRJHHvssQDccMMN3HTTTQQCAWbPns2dd97Zn0s47Mhf4QnaSUJNSj0eRRmpDMW7eL7whS/wpS99iRNPPJHNmzdz6qmnsm7dOgBee+01Hn30URobG5kxYwaf/vSnWb16NXfeeSerVq0ilUoxb968NuH53ve+x8aNGwmHw9TV1Q38BRsk8lZ4MuHUxlPhUZTBoifPZLAZinfxPPzww7z66qtt+w0NDTQ1NQHwnve8h3A4TDgcZsyYMezatYsnnniC97///RQUFABw5plnth179NFH89GPfpSzzjqLs846K0dXZejJ2zEeN+PxeNrVpigjle7exbNmzRruu+8+YrH2V6fk4l08nuexYsUKVq1axapVq9i2bRtFRUX9qv/+++/ns5/9LC+++CLHHXdc3rwbKG+FxwlaZ07HeBRl5DIU7+I55ZRT+OlPf9q2v2rVqm7LL1myhL/85S+0trbS2NjIfffdB1gB27JlC8uWLeP73/8+9fX1bZ7TwU7edrU5Af/U1ONRlLznvPPO47HHHqOmpoaqqiq+/W37HsqheBfPDTfcwGc/+1mOPvpoUqkUS5Ys4aabbuqy/Lx58/jQhz7EnDlzGDNmDMcddxwA6XSaj33sY9TX12OM4dJLL6W0tLS3l2RYMyDv48kl/X0fzwtv7KDgzJN46R1BPvLL1QNgmaIooO/jGWpG/Pt4hhPtHs/wFlZFUZSRRt52tblBFR5FUQaOq666ar/xnnPPPZdvfvObQ2TRwUPeCo/jOKQFFR5FGQSMMftFkOU73/zmN4dcZIb7UElX5G1XW8AVPAcVHkUZYCKRCLW1tQftQ/BgxRhDbW0tkUhkqE3pM3nr8biiwqMog0FVVRVbt26lv6+pV/pPJBKhqqpqqM3oM3krPI4jpB1Ao6kVZUAJBoMccsghQ22GchCRv11tjuAJiHo8iqIow4q8FR5HBM8R9XgURVGGGTkRHhGZJCKPisirIrJWRL7QSZmlIlIvIqv85Vud1ZUrXL+rTXTAU1EUZViRqzGeFPAVY8yLIjIKeEFEHjLGvNqh3BPGmPfmqM1ucZ0sj8cYGGGhnoqiKMOVnHg8xpgdxpgX/e1GYB0wMRd19xe3bYwHSCd7LK8oiqIMDjkf4xGRqcBc4NlOsheLyMsi8oCIHNFNHReLyEoRWdnfEE3XH+MRT8BT4VEURRku5FR4RKQIuAf4ojGmoUP2i8AUY8wc4KfAX7qqxxhzszFmvjFmfublS33FcYS0CGKAdKJfdSiKoii5J2fCIyJBrOj8zhjzp475xpgGY0yTv/13ICgiFblqvyMBJ+PxoF1tiqIow4hcRbUJ8GtgnTHm2i7KjPPLISIL/LZrc9F+Z9ioNr+rTYVHURRl2JCrqLYTgI8Dr4hI5nV7lwOTAYwxNwEfAD4tIimgFfiwGcDJnRwRPO1qUxRFGXbkRHiMMU8C3cYrG2NuBG7MRXu9od3jQT0eRVGUYUQez1wAngiOh0a1KYqiDCPyVnhEBM9xrPBoV5uiKMqwIW+FByDtOP4Yj3o8iqIow4W8Fh5PMh6PCo+iKMpwIa+FJ+13tZlUfKhNURRFUXzyWng8x8H1IJ1W4VEURRku5LXwpMUKT0qFR1EUZdiQ18LjOa4VnlTrUJuiKIqi+OS18KQdF8eDdErDqRVFUYYLeS88rgdJDS5QFEUZNuS58AT8MZ7YUJuiKIqi+OS18LSP8ajHoyiKMlzIa+HJeDxpT8d4FEVRhgt5LTyeE8DRcGpFUZRhRV4LT9oJ+mM86vEoiqIMF/JaeIwbwDWQ0nBqRVGUYUNeC4/n2PfcJZMa1aYoijJcyGvhMY4LQDqpHo+iKMpwISfCIyKTRORREXlVRNaKyBc6KSMicoOIvCkiq0VkXi7a7hbXejyplL4WQVEUZbgQyFE9KeArxpgXRWQU8IKIPGSMeTWrzOnAYf6yEPiFvx4wjN/Vlk5qVJuiKMpwIScejzFmhzHmRX+7EVgHTOxQ7H3Ab4xlBVAqIuNz0X6XdmU8noSO8SiKogwXcj7GIyJTgbnAsx2yJgJbsva3sr84Zeq4WERWisjK6urq/hvjBgFINx5AHYqiKEpOyanwiEgRcA/wRWNMQ3/rMcbcbIyZb4yZX1lZ2X+DMl1tDbv6X4eiKIqSU3ImPCISxIrO74wxf+qkyDZgUtZ+lZ82YEjG40m0QnPtQDalKIqi9JJcRbUJ8GtgnTHm2i6K3Qv8px/dtgioN8bsyEX7XZEZ40kjULt+IJtSFEVRekmuotpOAD4OvCIiq/y0y4HJAMaYm4C/A+8G3gRagP/KUdtdkvF4PA+oWQ+TFw10k4qiKEoP5ER4jDFPAtJDGQN8Nhft9ZY24REXat8czKYVRVGULsjrmQsyUW2p8GgVHkVRlGFCXguPEwgB4IVKbFeboiiKMuTktfBkPB4TKoY9b0E6NcQGKYqiKHktPE5mjCdYBF4S6t4eYosURVGUvBYeyXS1BQptgo7zKIqiDDn5LTxBG7TnBQpsgo7zKIqiDDn5LTz+D0g9HIiWQfVrQ2yRoiiKkufCY18EZ5JJmLYU1vwJmnYPqU2KoigjnbwWHifgezzpFCz7JqTj8O/vD7FViqIoI5u8Fh4CvseTSkHFoXDsf8HKW6FGgwwURVGGirwWHvE9HpNO24R3fh2CUfjbFyGlbyVVFEUZCkaE8KQSvsgUVcK7fwSbnoB7LgIvPYTWKYqijEzyWngyYzzxeHN74jHnwanXwLp74b4vgDFDZJ2iKMrIJFevRRiWOH5UWyLZum/G4s9A6154/AcQKYFTvgvS7eTaiqIoSo7Ia+GhzeOJ7Z+37HKI1cMzN0J4lB3/UfFRFEUZcPJaeJygnast2dHjASsyp30PEk3w2DXQtAtO/yG4eX1JFEVRhpy8fsq6fjh1KhnHGIN09GgcB868EQor4anroHEXnHsb+HO8KYqiKLknr4MLMlFtpD03GcadAAAgAElEQVRaU514PWDF513fhtN/AK/fD3+6SF+foCiKMoDkTHhE5BYR2S0ia7rIXyoi9SKyyl++lau2uyIT1eZ60JBo6L7wwk/BKVfBq3+Fey6Elj0DbZ6iKMqIJJcez23AaT2UecIYc4y/fCeHbXeKG3DxANczNCYaez7g+M/Bu74D6/4GN86H1XcNtImKoigjjpwJjzHmcWBYuQmuI6Qdp3ceT4YTvgCfehzKpsOfPgmPfEd/66MoipJDBnuMZ7GIvCwiD4jIEV0VEpGLRWSliKysrq7ud2OuCGlxcDxoiPdSeADGHQn/9QDMOx+e+DH84Tx49mbY9mK/bVEURVEsgxnV9iIwxRjTJCLvBv4CHNZZQWPMzcDNAPPnz++3u+E4QlpcXC9NY7IXXW3ZuAE443oonQxP3wBvPGDTDz/ddsdVHt5fsxRFUUY0g+bxGGMajDFN/vbfgaCIVAxkm4Hsrra+eDwZRGDJV+Hrb8OXX4P/WA6bnoSfL4L7vwrNNbk2WVEUJe8ZNI9HRMYBu4wxRkQWYEWvdiDbbPd4+jDG0xkiUDweTvwSHPMx+4PTlbfAi7+BcUfBxHlw+GlwyBJwg7k7AUVRlDwkZ8IjIn8AlgIVIrIVuBIIAhhjbgI+AHxaRFJAK/BhYwZ21D4zxhMmQH1votp6Q1ElvPdaWHAxvHQHbF8FL/0WnrvZvl574afsEh2dm/YURVHyjJwJjzHmvB7ybwRuzFV7vcF1hIQbpDCZZMuBeDydMWYmnHqV3U62woZ/WQF67Bp4+kZY8ElY/FkoHNDeREVRlIOOvJ65wHWETaPGMXlnun9jPL0lGIWZ74Hz/gCXPAWHvQue/AlcdxQ8eZ3OhKAoipJFngsPrB89iTE1CWINewen0XFHwrm3wueeh+knwcNXwi+XwvO/gj0bB8cGRVGUYUxeTxLqiLC+tAqAURt3D27jFYfBh38Hr95rxef+r9j0sulw6MlQORNKqiBUCE7QBiUEwlB+mE5SqihKXpPXwhNwHNaXTgKg4u36oTFi9pkw6wyo3QAbHoE3H4YX74CuJi0tGgcLL7ZRcqVTIFw0uPYqiqIMMHktPI4DDeFCGssLGb+lZegMEYGKQ+2y8FPgpe37fxq2Q7IF0glIJyHeCKt+b6fpecSfyq5wDIyeCqECSMVt5NzY2faHreFRUFAOxROheIIda1IURRnm5LXwuP77d/ZMGcPUtzaS9JIEnWHwOxvHtUJRPGH/vKM/CDXrYedq2LvJjgvt3WQj59wQ1K63sygYb/9jo2VQMtEKUWGlFaaiMVC1ACbMteKlKIoyxOS18ARcKzz1UyZy9Isbqdu9lcpxhwyxVb2g4jC7dEUyBs3VEG+wsyc0bIeGrf56O9Rvs78vSjRD5vdLTgDGz4Gq42zd5Yfa8aTiCfrKb0VRBpW8Fh7Hf6A2T5sKPEnD6pcODuHpiWAE/LGrHmnZA1uetcvmZ+1sC8msbsdgAZRPbxeicr9LsPxQiJQMjP2Kooxo8lp4XMcKT2zadABa17wCp5w9lCYNPgVlMON0uwB4HjTugNo3bbdd7Qbbtbd9lX0JXnYXXuGYdiEqm26776KlECm16+houx2MqtekKEqvyWvhyXg8blElO0ZD2bo3htiiYYDj2HGgkokw7Z375qXidjypZr0vTP7y+gO2a68r3FC7CLUJ0+j9t6NlUFgOBRV2RodQ4YCeqqIow5O8Fp7MGE9YithcKVRs3DrEFg1zAmGonGGXjsQaoHUPtNZB616I1e2/HfP3G3dA9Tqb1t2MEYGoFaDwKDsGFSqCUWOhyF8KK2xXYKhw33UwmrVdYMVUUZSDhrwWnkxUW8gtYEMlLHimGi8exwmHh9iyg5BIsV36OvdpOmXFp3WvHW9qqbEBES010FILzbU230vZcPKdr0Djw+1BEb0hELURe8FCf50tVgXtAhUqhFHjbEBFQYXthoyW2bXOKq4og0ZeC4/jj/GEpIgtFYJ4HomNG4nMnDnElo0g3IB9sBeU2SCG3pJotkKVbLHbyRZItECy2V9np3eR37jDrpOtfoRfkxW4zggVQbjYBlRESuwPd0OFvpgV2v198n0hzl6HitT7UpRekNfCE/CFxyHIrnFhoJX4+jdVeA4GQoW5HwMyxopZ43brdbXu8b2wPRCrt0vcX7fuhfqt7YIVb+xatNoQ2224T3dgFNywnQbJ9ZdAuD0tEPHPtcgXu1HtopfZDkZtnYGI3Xbc3F4XRRlk8lp4MsEFac/QPLYYz40RX79+iK1ShgwRG9xQWN73Y42xnlO8wY53xRt8ocreb7AClWxp98BSrZBK2PRU3M5Skb1Oxay40YdXUwUi7V2H2eNf2d2LoaJOtv0ygXC7CLrBrO1Qu1gGouq9KQNGXgtPJpzaM4aK4nHsLK8l9NoaxgyxXcpBiIj/EC+w40S5xPPauwwz3lWiCeJNdp1stUuqtb3bsK181nZmCqZEc3u3Y49eWjdkPLfM2Fkg0i5aGa8tM7ltT2mBsF9fxIpa9joY9euO+MdEbBetkrfk9aebEZ60B1csvoKVFecRWvMcpS3VVBZUDrF1iuLjOP4YUhEwNnf1GmM9q+wxsERTu8eVToKXbN/OCFyyeV+Ba9tu9csmoKV5X++t43Y6cWC2i5MldL5wBSJZXZaZ7stw52kZ8ct0T2a8uEy3Zds60t6NuY9YhvS3aQPICBEejyPKj8BbfBbOr+/m6n9fyU9O//kQW6coA4yI//ANA2WD23ZG9DJilGy13YrZ6zYvLmbT0gm7TsXbuyH3SYvZbsuMsCVaIL1337RUHNJxK6SpOJh0/88hI3hOwAqZE7SeWOY1JvukZ/ZDneR1cUwgtK/3l2krswTCMH1Z7j6TYUTOhEdEbgHeC+w2xhzZSb4A1wPvBlqAC4wxL+aq/c5ws8Z4AKbMOZFt3M22V1YQPyVO2NWwakUZEPYRvSEknWrvoky2WJHLeHHZ3ZfJFl/A4h3G4OK+V5i03ZZtXmIn+8lWfzvVRZns9GTPtoeL4bItA3+NhoBcejy3ATcCv+ki/3TgMH9ZCPzCXw8YmXDqtD9uGz7MTrw5Zlecl3a/xKLxiwayeUVRhho3AO4oG204nMh4hNkeYDphX5ni+YLVh3iTg42cCY8x5nERmdpNkfcBvzHGGGCFiJSKyHhjzI5c2dCRtuAC3+MJTZ4MoRBTatM8ve1pFR5FUYaG4eIRDhGDGS85Ecj2G7f6afshIheLyEoRWVld3c0cYT2Q+R1PyhcecV0iM2eybI2w4/GH+l2voiiK0n+GZaC+MeZmY8x8Y8z8ysr+R59lfsfjmXafdcLVVyElxVzwy01suf2XB2yroiiK0jcGU3i2Adkvkany0waM9qi2duEJH3oo0dtuYPVUoeHan5Lau3cgTVAURVE6MJjCcy/wn2JZBNQP5PgOgK87bV1tGWZWzeUv7xmNJJLsue32gTRBURRF6UDOhEdE/gA8A8wQka0i8gkRuURELvGL/B14C3gT+CXwmVy13Y1NuI60BRdkcMRhyYkfYcUMYedvbiFVXz/QpiiKoig+ORMeY8x5xpjxxpigMabKGPNrY8xNxpib/HxjjPmsMWa6MeYoY8zKXLXdHa4IabN/XOJn5nyG5EfPJNia5A9X/ydbGvMzXl5RFGW4MSyDC3KJ47CfxwPWG7r4A9dQe8wUDn34Dc76v/dy1YqrSPbmh12KoihKv8l74Qk4zn5jPBlEhGM+fRmlzfC5xgXc+fqdfP6Rz9OcbB5kKxVFUUYOeS88juwb1daRwhNPJDhhAie9mGL54uWs2LGCc+87l1+98ivW1q5l1e5VbG7YPIgWK4qi5Dd5LzyuI/v8jqcj4rqUfvCDtKxYwXuD8/j5yT+nIlrB9S9ez4f/9mE+/sDHOeMvZ3DtC9cST8cH0XJFUZT8JK9npwZwu+lqy1B6ztlU33gjdXfdzfFf/xrHTzyezQ2bWb93PZFAhIc3P8yta27lwU0PsmzSMo4ZcwxhN0xpuJQ5lXMQnT5dURSl14wA4ek8uCCbQGUlxae8i71//COjP/oRQlVVTC6ezOTiyQCcMPEETp58MrevvZ27Xr+L3677bduxi8cv5hsLvsG00mkDeh6Koij5Qt4LT3fBBdmM+epXafr34+y44gom33LLfl7MiRNP5MSJJxJLxdjUsIm0l+al3S/x81U/531/fR+TR03miIojGF84nvJIOUE3SEGggFOnnkokEBmo01MURTnoyHvhKS8Ksash1mO54IQJjPnv/2bn8uXU3X03oz/4wU7LRQIRZpbNBOCIiiM4/ZDT+euGv7K6ejWrq1fz0NsPkcp63fAdr97BtUuvbfOeFEVRRjp5LzyTygpYu613MxOUfvBcGh54gF3/812caAElZ7y3x2PKo+VceOSFbfvGGBqTjaS8FKt2r+KKp67gQ3/7EKdMPYXFExazaNwiSiOl/T4fRVGUg528F54pZQX8c81O0p5pmzS0K8RxqLr+OrZ+/lK2//d/E9/wJpWf+QwSCvW6PRGhOFQMwEmTT2JG2QyuXXktD216iD+t/xOCMKt8FnPHzOWoiqM4uuJoqkZVaYCCoigjBjHdhBoPB+bPn29Wruz/7Dp3PreZb/zpFZ742jImlRX06hiTSLBj+bep/9OfCE2bxrgrr6Rw4YJ+2wCQ8lKsrV3LM9ufYcWOFbxa+yqtqVYARodHs2D8ApZULeHYsccyoXCCCpGiKP1GRF4wxswfaju6Iu+F5+k3a/jIr57l9xct5PhDK/p0bONjj7HrqqtJbtnC6I99jDFf+TJONNpvW7JJeSnerHuT1dWrebn6ZZ7e/jQ1rTUAFIeKmVYyjapRVRw2+jDmVM7h0NJDKQ4VqyApitIjw1148r6rbXK59XLe3tPC8X08dtTSpRQuWkT1T37Cntt/Q9Ojj1J67rkUn3YqgQkTkGCQdE0NJpkkOGFCn+oOOAFmls1kZtlMPjjjg3jG47U9r7GmZg3r9qzj7Ya3WblrJX97629txxQGC4kGoqS8FAWBAsYWjmVMwRjGFoy1S6FdjyscR3GomKSXJOyGNapOUZRhRd57PGnPMPOKB7joHdP4+mkz+11P84pnqfnZz2h5/vn2xGAQknZS0fJLPkXl5z+PuG6/2+iMPbE9vFL9CpsaNrGjeQexVIyAE6Al2cKull12ad5FLN155J4gTCmewsyymcwom8GhpYdSHilndGQ0ZZEyooGoelGKkmeoxzPEuI5QNbqAzXtaDqiewkULKVy0kMSWLTSvWEG6pgavpYXAuHHE1qyl9qb/pfXllylcuJBAZSWFixf32QvqjLJIGe+c9E7eyTu7LGOMoSHRwM7mnW1i1JRoIuAEaEo08fre13ml5hX+sekf+x0bdIIUBAsoDBRSUVDB2ALrRWWWsQVjKQmXUBoupSJagSN5P8uSoigDTN4LD9iQ6s21ByY8GUKTJhGaNGmfNGMM0aOPovq662l5ZkVbevjww3GKihDHoWjpOyl5//sJlJfnxI5sRISScAkl4RJmlM3oslxDooG3699mb3wvta217I3vpS5WR0uqheZkM9Ut1azfu56ntj1FS2r/61UQKGBayTQqCyoZHRlNabiU0eHRFAQLiAailEfKGVMwhqJQESE3RMgJEXbDBJyAelWKorSR911tAP/vL69w38s7ePnKU3JkVdd48TjJrVtp/Ne/aFnxLCadxmtsJLZ2LbguwaqJhCZOxCkpwSksJHrkURSeeCLiCMnt20k3NmLiCSQcwi0qInz44bglJQNud0eaEk3sbtnN7tbd1Mfr2RPbw6b6TWys30htrJa6WB174nv2+bFsVwhihShLjDL7YTdMNBClOFRMcbjYrkPFlIRL2raLQkVEA1EigYhduxEigQgBZ0R8b1KUPqNdbcOAKWWF1LcmqW9JUlIQHNC2nHCY8PTphKdPh09+si09vmEDDfffT3zjRpLbtpPcuYt0XR31/3dPt/VJMEjRsmVEjjoSJxQiMGECBfPmgQitq1djWlsJVk0iUFEOrotbUoITDh/weRSFiigKFXU7B50xps1bakm2sCe2h90tu2lJtRBPx0mkEyTSifZtL9FpekuqhY31G2lINNCQaOj1LOBBJ2jFyLWilFky+xmxirhZ2x32Oy3jC1s0ECXoBNVbU5QckzPhEZHTgOsBF/iVMeZ7HfIvAH4IbPOTbjTG/CpX7XdH5vc7m/e0cFTB4HsPAOHp06m89NJ90owxJN56i+ann0HCIYITJuKWFCOhMCaRIF1XR9MTj9Nw/99pfPDB3jUUDBKdPZvoMXMIHXIIoSlTCE2dSmDsWMTJ7fiMiFAYLKQwWAjA1JKpOak3no7TEG+gPl5PQ6KBpmQTralWYqmYXdKx9v20TWtNte6T1tDSYPf9/Ex6X3HFJRqIti2ZbsV90gJ+WrA9LeJG2ry6oBMk5IQIukG77Xt+QXf/9KATVE9OyXtycoeLiAv8DHgXsBV4XkTuNca82qHoH40xn8tFm31hclkmpLqZo6qGRng6Q0TavaMuKHrHiYz9xjcw8TgmHif+1kZaX3oJMESPPhqnuJjkli2k6+owqRTJrVtpeeFF9v7xLkwslt0YEghAIIAEAjhFRURmzyYyexaBikrcstEERo/GLSsnOHFCTrym/hJ2w1QWVFJZUJnTej3jEU/H24SoNdVKazpL0FKxffYzYpZZWlItdjvZ2tYV2bFMLnDEsYLkBK04ZYlXZjtbtDqKV0ACBJwAQSeI67j7iFpXoge2S9QRB0FAaNt2xCHgBAhIANdx7ba/n9l2xW1rM5OmgShKV+Tqq9UC4E1jzFsAInIn8D6go/AMCZnf8hxoZNtQIY6DRKMQjVIwby4F8+bukx+ZsX9AgfE8Urt3k9i0icSmt0nt3oVJpjApu6T37iW2Zg1NjzzSSYNCYMwYnKIinEgEiUbseNQRRxCdOw8wpPfuxYvFMKkUgcpKwlOn4paWIpGIDagYht1TjjhtHslA4BmPWCpGS6qFWCpG0kuSSCdIeSkSnu1ezKRlr5PpZKf5me2O+5l1c6qZZHz/9JRJkfbSpLyUXUzP43ADgSNOmyC1iVK2WGVETPYVrGwh2+fYTtKzj3Udd5/6s+vsrL6MfY44bQKdvWSLfKa8khtyJTwTgS1Z+1uBhZ2UO0dElgBvAF8yxmzppAwicjFwMcDkyQc+q3NROEB5YYg3dzUdcF0HC+I4BMeNIzhuHIWLFnVZzovHSdfVkd6zh9SePaRrakhs2Upy2za8lha8WCumNUZq5y5qnngSPK/ntoNBAmPHWgEKBDDpNKa1FRwHp7AQp6DALv62O3q0DbqoqiJYVUWgogJcF9JpvNZWTCqFW1iIFBQMS0HL4IhDQbCAgmDvpmYaLIwx7SKWEbgssUt5KUzmz7SvPeNhsOu0lyZlUm1iljbtwpb0kvvsZwteX9LSXpqklySWju2Tn6k76SU7TU+b9KBcR1fcfYQos7iOFS8HB8exYiaIFTXHTxdnH6HL3heRfdaZvGggyrcWf2tQzm2wGczO5PuAPxhj4iLyKeB24KTOChpjbgZuBhvVlovGT5o5hnte3Mo5x1ZxQh+nzslnnHAYZ+xYgmPH9lg23dREbM1aJBTCHV1qpw9yHFK7dpN4+228xga81hjpPbUkd+7Ca2nBpJKIG0AiYTDgNTfjtbSQ3LkTr6UZr7mFdF0dpHoRHRcMEpwwgeCkSQSrJlqbxQEMGPuwJBOlabDbxgDteSaewMRjeDHbdSnRCO6oYtziUTijipFgEATbNSkCIiBWMAPlZUg0asfKHMeWyazDYdxRo6zY5vhHxAeKSHtUYT6SEcauBDBpkvt5gBnB8jyv3UM0qTZBzniiGU9zv31/O+El8DyPtEljMKS9NB6etcmkMcbYdoxNS3iJtu3O8rPzBsozHw7kJJxaRBYDy40xp/r7lwEYY67porwL7DHG9DjgkotwaoDmeIqzfvYUNU1x7vv8iVSNHl7fSkcyJpUitWuX72ltJbVnD3gGHMEpKEBcF6+5mdSePTYicMsWklu3kq7v3esuAF9ArEA44TASiSDhEKY1ZkPYW3MzPgNYT6642ApR8SjcolFINOKLq+CWluIUFmISCUwqhRONIqGQ9TBbW5FQECcStV2ckShONGK7MKNRu45EcSLhtvE6HAcJBKzgOS4SCiLBIBIKIUFfbFJJCARxCqI5DzJRhh8jJZz6eeAwETkEG7X2YeAj2QVEZLwxZoe/eyawLkdt94rCcID//fixvO/Gp/ifv73K/3582H4mIw4JBAhOnEhw4kQ676HtHC+RsMdDm7C0LX5ab7vmTDJpBSiZIuNBZRbjGbzmJlI1NTZgwxiM51lxNB7G8zCxOF5TI+nGJrzGBtINjaQbG/AaGknu2oVpbUWCQYzxSNfX4zU144RCEAxiWlvxEgncggIkGsUkEnb8rLW13YPLIVJQgFNYgBOOWIEKBKyn5ziYdBpSSUzKdl9JOIyEQzihdrF2QuH29HAYCYWRSLh928+TQNB6tS0tSCCIE/HzQmEk4FrBzIil69i1I+C6VhzdgE3P3g+49phA0G4HAuAGcEJBCGro+8FCToTHGJMSkc8B/8SGU99ijFkrIt8BVhpj7gUuFZEzgRSwB7ggF233hWmVRZxxzATuW7WdVNoj4Oo3v4MZpw/vSeoJCQYJlJV1X6iTII6BxBhjvaJYrE2IvFjMjnv5gR0mnYZ0un2dStv0RKJtsRGNLiaZauvq9Jqb8eIxSKUwyaQNPPHSSCCIuC4SDPjtJ21EZSxGur6+LbrSS8Rtt2UsZr8A+HMWDimO43uEEb/LtBMRErFi2+YRZrb9dTDUvh3wRTkQQIKZiNBMmi+YAdcKoy+KdrtDWseghI52dTTTzxc3wKiTluXu+gwjcjbGY4z5O/D3Dmnfytq+DLgsV+31l0XTyvn9s5tZu72BOZP0TaDK8EX8rkHC4SGZvaIvmHTaCl08jhdPYBJxTDLZFkhiUimbF4tZ8UqnbaBKOm29x3Qa4xnw0pi0568zourvp9L+OuULbNIKZyqNSfpeYixuA2K6EkLPtAtzMtm+jifwGpt8EU62dYOaVAqSybZtk0pBenCCGZzCQma8cODDDMOREfdLtUXT7LfaFW/VMmdSKQ2xJOm0YXRhfg68KspgIK7bFvI/vEIrco8xZl8vM51uEyTbVZmy3a+plN3O7i7dr+e0Q0J22TwO3x5xwjNmVITplYWseKuWi5dM4+O/fo4dda08+KUllBao+CiK0j0i0h7YofSL/JXUblg0rZznN+3lX6/t5uUtdexujHPFX9cOtVmKoigjghEpPIunl9MUT3H5n19hQkmES08+jPte3s4dK96mvnUYDJIqiqLkMSNSeBYeYt+Js6shzsVLpnHpSYcyb3IpV/xlDXO+/SAX3b6SXPy+SVEURdmfEdlJWTkqzGFjitjbkuDDCyYTcB1+d9EiVrxVy4Ov7uIPz23mmbdqOX565zMcxJJpIsF8H0JVFEUZGEakxwPww3PncPN/zm8TkGjIZdnMMVx5xmzKCkPc8uTGTo/7+WNvcvTyB7nhkfUkUl3PW7atrpUf/vM13tjVOCD2K4qiHKyMSI8H4JgufsMTCbp8bNEUfvqv9bxV3cS0yqK2vM21LVz/8HpGFwa59qE3uO/l7XzllMM5ZfY43tjdyEub66goClPTFOfq+9fRGE/xi8c2cOacCdQ2J1i3o4GzjpnIl951OIXhEXvpFUUZ4YyIV1/3lerGOCd871+ceuQ4Ljh+CmOLI0wsjfLJ36zk6Q21/OsrS1m7vZ7v3r+OjTXNjIoEaIztO8nl/CmjueK9s/nzS9v4/bObmVJewJTyAh5et5uJpVG+eurhnHH0BJ09QVGUnDPc52pT4emCb9yzmjufb39rQ3lhiNrmBJe/eyYXL7EvbkulPe5bvZ3HXq9mwSFlnDC9gvrWJE3xFIumleM6duoLzzM4/vZzG/fwrb+u4bWdjUwuK+DUI8ZydFUpjbEU63c3srshTl1rgtOOHM/HFk7WuacURekzKjwHyFAJTzyV5rUdjextSbBlTwsvba4jbQw/OncOwQP0UjzP8PC6Xdzy1EZe3FzXNlZUEHIZVxLBEeHN3U2875gJLD/jiE5nVXjh7b18+761bKxuZmpFIYf4y6Jp5SyeXt4rOxpjSf79RjWFoQDlRSHKi8KUFYSIBJ19BM8YQ0NriqJIANcRmuMp3tjVyJTyQsp0xgdFGXao8BwgQyU8g0U8lWb9riZKokEmlkZxHMHzDL/49wZ+9ODrGANjRoU5fno5HzxuEomUx90rt3L/KzsYVxzh5Flj2LynhY01zWyra8UYOHveRK587xGUFAS7bHdDdRMX/2YlG6qb98tzBApCAaIhl5DrUN0UJ5HyCLpCZVGYnQ0xPGPnMjxyQgknHlbBOw6t4NAxRZQVhmiOp9lW10pJQZAJJRH12hRlkFHhOUDyXXi6Y/XWOp7eUMtrOxp45LXdbeNIJdEgH1k4mc8tO3SfIIXWRJqfP/YmP39sA47AIRWFzBpfzHFTyygtCPLQq7tYu72BwpDLW9XNBAMOPzjnaMqKQtQ2JdjTHGdPc5KWRIqWRJqWRIp4yqOyKEzlqDA1TQl21rcyubyQ2eNH8cauJp5YX81Lm+tIeZ3fR6PCASaOjlJeFGLS6AJmTyhmemURE0ujFIRcGuMpgo7D+NLIAXuSiqJYVHgOkJEsPNm0JtI8vG4XQddh2cxKwoGuf0e0dns99728g/W7Glm9rZ7qxjgAowuCzJ9aRjzlURhy+eZ7ZuXkhXhN8RTPb9zD1r0t1DQlKAoHmFAaZW9Lgjd2NbKjPkZNU5yNNc3UtXQ+M4QjMK44QtXoAqpGR6kaHWXi6ChVowuYVlnI+JLO38aY9gzxVJqCkEYJKkoGFZ4DRIXnwDDGsMQNbcYAAAqCSURBVKm2hT3NceZUlQ5pFJ0xhp0NMTbVtLBlbwvxlEdxJEA86bG1rpVte1vZureFrXtb2VHfSrYTNaksylETSwg4Dsm0x86GGLvqY+xqjJP2DDPGjmLu5FIiQZdk2mN3Y5z6liRzp5Ry8syxzJ5QTFEvQthjyTRrt9eTTBuKI0EmlUUZFem6y1JRhiMqPAeICs/IJJn22FkfY+veVl7b2cCKt2pZv6sJzxgCrsO44ghjiyOMKwkTcl1e2LyXNdvqSXsG1xHGjAoTDbm8srW+rRuwoijMIRUFTCkvpLwwREEowPa6VjZUN9GcSJNMe2yqad6v23BKeQGTywqoLArb4IpEioJQgEMqCgkHHHbWx9jbkiSWTOMZQzTkUhByKQgFiARdwgGHoCuEXAfHEZriKZIpQ1EkQHEkQHE0SEk0SOWoMBVFYYKu4EhmAdfp/ZtUM7QkUtQ2JahpiuMZQyToEg26RENuW7RlTyRSHnUtSZrjKdKeIW0Mac9ggIAjuI4QdB27dvy1K0SCLhNKo71uR8k9KjwHiAqPciA0xJKs2FDLhupmNtU0s7G2mc21LextSRBPeZQXhpg+pojiSBDXsW+pnTuplKJwgLrWJBtrmlm7vZ5te1upaUrgGUNhOEBTLMXOhhgAkaBDeaEVOgFak+m2MbJYsuvZLfpKtgi5vig5jhUo9/+3d3ahcl1VHP/958zHvcnNd0IMtdRGA1JBahpqhNIHpWmalygoDQgNWiioBX3wIVIo1ScrKCgWS9VAU8TWT8xDpVYt+NSkqSZp0pLmpkbakDZp0nzc5M6dr+XD3vdm7mXm9t6bMzNnJusHh9mz9jmz1zprz1mz99lzVi68l8RYucZ4tTvJytoxXEjYsHaEYpKjYTY1eh0uJIwM5VlSyjMylGeklGdxKc/iYjI1Wr1SqZNITQE81C0qhqyoVyt1jOnBdDiWh2J5rvcLzYxKvUGlFra6hZHupC5j5RpjE+GeZ05QSHIU8jkKOV3LHNoi3Y5Z6HvvX57gUrnGRK3OeKVOOfqlVEgYKuQYyidIoc+Uqw3GK3VqjQZJLsdQIcdXP3vLgs5/1gOPT4w7A83SoQJbPvWRlnWVWoNifuFTj1cmatTqxtLhfNsRiZlRrV+7uDXMWFzMU0jElYk6l8pVLo5XuXC1ytmxMufGKlOjC7NwD6thRqMRLt4Na18X5MZIKc+qkRKrFhdZHUdp4cIWAmK9zUKQmRQSsXxRkZFSWEafxCAnhb8EVOthBFRtNKjXjVqjQbVuXK3UOPbuGMfPXKZhRq7p3JSrdd4+f5WxiXBBHyvX2i5MuR6SnEIgKiQMF3MUcrkpH1QnA0096Nvu+Lmep06xpJRfcODJOqkFHklbgZ8CCfArM/vhjPoSsAe4AzgH3G9mJ9Nq33Hmy/UEHWBOjz2SRDGv0FZpet2yRTmWLSpw83Vp0d+YGRO18Et/vFqnkORYVExomDFeCYFycgQ5XqkjMTWyLFcblKuhfvL48rRyY0pWqTcoJTkKSY5i/tpWSHKU8jmKUZ4TXI4BcXJ0FkZkeRoWg2st/JBopvl3h+JQaMlQntUjJZYO56eC4FAh6l6rT+lvxrRRW5KEoNfoceDrJKkEHkkJ8ARwD/AO8IqkvWb2etNuDwIfmNknJO0AHgfuT6N9x3H6E0lTF+QVM+p8UcfgktYSpzuBUTN7y8wqwLPA9hn7bAeejuU/AF+Q/7PQcRznhiOtwHMT8HbT+3eirOU+ZlYDLgItn+0i6SFJByQdOHv2bEoqOo7jOFkgk38VN7OnzGyTmW1as2ZNr9VxHMdxUiStwHMKpt0j/WiUtdxHUh5YRlhk4DiO49xApBV4XgE2SLpVUhHYAeydsc9eYGcsfxn4p2X9T0SO4zhO6qSyqs3MapIeBl4gLKfebWZHJf0AOGBme4FfA89IGgXOE4KT4ziOc4OR2v94zOx54PkZskebymXgK2m15ziO4/QnmVxc4DiO4wwumX9Wm6SzwP8WePhq4P0U1eklbks2cVuyyY1uyy1mltklwZkPPNeDpANZflDefHBbsonbkk3clmzjU22O4zhOV/HA4ziO43SVQQ88T/VagRRxW7KJ25JN3JYMM9D3eBzHcZzsMegjHsdxHCdjeOBxHMdxuspABh5JWyUdkzQqaVev9WmHpJOSXpN0UNKBKFsp6UVJx+PriiiXpJ9Fmw5L2tj0OTvj/scl7WzXXsq675Z0RtKRJllquku6I56b0Xhsx3I3tbHlMUmnom8OStrWVPe9qNcxSfc2yVv2u/gMw31R/lx8nmGnbLlZ0kuSXpd0VNK3o7zvfDOLLX3nG0lDkvZLOhRt+f5s7Usqxfejsf5jC7Uxk1jM0z4oG+FZcSeA9UAROATc1mu92uh6Elg9Q/YjYFcs7wIej+VtwF8BAZuBfVG+Engrvq6I5RVd0P1uYCNwpBO6A/vjvorH3tdlWx4Dvtti39tinyoBt8a+lszW74DfATti+UngGx20ZR2wMZaXAG9GnfvON7PY0ne+iedqJJYLwL54Dlu2D3wTeDKWdwDPLdTGLG6DOOKZSzbULNOcqfVp4ItN8j0WeBlYLmkdcC/wopmdN7MPgBeBrZ1W0sz+RXjYa+q6x7qlZvayhW/bnqbP6pYt7dgOPGtmE2b2X2CU0Oda9rs4Gvg8IesuTD8vqWNmp83s37F8GXiDkISx73wziy3tyKxv4vkdi28LcbNZ2m+XsXleNnbCljQYxMAzl2yoWcGAv0l6VdJDUbbWzE7H8rvA2lhuZ1eW7E1L95tieaa82zwcp592T05NMX9bVgEXLGTdbZZ3nDg98xnCr+u+9s0MW6APfSMpkXQQOEMI5Cdmab9dxuZ+uA58KIMYePqJu8xsI3Af8C1JdzdXxl+UfbnevZ91j/wC+DhwO3Aa+HFv1ZkfkkaAPwLfMbNLzXX95psWtvSlb8ysbma3ExJl3gl8sscq9YxBDDxzyYaaCczsVHw9A/yZ0Bnfi9MZxNczcfd2dmXJ3rR0PxXLM+Vdw8zeixeKBvBLgm9g/racI0xf5WfIO4akAuFC/Rsz+1MU96VvWtnSz74BMLMLwEvA52Zpv13G5n64Dnwogxh45pINtedIWixpyWQZ2AIcYXqm1p3AX2J5L/BAXIW0GbgYp05eALZIWhGnHLZEWS9IRfdYd0nS5jiv/UDTZ3WFyYt05EsE30CwZUdcdXQrsIFws71lv4uji5cIWXdh+nnphN4iJF18w8x+0lTVd75pZ0s/+kbSGknLY3kYuIdwz6pd++0yNs/Lxk7Ykgq9Xt3QiY2wUudNwhzqI73Wp42O6wkrTw4BRyf1JMzj/gM4DvwdWBnlAp6INr0GbGr6rK8TbjKOAl/rkv6/JUxzVAnzyQ+mqTuwiXBBOQH8nPiUjS7a8kzU9TDhC7yuaf9Hol7HaFrR1a7fRV/vjzb+Hih10Ja7CNNoh4GDcdvWj76ZxZa+8w3waeA/UecjwKOztQ8MxfejsX79Qm3M4uaPzHEcx3G6yiBOtTmO4zgZxgOP4ziO01U88DiO4zhdxQOP4ziO01U88DiO4zhdxQOP4ziO01U88DiO4zhd5f83UbUiv5/qRwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"plt.figure()\n",
"for label, loss_plot in [(\"all\", losses), (\"1band\", losses_band), (\"2band\", losses_band2), (\"1band_ends\", losses_band1_ends)]:\n",
" xs, ys = zip(*loss_plot)\n",
" plt.plot(xs, ys, label=label)\n",
"plt.legend()\n",
"plt.title(\"l2 error between exact probabilities and empirical TS probabilities\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"exact_win_probs"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.6.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment