Repository: OpenDebates/openskill.py

Issue:
predict_win and predict_rank do not work on 2x2 and more games
**Describe the bug**
`predict_win` and `predict_rank` do not work properly on 3x3x3 games 

**To Reproduce**
Step 1:
```python
from openskill.models import PlackettLuce

model = PlackettLuce()

p1 = model.rating(mu=34, sigma=0.25)
p2 = model.rating(mu=34, sigma=0.25)
p3 = model.rating(mu=34, sigma=0.25)

p4 = model.rating(mu=32, sigma=0.5)
p5 = model.rating(mu=32, sigma=0.5)
p6 = model.rating(mu=32, sigma=0.5)

p7 = model.rating(mu=30, sigma=1)
p8 = model.rating(mu=30, sigma=1)
p9 = model.rating(mu=30, sigma=1)

team1, team2, team3 = [p1, p2, p3], [p4, p5, p6], [p7, p8, p9]

r = model.predict_win([team1, team2, team3])
print(r)
```

Results in:
`[0.439077174955099, 0.3330210112526078, 0.2279018137922932]`

Step 2, change `p9` mu to `40`:
```python
from openskill.models import PlackettLuce

model = PlackettLuce()

p1 = model.rating(mu=34, sigma=0.25)
p2 = model.rating(mu=34, sigma=0.25)
p3 = model.rating(mu=34, sigma=0.25)

p4 = model.rating(mu=32, sigma=0.5)
p5 = model.rating(mu=32, sigma=0.5)
p6 = model.rating(mu=32, sigma=0.5)

p7 = model.rating(mu=30, sigma=1)
p8 = model.rating(mu=30, sigma=1)
p9 = model.rating(mu=40, sigma=1)

team1, team2, team3 = [p1, p2, p3], [p4, p5, p6], [p7, p8, p9]

print([team1, team2, team3])
r = model.predict_win([team1, team2, team3])
print(r)
``` 

Results are the same:
`[0.439077174955099, 0.3330210112526078, 0.2279018137922932]`

**Expected behavior**
After `p9` mu increase team3 are expected to have a bigger chance of victory

**Platform Information**
 - openskill.py Version: 5.1.0

**Additional context**
https://github.com/OpenDebates/openskill.py/blob/f76df19c3e388f31050c988a0059367bd1dadc76/openskill/models/weng_lin/bradley_terry_full.py#L765

I have no idea what is going on here, and why it selects rating only of the first player, but it just does not work as intended

Discussion:
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/OpenDebates/openskill.py/pull/125?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=OpenDebates) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Comparison is base [(`f76df19`)](https://app.codecov.io/gh/OpenDebates/openskill.py/commit/f76df19c3e388f31050c988a0059367bd1dadc76?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=OpenDebates) 100.00% compared to head [(`061f71f`)](https://app.codecov.io/gh/OpenDebates/openskill.py/pull/125?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=OpenDebates) 100.00%.


<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff            @@
##              main      #125   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           10        10           
  Lines         1774      1774           
  Branches       450       450           
=========================================
  Hits          1774      1774           
```



</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/OpenDebates/openskill.py/pull/125?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=OpenDebates).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=OpenDebates).


Patch:
diff --git a/benchmark/draw.ipynb b/benchmark/draw.ipynb
index 5bf7356..6dc43d3 100644
--- a/benchmark/draw.ipynb
+++ b/benchmark/draw.ipynb
@@ -341,9 +341,9 @@
     "data_directory = Path(working_directory / Path(\"data\"))\n",
     "data_directory.mkdir(exist_ok=True)\n",
     "downloader(\n",
-    "    url=\"doi:10.5281/zenodo.10344773/chess.csv\", \n",
+    "    url=\"doi:10.5281/zenodo.10344773/chess.csv\",\n",
     "    output_file=data_directory / \"chess.csv\",\n",
-    "    pooch=None\n",
+    "    pooch=None,\n",
     ")"
    ]
   },
@@ -374,6 +374,7 @@
     "    BLACK_WINS = 2\n",
     "    STALEMATE = 3\n",
     "\n",
+    "\n",
     "@dataclass(slots=True)\n",
     "class Player:\n",
     "    name: str\n",
@@ -452,8 +453,8 @@
     "    options=[m.__name__ for m in models],\n",
     "    value=PlackettLuce.__name__,\n",
     "    # rows=10,\n",
-    "    description='Model:',\n",
-    "    disabled=False\n",
+    "    description=\"Model:\",\n",
+    "    disabled=False,\n",
     ")\n",
     "display(widget)"
    ]
@@ -693,31 +694,19 @@
     "\n",
     "for match_index, row in train.iterrows():\n",
     "    white_player = Player(name=row[\"white_username\"])\n",
-    "    black_player = Player(name=row[\"black_username\"]) \n",
-    "    players = {\n",
-    "        row[\"white_username\"]: white_player,\n",
-    "        row[\"black_username\"]: black_player\n",
-    "    }\n",
-    "    \n",
+    "    black_player = Player(name=row[\"black_username\"])\n",
+    "    players = {row[\"white_username\"]: white_player, row[\"black_username\"]: black_player}\n",
+    "\n",
     "    white_result = row[\"white_result\"]\n",
     "    black_result = row[\"black_result\"]\n",
-    "    \n",
+    "\n",
     "    if white_result == \"win\":\n",
-    "        match = Match(\n",
-    "            result=Result.WHITE_WINS,\n",
-    "            players=players\n",
-    "        )\n",
+    "        match = Match(result=Result.WHITE_WINS, players=players)\n",
     "    elif black_result == \"win\":\n",
-    "        match = Match(\n",
-    "            result=Result.BLACK_WINS,\n",
-    "            players=players\n",
-    "        )\n",
+    "        match = Match(result=Result.BLACK_WINS, players=players)\n",
     "    else:\n",
-    "        match = Match(\n",
-    "            result=Result.STALEMATE,\n",
-    "            players=players\n",
-    "        )\n",
-    "        \n",
+    "        match = Match(result=Result.STALEMATE, players=players)\n",
+    "\n",
     "    train_matches.append(match)\n",
     "    t.update(1)\n",
     "\n",
@@ -830,20 +819,20 @@
     "    player_2_rating = openskill_players[player_2]\n",
     "    team_1 = [player_1_rating]\n",
     "    team_2 = [player_2_rating]\n",
-    "    \n",
+    "\n",
     "    if match.result == Result.WHITE_WINS:\n",
     "        ranks = [1, 2]\n",
     "    elif match.result == Result.BLACK_WINS:\n",
     "        ranks = [2, 1]\n",
     "    else:\n",
     "        ranks = [1, 1]\n",
-    "    \n",
+    "\n",
     "    rated_teams = model.rate(teams=[team_1, team_2], ranks=ranks)\n",
     "\n",
     "    for team in rated_teams:\n",
     "        for player in team:\n",
     "            openskill_players[player.name] = player\n",
-    "            \n",
+    "\n",
     "    t.update(1)\n",
     "\n",
     "_ = gc.collect()"
@@ -970,32 +959,20 @@
     "# Test Data\n",
     "test_matches: List[Match] = []\n",
     "\n",
-    "for match_index,  row in test.iterrows():\n",
+    "for match_index, row in test.iterrows():\n",
     "    white_player = Player(name=row[\"white_username\"])\n",
-    "    black_player = Player(name=row[\"black_username\"]) \n",
-    "    players = {\n",
-    "        row[\"white_username\"]: white_player,\n",
-    "        row[\"black_username\"]: black_player\n",
-    "    }\n",
-    "    \n",
+    "    black_player = Player(name=row[\"black_username\"])\n",
+    "    players = {row[\"white_username\"]: white_player, row[\"black_username\"]: black_player}\n",
+    "\n",
     "    white_result = row[\"white_result\"]\n",
     "    black_result = row[\"black_result\"]\n",
-    "    \n",
+    "\n",
     "    if white_result == \"win\":\n",
-    "        match = Match(\n",
-    "            result=Result.WHITE_WINS,\n",
-    "            players=players\n",
-    "        )\n",
+    "        match = Match(result=Result.WHITE_WINS, players=players)\n",
     "    elif black_result == \"win\":\n",
-    "        match = Match(\n",
-    "            result=Result.BLACK_WINS,\n",
-    "            players=players\n",
-    "        )\n",
+    "        match = Match(result=Result.BLACK_WINS, players=players)\n",
     "    else:\n",
-    "        match = Match(\n",
-    "            result=Result.STALEMATE,\n",
-    "            players=players\n",
-    "        )\n",
+    "        match = Match(result=Result.STALEMATE, players=players)\n",
     "\n",
     "    test_matches.append(match)\n",
     "    t.update(1)"
@@ -1063,7 +1040,6 @@
     }
    ],
    "source": [
-    "\n",
     "# Predict OpenSkill Matches\n",
     "print(\"Predict Matches in Test Set using OpenSkill:\")\n",
     "t = tqdm(total=len(test_matches))\n",
@@ -1078,24 +1054,24 @@
     "        draw = True\n",
     "    else:\n",
     "        draw = False\n",
-    "    \n",
+    "\n",
     "    player_1, player_2 = match.players.keys()\n",
-    "    \n",
+    "\n",
     "    if player_1 in openskill_players:\n",
     "        player_1_rating = openskill_players[player_1]\n",
     "    else:\n",
     "        player_1_rating = model.rating(name=player_1)\n",
-    "        \n",
+    "\n",
     "    if player_2 in openskill_players:\n",
     "        player_2_rating = openskill_players[player_2]\n",
     "    else:\n",
     "        player_2_rating = model.rating(name=player_2)\n",
-    "    \n",
+    "\n",
     "    teams = [[player_1_rating], [player_2_rating]]\n",
-    "    \n",
+    "\n",
     "    white_win_probability, black_win_probability = model.predict_win(teams)\n",
     "    draw_probability = model.predict_draw(teams)\n",
-    "    \n",
+    "\n",
     "    if draw_probability > (white_win_probability + black_win_probability):\n",
     "        if draw:\n",
     "            openskill_correct_predictions += 1\n",
@@ -1106,7 +1082,7 @@
     "            openskill_correct_predictions += 1\n",
     "        else:\n",
     "            openskill_incorrect_predictions += 1\n",
-    "    \n",
+    "\n",
     "    t.update(1)"
    ]
   },
@@ -1184,11 +1160,8 @@
     "\n",
     "openskill_accuracy = round(\n",
     "    (\n",
-    "            openskill_correct_predictions\n",
-    "            / (\n",
-    "                    openskill_incorrect_predictions\n",
-    "                    + openskill_correct_predictions\n",
-    "            )\n",
+    "        openskill_correct_predictions\n",
+    "        / (openskill_incorrect_predictions + openskill_correct_predictions)\n",
     "    )\n",
     "    * 100,\n",
     "    2,\n",
diff --git a/benchmark/rank.ipynb b/benchmark/rank.ipynb
index cae9baa..65c04ff 100644
--- a/benchmark/rank.ipynb
+++ b/benchmark/rank.ipynb
@@ -334,14 +334,14 @@
     "data_directory = Path(working_directory / Path(\"data\"))\n",
     "data_directory.mkdir(exist_ok=True)\n",
     "downloader(\n",
-    "    url=\"doi:10.5281/zenodo.10342317/train.parquet\", \n",
+    "    url=\"doi:10.5281/zenodo.10342317/train.parquet\",\n",
     "    output_file=data_directory / \"train.parquet\",\n",
-    "    pooch=None\n",
+    "    pooch=None,\n",
     ")\n",
     "downloader(\n",
-    "    url=\"doi:10.5281/zenodo.10342317/test.parquet\", \n",
-    "    output_file=data_directory / \"test.parquet\", \n",
-    "    pooch=None\n",
+    "    url=\"doi:10.5281/zenodo.10342317/test.parquet\",\n",
+    "    output_file=data_directory / \"test.parquet\",\n",
+    "    pooch=None,\n",
     ")"
    ]
   },
@@ -473,8 +473,8 @@
     "    options=[m.__name__ for m in models],\n",
     "    value=PlackettLuce.__name__,\n",
     "    # rows=10,\n",
-    "    description='Model:',\n",
-    "    disabled=False\n",
+    "    description=\"Model:\",\n",
+    "    disabled=False,\n",
     ")\n",
     "display(widget)"
    ]
@@ -634,14 +634,14 @@
    ],
    "source": [
     "def reduce_memory_usage_pl(df, name):\n",
-    "    \"\"\" \n",
+    "    \"\"\"\n",
     "    Reduce memory usage by polars dataframe {df} with name {name} by changing its data types.\n",
-    "    Original pandas version of this function: \n",
+    "    Original pandas version of this function:\n",
     "    https://www.kaggle.com/code/arjanso/reducing-dataframe-memory-size-by-65\n",
     "    \"\"\"\n",
     "    print(f\"Memory usage of dataframe {name} is {round(df.estimated_size('mb'), 2)} MB\")\n",
-    "    Numeric_Int_types = [pl.Int8,pl.Int16,pl.Int32,pl.Int64]\n",
-    "    Numeric_Float_types = [pl.Float32,pl.Float64]    \n",
+    "    Numeric_Int_types = [pl.Int8, pl.Int16, pl.Int32, pl.Int64]\n",
+    "    Numeric_Float_types = [pl.Float32, pl.Float64]\n",
     "    for col in df.columns:\n",
     "        col_type = df[col].dtype\n",
     "        c_min = df[col].min()\n",
@@ -664,7 +664,9 @@
     "            df = df.with_columns(df[col].cast(pl.Categorical))\n",
     "        else:\n",
     "            pass\n",
-    "    print(f\"Memory usage of dataframe {name} became {round(df.estimated_size('mb'), 2)} MB\")\n",
+    "    print(\n",
+    "        f\"Memory usage of dataframe {name} became {round(df.estimated_size('mb'), 2)} MB\"\n",
+    "    )\n",
     "    return df\n",
     "\n",
     "\n",
@@ -814,23 +816,20 @@
     "    player = Player(\n",
     "        name=raw_player[\"player_name\"],\n",
     "        kill_ratio=raw_player[\"kill_ratio\"],\n",
-    "        assist_ratio=raw_player[\"assist_ratio\"]\n",
+    "        assist_ratio=raw_player[\"assist_ratio\"],\n",
     "    )\n",
     "\n",
-    "    match_id = raw_player['match_id']\n",
-    "    team_id = raw_player['team_id']\n",
+    "    match_id = raw_player[\"match_id\"]\n",
+    "    team_id = raw_player[\"team_id\"]\n",
     "    if match_id not in train_matches:\n",
     "        team = Team(\n",
     "            id=raw_player[\"team_id\"],\n",
     "            match_id=raw_player[\"match_id\"],\n",
     "            rank=raw_player[\"team_placement\"],\n",
-    "            players={player.name: player}\n",
+    "            players={player.name: player},\n",
     "        )\n",
     "\n",
-    "        match = Match(\n",
-    "            id=raw_player[\"match_id\"],\n",
-    "            teams={team.id: team}\n",
-    "        )\n",
+    "        match = Match(id=raw_player[\"match_id\"], teams={team.id: team})\n",
     "    else:\n",
     "        if team_id not in train_matches[match_id].teams:\n",
     "            match = train_matches[match_id]\n",
@@ -838,7 +837,7 @@
     "                id=raw_player[\"team_id\"],\n",
     "                match_id=raw_player[\"match_id\"],\n",
     "                rank=raw_player[\"team_placement\"],\n",
-    "                players={player.name: player}\n",
+    "                players={player.name: player},\n",
     "            )\n",
     "            match.teams[team_id] = team\n",
     "        else:\n",
@@ -1131,23 +1130,20 @@
     "    player = Player(\n",
     "        name=raw_player[\"player_name\"],\n",
     "        kill_ratio=raw_player[\"kill_ratio\"],\n",
-    "        assist_ratio=raw_player[\"assist_ratio\"]\n",
+    "        assist_ratio=raw_player[\"assist_ratio\"],\n",
     "    )\n",
     "\n",
-    "    match_id = raw_player['match_id']\n",
-    "    team_id = raw_player['team_id']\n",
+    "    match_id = raw_player[\"match_id\"]\n",
+    "    team_id = raw_player[\"team_id\"]\n",
     "    if match_id not in test_matches:\n",
     "        team = Team(\n",
     "            id=raw_player[\"team_id\"],\n",
     "            match_id=raw_player[\"match_id\"],\n",
     "            rank=raw_player[\"team_placement\"],\n",
-    "            players={player.name: player}\n",
+    "            players={player.name: player},\n",
     "        )\n",
     "\n",
-    "        match = Match(\n",
-    "            id=raw_player[\"match_id\"],\n",
-    "            teams={team.id: team}\n",
-    "        )\n",
+    "        match = Match(id=raw_player[\"match_id\"], teams={team.id: team})\n",
     "    else:\n",
     "        if team_id not in test_matches[match_id].teams:\n",
     "            match = test_matches[match_id]\n",
@@ -1155,7 +1151,7 @@
     "                id=raw_player[\"team_id\"],\n",
     "                match_id=raw_player[\"match_id\"],\n",
     "                rank=raw_player[\"team_placement\"],\n",
-    "                players={player.name: player}\n",
+    "                players={player.name: player},\n",
     "            )\n",
     "            match.teams[team_id] = team\n",
     "        else:\n",
@@ -1228,7 +1224,6 @@
     }
    ],
    "source": [
-    "\n",
     "# Predict OpenSkill Matches\n",
     "print(\"Predict Matches in Test Set using OpenSkill:\")\n",
     "t = tqdm(total=len(test_matches))\n",
@@ -1358,11 +1353,8 @@
     "\n",
     "openskill_accuracy = round(\n",
     "    (\n",
-    "            openskill_correct_predictions\n",
-    "            / (\n",
-    "                    openskill_incorrect_predictions\n",
-    "                    + openskill_correct_predictions\n",
-    "            )\n",
+    "        openskill_correct_predictions\n",
+    "        / (openskill_incorrect_predictions + openskill_correct_predictions)\n",
     "    )\n",
     "    * 100,\n",
     "    2,\n",
diff --git a/benchmark/win.ipynb b/benchmark/win.ipynb
index bca69bd..f65054a 100644
--- a/benchmark/win.ipynb
+++ b/benchmark/win.ipynb
@@ -345,9 +345,9 @@
     "data_directory = Path(working_directory / Path(\"data\"))\n",
     "data_directory.mkdir(exist_ok=True)\n",
     "downloader(\n",
-    "    url=\"doi:10.5281/zenodo.10359600/overwatch.jsonl\", \n",
+    "    url=\"doi:10.5281/zenodo.10359600/overwatch.jsonl\",\n",
     "    output_file=data_directory / \"overwatch.jsonl\",\n",
-    "    pooch=None\n",
+    "    pooch=None,\n",
     ")"
    ]
   },
@@ -418,8 +418,8 @@
     "    options=[m.__name__ for m in models],\n",
     "    value=PlackettLuce.__name__,\n",
     "    # rows=10,\n",
-    "    description='Model:',\n",
-    "    disabled=False\n",
+    "    description=\"Model:\",\n",
+    "    disabled=False,\n",
     ")\n",
     "display(widget)"
    ]
@@ -724,7 +724,7 @@
     "\n",
     "    if len(blue_team) < 1 and len(red_team) < 1:\n",
     "        continue\n",
-    "        \n",
+    "\n",
     "    for player in blue_team:\n",
     "        match_count[player] = match_count.get(player, 0) + 1\n",
     "\n",
@@ -756,12 +756,12 @@
     "    for player in red_team:\n",
     "        if match_count[player] < MINIMUM_MATCHES:\n",
     "            invalid = True\n",
-    "    \n",
+    "\n",
     "    if invalid:\n",
     "        continue\n",
-    "            \n",
+    "\n",
     "    available_matches += 1\n",
-    "    \n",
+    "\n",
     "    verified_matches.append(match)\n",
     "\n",
     "print(f\"Parsed {len(verified_matches)} Training Matches\")\n",
@@ -891,7 +891,7 @@
     "\n",
     "# Create a Progress Bar\n",
     "t = tqdm(total=train_size)\n",
-    "    \n",
+    "\n",
     "os_process_time_start = time.time()\n",
     "\n",
     "for match in train:\n",
@@ -930,7 +930,7 @@
     "\n",
     "    openskill_players.update(os_blue_players)\n",
     "    openskill_players.update(os_red_players)\n",
-    "        \n",
+    "\n",
     "    t.update(1)\n",
     "\n",
     "os_process_time_stop = time.time()\n",
@@ -1020,7 +1020,7 @@
     "\n",
     "# Create a Progress Bar\n",
     "t = tqdm(total=train_size)\n",
-    "    \n",
+    "\n",
     "ts_process_time_start = time.time()\n",
     "\n",
     "# Set backend here to test with scipy.\n",
@@ -1038,10 +1038,14 @@
     "    ts_red_players = {}\n",
     "\n",
     "    for player in blue_team:\n",
-    "        ts_blue_players[player] = trueskill_players.setdefault(player, trueskill.Rating())\n",
+    "        ts_blue_players[player] = trueskill_players.setdefault(\n",
+    "            player, trueskill.Rating()\n",
+    "        )\n",
     "\n",
     "    for player in red_team:\n",
-    "        ts_red_players[player] = trueskill_players.setdefault(player, trueskill.Rating())\n",
+    "        ts_red_players[player] = trueskill_players.setdefault(\n",
+    "            player, trueskill.Rating()\n",
+    "        )\n",
     "\n",
     "    if won:\n",
     "        blue_team_ratings, red_team_ratings = TrueSkill.rate(\n",
@@ -1057,7 +1061,7 @@
     "\n",
     "    trueskill_players.update(ts_blue_players)\n",
     "    trueskill_players.update(ts_red_players)\n",
-    "        \n",
+    "\n",
     "    t.update(1)\n",
     "\n",
     "ts_process_time_stop = time.time()\n",
@@ -1147,12 +1151,12 @@
     "\n",
     "# Create a Progress Bar\n",
     "t = tqdm(total=test_size)\n",
-    "    \n",
+    "\n",
     "for match in test:\n",
     "    teams: dict = match.get(\"teams\")\n",
     "    blue_team: dict = teams.get(\"blue\")\n",
     "    red_team: dict = teams.get(\"red\")\n",
-    "    \n",
+    "\n",
     "    invalid = False\n",
     "    for player in blue_team:\n",
     "        if player not in openskill_players:\n",
@@ -1161,12 +1165,12 @@
     "    for player in red_team:\n",
     "        if player not in openskill_players:\n",
     "            invalid = True\n",
-    "    \n",
+    "\n",
     "    t.update(1)\n",
-    "    \n",
+    "\n",
     "    if invalid:\n",
     "        continue\n",
-    "    \n",
+    "\n",
     "    verified_test_set.append(match)\n",
     "    valid_matches += 1\n",
     "\n",
@@ -1254,7 +1258,7 @@
     "\n",
     "# Create a Progress Bar\n",
     "t = tqdm(total=test_size)\n",
-    "    \n",
+    "\n",
     "for match in verified_test_set:\n",
     "    result = match.get(\"result\")\n",
     "    won = True if result == \"WIN\" else False\n",
@@ -1281,7 +1285,7 @@
     "        openskill_correct_predictions += 1\n",
     "    else:\n",
     "        openskill_incorrect_predictions += 1\n",
-    "    \n",
+    "\n",
     "    t.update(1)\n",
     "\n",
     "print(f\"Predicted Test Matches\")\n",
@@ -1377,7 +1381,7 @@
     "\n",
     "# Create a Progress Bar\n",
     "t = tqdm(total=test_size)\n",
-    "    \n",
+    "\n",
     "for match in verified_test_set:\n",
     "    result = match.get(\"result\")\n",
     "    won = True if result == \"WIN\" else False\n",
@@ -1497,11 +1501,8 @@
     "\n",
     "openskill_accuracy = round(\n",
     "    (\n",
-    "            openskill_correct_predictions\n",
-    "            / (\n",
-    "                    openskill_incorrect_predictions\n",
-    "                    + openskill_correct_predictions\n",
-    "            )\n",
+    "        openskill_correct_predictions\n",
+    "        / (openskill_incorrect_predictions + openskill_correct_predictions)\n",
     "    )\n",
     "    * 100,\n",
     "    2,\n",
@@ -1509,11 +1510,8 @@
     "\n",
     "trueskill_accuracy = round(\n",
     "    (\n",
-    "            trueskill_correct_predictions\n",
-    "            / (\n",
-    "                    trueskill_incorrect_predictions\n",
-    "                    + trueskill_correct_predictions\n",
-    "            )\n",
+    "        trueskill_correct_predictions\n",
+    "        / (trueskill_incorrect_predictions + trueskill_correct_predictions)\n",
     "    )\n",
     "    * 100,\n",
     "    2,\n",
@@ -1536,9 +1534,7 @@
     "table.add_row(\"TrueSkill Duration\", f\"{trueskill_time}\")\n",
     "speedup = (trueskill_time / openskill_time) * 100\n",
     "table.add_row(f\"Speedup (%)\", f\"{speedup: .2f}\")\n",
-    "accuracy_bump = (\n",
-    "    (openskill_accuracy - trueskill_accuracy) / trueskill_accuracy\n",
-    ") * 100\n",
+    "accuracy_bump = ((openskill_accuracy - trueskill_accuracy) / trueskill_accuracy) * 100\n",
     "table.add_row(f\"Accuracy Bump (%)\", f\"{accuracy_bump: .2f}\")\n",
     "rich.print(table)"
    ]
diff --git a/changes/124.bugfix.rst b/changes/124.bugfix.rst
new file mode 100644
index 0000000..b10d938
--- /dev/null
+++ b/changes/124.bugfix.rst
@@ -0,0 +1,1 @@
+Resolves incorrect predictions for matches of size greater than 2.
diff --git a/docs/source/conf.py b/docs/source/conf.py
index ea6dfdb..09024c4 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -4,6 +4,7 @@ Configuration file for the Sphinx documentation builder.
 For the full list of built-in configuration values, see the documentation:
 https://www.sphinx-doc.org/en/master/usage/configuration.html
 """
+
 from typing import List
 
 import openskill
diff --git a/openskill/models/common.py b/openskill/models/common.py
index 59cdfb3..56a153d 100644
--- a/openskill/models/common.py
+++ b/openskill/models/common.py
@@ -1,6 +1,7 @@
 """
 Common functions for all models.
 """
+
 from typing import Any, List
 
 
diff --git a/openskill/models/weng_lin/__init__.py b/openskill/models/weng_lin/__init__.py
index b198a1a..4a4b604 100644
--- a/openskill/models/weng_lin/__init__.py
+++ b/openskill/models/weng_lin/__init__.py
@@ -3,6 +3,7 @@ All models described in :cite:p:`JMLR:v12:weng11a` are implemented in this
 module. Some convenience and original methods are also provided to make it
 easier to instantiate and use the models.
 """
+
 from typing import List
 
 from openskill.models.weng_lin.bradley_terry_full import (
diff --git a/openskill/models/weng_lin/bradley_terry_full.py b/openskill/models/weng_lin/bradley_terry_full.py
index f89a120..b9ce2b5 100644
--- a/openskill/models/weng_lin/bradley_terry_full.py
+++ b/openskill/models/weng_lin/bradley_terry_full.py
@@ -328,9 +328,9 @@ class BradleyTerryFull:
         self.limit_sigma: bool = limit_sigma
 
         # Model Data Container
-        self.BradleyTerryFullRating: Type[
+        self.BradleyTerryFullRating: Type[BradleyTerryFullRating] = (
             BradleyTerryFullRating
-        ] = BradleyTerryFullRating
+        )
 
     def __repr__(self) -> str:
         return f"BradleyTerryFull(mu={self.mu}, sigma={self.sigma})"
@@ -762,16 +762,15 @@ class BradleyTerryFull:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
-                    (mu_a - mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    (mu_a - mu_b) / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -805,20 +804,20 @@ class BradleyTerryFull:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (draw_margin - mu_a + mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
                 - phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -853,16 +852,16 @@ class BradleyTerryFull:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
         win_probability = [
@@ -902,9 +901,7 @@ class BradleyTerryFull:
         result = []
         for index, team in enumerate(game):
             mu_summed = reduce(lambda x, y: x + y, map(lambda p: p.mu, team))
-            sigma_squared = reduce(
-                lambda x, y: x + y, map(lambda p: p.sigma**2, team)
-            )
+            sigma_squared = reduce(lambda x, y: x + y, map(lambda p: p.sigma**2, team))
             result.append(
                 BradleyTerryFullTeamRating(mu_summed, sigma_squared, team, rank[index])
             )
diff --git a/openskill/models/weng_lin/bradley_terry_part.py b/openskill/models/weng_lin/bradley_terry_part.py
index 8d899aa..1092821 100644
--- a/openskill/models/weng_lin/bradley_terry_part.py
+++ b/openskill/models/weng_lin/bradley_terry_part.py
@@ -333,9 +333,9 @@ class BradleyTerryPart:
         self.limit_sigma: bool = limit_sigma
 
         # Model Data Container
-        self.BradleyTerryPartRating: Type[
+        self.BradleyTerryPartRating: Type[BradleyTerryPartRating] = (
             BradleyTerryPartRating
-        ] = BradleyTerryPartRating
+        )
 
     def __repr__(self) -> str:
         return f"BradleyTerryPart(mu={self.mu}, sigma={self.sigma})"
@@ -774,16 +774,15 @@ class BradleyTerryPart:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
-                    (mu_a - mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    (mu_a - mu_b) / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -817,20 +816,20 @@ class BradleyTerryPart:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (draw_margin - mu_a + mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
                 - phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -865,16 +864,16 @@ class BradleyTerryPart:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
         win_probability = [
@@ -914,9 +913,7 @@ class BradleyTerryPart:
         result = []
         for index, team in enumerate(game):
             mu_summed = reduce(lambda x, y: x + y, map(lambda p: p.mu, team))
-            sigma_squared = reduce(
-                lambda x, y: x + y, map(lambda p: p.sigma**2, team)
-            )
+            sigma_squared = reduce(lambda x, y: x + y, map(lambda p: p.sigma**2, team))
             result.append(
                 BradleyTerryPartTeamRating(mu_summed, sigma_squared, team, rank[index])
             )
diff --git a/openskill/models/weng_lin/common.py b/openskill/models/weng_lin/common.py
index f2b36c0..31a3689 100644
--- a/openskill/models/weng_lin/common.py
+++ b/openskill/models/weng_lin/common.py
@@ -1,6 +1,7 @@
 """
 Common functions for the Weng-Lin models.
 """
+
 import sys
 from itertools import zip_longest
 from statistics import NormalDist
diff --git a/openskill/models/weng_lin/plackett_luce.py b/openskill/models/weng_lin/plackett_luce.py
index 6ae0973..0c50e2a 100644
--- a/openskill/models/weng_lin/plackett_luce.py
+++ b/openskill/models/weng_lin/plackett_luce.py
@@ -2,6 +2,7 @@
 
 Specific classes and functions for the Plackett-Luce model.
 """
+
 import copy
 import itertools
 import math
@@ -758,16 +759,15 @@ class PlackettLuce:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
-                    (mu_a - mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    (mu_a - mu_b) / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -801,20 +801,20 @@ class PlackettLuce:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (draw_margin - mu_a + mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
                 - phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -849,16 +849,16 @@ class PlackettLuce:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
         win_probability = [
@@ -898,9 +898,7 @@ class PlackettLuce:
         result = []
         for index, team in enumerate(game):
             mu_summed = reduce(lambda x, y: x + y, map(lambda p: p.mu, team))
-            sigma_squared = reduce(
-                lambda x, y: x + y, map(lambda p: p.sigma**2, team)
-            )
+            sigma_squared = reduce(lambda x, y: x + y, map(lambda p: p.sigma**2, team))
             result.append(
                 PlackettLuceTeamRating(mu_summed, sigma_squared, team, rank[index])
             )
diff --git a/openskill/models/weng_lin/thurstone_mosteller_full.py b/openskill/models/weng_lin/thurstone_mosteller_full.py
index d393d3a..1a7a040 100644
--- a/openskill/models/weng_lin/thurstone_mosteller_full.py
+++ b/openskill/models/weng_lin/thurstone_mosteller_full.py
@@ -339,9 +339,9 @@ class ThurstoneMostellerFull:
         self.limit_sigma: bool = limit_sigma
 
         # Model Data Container
-        self.ThurstoneMostellerFullRating: Type[
+        self.ThurstoneMostellerFullRating: Type[ThurstoneMostellerFullRating] = (
             ThurstoneMostellerFullRating
-        ] = ThurstoneMostellerFullRating
+        )
 
     def __repr__(self) -> str:
         return f"ThurstoneMostellerFull(mu={self.mu}, sigma={self.sigma})"
@@ -797,16 +797,15 @@ class ThurstoneMostellerFull:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
-                    (mu_a - mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    (mu_a - mu_b) / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -840,20 +839,20 @@ class ThurstoneMostellerFull:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (draw_margin - mu_a + mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
                 - phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -888,16 +887,16 @@ class ThurstoneMostellerFull:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
         win_probability = [
@@ -937,9 +936,7 @@ class ThurstoneMostellerFull:
         result = []
         for index, team in enumerate(game):
             mu_summed = reduce(lambda x, y: x + y, map(lambda p: p.mu, team))
-            sigma_squared = reduce(
-                lambda x, y: x + y, map(lambda p: p.sigma**2, team)
-            )
+            sigma_squared = reduce(lambda x, y: x + y, map(lambda p: p.sigma**2, team))
             result.append(
                 ThurstoneMostellerFullTeamRating(
                     mu_summed, sigma_squared, team, rank[index]
diff --git a/openskill/models/weng_lin/thurstone_mosteller_part.py b/openskill/models/weng_lin/thurstone_mosteller_part.py
index a981620..fd72958 100644
--- a/openskill/models/weng_lin/thurstone_mosteller_part.py
+++ b/openskill/models/weng_lin/thurstone_mosteller_part.py
@@ -341,9 +341,9 @@ class ThurstoneMostellerPart:
         self.limit_sigma: bool = limit_sigma
 
         # Model Data Container
-        self.ThurstoneMostellerPartRating: Type[
+        self.ThurstoneMostellerPartRating: Type[ThurstoneMostellerPartRating] = (
             ThurstoneMostellerPartRating
-        ] = ThurstoneMostellerPartRating
+        )
 
     def __repr__(self) -> str:
         return f"ThurstoneMostellerPart(mu={self.mu}, sigma={self.sigma})"
@@ -801,16 +801,15 @@ class ThurstoneMostellerPart:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
-                    (mu_a - mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    (mu_a - mu_b) / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -844,20 +843,20 @@ class ThurstoneMostellerPart:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (draw_margin - mu_a + mu_b)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
                 - phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
 
@@ -892,16 +891,16 @@ class ThurstoneMostellerPart:
 
         pairwise_probabilities = []
         for pair_a, pair_b in itertools.permutations(teams, 2):
-            pair_a_subset = pair_a[0]
-            pair_b_subset = pair_b[0]
-            mu_a = pair_a_subset.mu
-            sigma_a = pair_a_subset.sigma
-            mu_b = pair_b_subset.mu
-            sigma_b = pair_b_subset.sigma
+            pair_a_subset = self._calculate_team_ratings([pair_a])
+            pair_b_subset = self._calculate_team_ratings([pair_b])
+            mu_a = pair_a_subset[0].mu
+            sigma_a = pair_a_subset[0].sigma_squared
+            mu_b = pair_b_subset[0].mu
+            sigma_b = pair_b_subset[0].sigma_squared
             pairwise_probabilities.append(
                 phi_major(
                     (mu_a - mu_b - draw_margin)
-                    / math.sqrt(n * self.beta**2 + sigma_a**2 + sigma_b**2)
+                    / math.sqrt(n * self.beta**2 + sigma_a + sigma_b)
                 )
             )
         win_probability = [
@@ -941,9 +940,7 @@ class ThurstoneMostellerPart:
         result = []
         for index, team in enumerate(game):
             mu_summed = reduce(lambda x, y: x + y, map(lambda p: p.mu, team))
-            sigma_squared = reduce(
-                lambda x, y: x + y, map(lambda p: p.sigma**2, team)
-            )
+            sigma_squared = reduce(lambda x, y: x + y, map(lambda p: p.sigma**2, team))
             result.append(
                 ThurstoneMostellerPartTeamRating(
                     mu_summed, sigma_squared, team, rank[index]
diff --git a/pdm.lock b/pdm.lock
index e30669a..f037f6e 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -6,7 +6,7 @@ groups = ["default", "benchmarks", "docs", "release", "tests"]
 cross_platform = true
 static_urls = false
 lock_version = "4.3"
-content_hash = "sha256:80718f8d6430ba415e6bd09b4d4b1d26ea09f2e3562f8f69b686b587643036ed"
+content_hash = "sha256:1c973224727908c91b9638fbc6ef5f1764bf88475476e7345ef1fa9829ff4153"
 
 [[package]]
 name = "alabaster"
@@ -42,6 +42,9 @@ name = "astroid"
 version = "3.0.2"
 requires_python = ">=3.8.0"
 summary = "An abstract syntax tree for Python with inference support."
+dependencies = [
+    "typing-extensions>=4.0.0; python_version < \"3.11\"",
+]
 files = [
     {file = "astroid-3.0.2-py3-none-any.whl", hash = "sha256:d6e62862355f60e716164082d6b4b041d38e2a8cf1c7cd953ded5108bac8ff5c"},
     {file = "astroid-3.0.2.tar.gz", hash = "sha256:4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91"},
@@ -106,7 +109,7 @@ files = [
 
 [[package]]
 name = "black"
-version = "23.12.1"
+version = "24.1.1"
 requires_python = ">=3.8"
 summary = "The uncompromising code formatter."
 dependencies = [
@@ -119,64 +122,64 @@ dependencies = [
     "typing-extensions>=4.0.1; python_version < \"3.11\"",
 ]
 files = [
-    {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"},
-    {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"},
-    {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"},
-    {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"},
-    {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"},
-    {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"},
-    {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"},
-    {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"},
-    {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"},
-    {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"},
-    {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"},
-    {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"},
-    {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"},
-    {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"},
-    {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"},
-    {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"},
-    {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"},
-    {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"},
-    {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"},
-    {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"},
-    {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"},
-    {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"},
+    {file = "black-24.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2588021038bd5ada078de606f2a804cadd0a3cc6a79cb3e9bb3a8bf581325a4c"},
+    {file = "black-24.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a95915c98d6e32ca43809d46d932e2abc5f1f7d582ffbe65a5b4d1588af7445"},
+    {file = "black-24.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa6a0e965779c8f2afb286f9ef798df770ba2b6cee063c650b96adec22c056a"},
+    {file = "black-24.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5242ecd9e990aeb995b6d03dc3b2d112d4a78f2083e5a8e86d566340ae80fec4"},
+    {file = "black-24.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fc1ec9aa6f4d98d022101e015261c056ddebe3da6a8ccfc2c792cbe0349d48b7"},
+    {file = "black-24.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0269dfdea12442022e88043d2910429bed717b2d04523867a85dacce535916b8"},
+    {file = "black-24.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3d64db762eae4a5ce04b6e3dd745dcca0fb9560eb931a5be97472e38652a161"},
+    {file = "black-24.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5d7b06ea8816cbd4becfe5f70accae953c53c0e53aa98730ceccb0395520ee5d"},
+    {file = "black-24.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e2c8dfa14677f90d976f68e0c923947ae68fa3961d61ee30976c388adc0b02c8"},
+    {file = "black-24.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a21725862d0e855ae05da1dd25e3825ed712eaaccef6b03017fe0853a01aa45e"},
+    {file = "black-24.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07204d078e25327aad9ed2c64790d681238686bce254c910de640c7cc4fc3aa6"},
+    {file = "black-24.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:a83fe522d9698d8f9a101b860b1ee154c1d25f8a82ceb807d319f085b2627c5b"},
+    {file = "black-24.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08b34e85170d368c37ca7bf81cf67ac863c9d1963b2c1780c39102187ec8dd62"},
+    {file = "black-24.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7258c27115c1e3b5de9ac6c4f9957e3ee2c02c0b39222a24dc7aa03ba0e986f5"},
+    {file = "black-24.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40657e1b78212d582a0edecafef133cf1dd02e6677f539b669db4746150d38f6"},
+    {file = "black-24.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e298d588744efda02379521a19639ebcd314fba7a49be22136204d7ed1782717"},
+    {file = "black-24.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34afe9da5056aa123b8bfda1664bfe6fb4e9c6f311d8e4a6eb089da9a9173bf9"},
+    {file = "black-24.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:854c06fb86fd854140f37fb24dbf10621f5dab9e3b0c29a690ba595e3d543024"},
+    {file = "black-24.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3897ae5a21ca132efa219c029cce5e6bfc9c3d34ed7e892113d199c0b1b444a2"},
+    {file = "black-24.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:ecba2a15dfb2d97105be74bbfe5128bc5e9fa8477d8c46766505c1dda5883aac"},
+    {file = "black-24.1.1-py3-none-any.whl", hash = "sha256:5cdc2e2195212208fbcae579b931407c1fa9997584f0a415421748aeafff1168"},
+    {file = "black-24.1.1.tar.gz", hash = "sha256:48b5760dcbfe5cf97fd4fba23946681f3a81514c6ab8a45b50da67ac8fbc6c7b"},
 ]
 
 [[package]]
 name = "black"
-version = "23.12.1"
+version = "24.1.1"
 extras = ["jupyter"]
 requires_python = ">=3.8"
 summary = "The uncompromising code formatter."
 dependencies = [
-    "black==23.12.1",
+    "black==24.1.1",
     "ipython>=7.8.0",
     "tokenize-rt>=3.2.0",
 ]
 files = [
-    {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"},
-    {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"},
-    {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"},
-    {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"},
-    {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"},
-    {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"},
-    {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"},
-    {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"},
-    {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"},
-    {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"},
-    {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"},
-    {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"},
-    {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"},
-    {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"},
-    {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"},
-    {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"},
-    {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"},
-    {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"},
-    {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"},
-    {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"},
-    {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"},
-    {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"},
+    {file = "black-24.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2588021038bd5ada078de606f2a804cadd0a3cc6a79cb3e9bb3a8bf581325a4c"},
+    {file = "black-24.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a95915c98d6e32ca43809d46d932e2abc5f1f7d582ffbe65a5b4d1588af7445"},
+    {file = "black-24.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa6a0e965779c8f2afb286f9ef798df770ba2b6cee063c650b96adec22c056a"},
+    {file = "black-24.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5242ecd9e990aeb995b6d03dc3b2d112d4a78f2083e5a8e86d566340ae80fec4"},
+    {file = "black-24.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fc1ec9aa6f4d98d022101e015261c056ddebe3da6a8ccfc2c792cbe0349d48b7"},
+    {file = "black-24.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0269dfdea12442022e88043d2910429bed717b2d04523867a85dacce535916b8"},
+    {file = "black-24.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3d64db762eae4a5ce04b6e3dd745dcca0fb9560eb931a5be97472e38652a161"},
+    {file = "black-24.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5d7b06ea8816cbd4becfe5f70accae953c53c0e53aa98730ceccb0395520ee5d"},
+    {file = "black-24.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e2c8dfa14677f90d976f68e0c923947ae68fa3961d61ee30976c388adc0b02c8"},
+    {file = "black-24.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a21725862d0e855ae05da1dd25e3825ed712eaaccef6b03017fe0853a01aa45e"},
+    {file = "black-24.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07204d078e25327aad9ed2c64790d681238686bce254c910de640c7cc4fc3aa6"},
+    {file = "black-24.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:a83fe522d9698d8f9a101b860b1ee154c1d25f8a82ceb807d319f085b2627c5b"},
+    {file = "black-24.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08b34e85170d368c37ca7bf81cf67ac863c9d1963b2c1780c39102187ec8dd62"},
+    {file = "black-24.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7258c27115c1e3b5de9ac6c4f9957e3ee2c02c0b39222a24dc7aa03ba0e986f5"},
+    {file = "black-24.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40657e1b78212d582a0edecafef133cf1dd02e6677f539b669db4746150d38f6"},
+    {file = "black-24.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e298d588744efda02379521a19639ebcd314fba7a49be22136204d7ed1782717"},
+    {file = "black-24.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34afe9da5056aa123b8bfda1664bfe6fb4e9c6f311d8e4a6eb089da9a9173bf9"},
+    {file = "black-24.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:854c06fb86fd854140f37fb24dbf10621f5dab9e3b0c29a690ba595e3d543024"},
+    {file = "black-24.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3897ae5a21ca132efa219c029cce5e6bfc9c3d34ed7e892113d199c0b1b444a2"},
+    {file = "black-24.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:ecba2a15dfb2d97105be74bbfe5128bc5e9fa8477d8c46766505c1dda5883aac"},
+    {file = "black-24.1.1-py3-none-any.whl", hash = "sha256:5cdc2e2195212208fbcae579b931407c1fa9997584f0a415421748aeafff1168"},
+    {file = "black-24.1.1.tar.gz", hash = "sha256:48b5760dcbfe5cf97fd4fba23946681f3a81514c6ab8a45b50da67ac8fbc6c7b"},
 ]
 
 [[package]]
@@ -195,18 +198,19 @@ files = [
 
 [[package]]
 name = "build"
-version = "0.10.0"
+version = "1.0.3"
 requires_python = ">= 3.7"
 summary = "A simple, correct Python build frontend"
 dependencies = [
     "colorama; os_name == \"nt\"",
+    "importlib-metadata>=4.6; python_version < \"3.10\"",
     "packaging>=19.0",
     "pyproject-hooks",
     "tomli>=1.1.0; python_version < \"3.11\"",
 ]
 files = [
-    {file = "build-0.10.0-py3-none-any.whl", hash = "sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171"},
-    {file = "build-0.10.0.tar.gz", hash = "sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269"},
+    {file = "build-1.0.3-py3-none-any.whl", hash = "sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f"},
+    {file = "build-1.0.3.tar.gz", hash = "sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b"},
 ]
 
 [[package]]
@@ -228,12 +232,12 @@ files = [
 
 [[package]]
 name = "cachetools"
-version = "5.3.1"
+version = "5.3.2"
 requires_python = ">=3.7"
 summary = "Extensible memoizing collections and decorators"
 files = [
-    {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"},
-    {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"},
+    {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"},
+    {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"},
 ]
 
 [[package]]
@@ -465,127 +469,127 @@ files = [
 
 [[package]]
 name = "coverage"
-version = "7.4.0"
+version = "7.4.1"
 requires_python = ">=3.8"
 summary = "Code coverage measurement for Python"
 files = [
-    {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"},
-    {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"},
-    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"},
-    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"},
-    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"},
-    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"},
-    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"},
-    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"},
-    {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"},
-    {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"},
-    {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"},
-    {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"},
-    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"},
-    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"},
-    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"},
-    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"},
-    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"},
-    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"},
-    {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"},
-    {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"},
-    {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"},
-    {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"},
-    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"},
-    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"},
-    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"},
-    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"},
-    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"},
-    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"},
-    {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"},
-    {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"},
-    {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"},
-    {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"},
-    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"},
-    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"},
-    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"},
-    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"},
-    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"},
-    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"},
-    {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"},
-    {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"},
-    {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"},
-    {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"},
-    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"},
-    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"},
-    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"},
-    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"},
-    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"},
-    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"},
-    {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"},
-    {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"},
-    {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"},
-    {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"},
+    {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"},
+    {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"},
+    {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"},
+    {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"},
+    {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"},
+    {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"},
+    {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"},
+    {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"},
+    {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"},
+    {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"},
+    {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"},
+    {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"},
+    {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"},
+    {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"},
+    {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"},
+    {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"},
+    {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"},
+    {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"},
+    {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"},
+    {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"},
+    {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"},
+    {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"},
+    {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"},
+    {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"},
+    {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"},
+    {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"},
+    {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"},
+    {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"},
+    {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"},
+    {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"},
+    {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"},
+    {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"},
+    {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"},
+    {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"},
+    {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"},
+    {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"},
+    {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"},
+    {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"},
+    {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"},
+    {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"},
+    {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"},
+    {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"},
+    {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"},
+    {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"},
+    {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"},
+    {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"},
+    {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"},
+    {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"},
+    {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"},
+    {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"},
+    {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"},
+    {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"},
 ]
 
 [[package]]
 name = "coverage"
-version = "7.4.0"
+version = "7.4.1"
 extras = ["toml"]
 requires_python = ">=3.8"
 summary = "Code coverage measurement for Python"
 dependencies = [
-    "coverage==7.4.0",
+    "coverage==7.4.1",
     "tomli; python_full_version <= \"3.11.0a6\"",
 ]
 files = [
-    {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"},
-    {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"},
-    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"},
-    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"},
-    {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"},
-    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"},
-    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"},
-    {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"},
-    {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"},
-    {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"},
-    {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"},
-    {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"},
-    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"},
-    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"},
-    {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"},
-    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"},
-    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"},
-    {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"},
-    {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"},
-    {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"},
-    {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"},
-    {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"},
-    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"},
-    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"},
-    {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"},
-    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"},
-    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"},
-    {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"},
-    {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"},
-    {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"},
-    {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"},
-    {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"},
-    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"},
-    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"},
-    {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"},
-    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"},
-    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"},
-    {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"},
-    {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"},
-    {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"},
-    {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"},
-    {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"},
-    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"},
-    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"},
-    {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"},
-    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"},
-    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"},
-    {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"},
-    {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"},
-    {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"},
-    {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"},
-    {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"},
+    {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"},
+    {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"},
+    {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"},
+    {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"},
+    {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"},
+    {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"},
+    {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"},
+    {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"},
+    {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"},
+    {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"},
+    {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"},
+    {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"},
+    {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"},
+    {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"},
+    {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"},
+    {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"},
+    {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"},
+    {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"},
+    {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"},
+    {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"},
+    {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"},
+    {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"},
+    {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"},
+    {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"},
+    {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"},
+    {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"},
+    {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"},
+    {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"},
+    {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"},
+    {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"},
+    {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"},
+    {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"},
+    {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"},
+    {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"},
+    {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"},
+    {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"},
+    {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"},
+    {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"},
+    {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"},
+    {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"},
+    {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"},
+    {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"},
+    {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"},
+    {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"},
+    {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"},
+    {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"},
+    {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"},
+    {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"},
+    {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"},
+    {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"},
+    {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"},
+    {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"},
 ]
 
 [[package]]
@@ -788,7 +792,7 @@ files = [
 
 [[package]]
 name = "ipykernel"
-version = "6.28.0"
+version = "6.29.0"
 requires_python = ">=3.8"
 summary = "IPython Kernel for Jupyter"
 dependencies = [
@@ -807,8 +811,8 @@ dependencies = [
     "traitlets>=5.4.0",
 ]
 files = [
-    {file = "ipykernel-6.28.0-py3-none-any.whl", hash = "sha256:c6e9a9c63a7f4095c0a22a79f765f079f9ec7be4f2430a898ddea889e8665661"},
-    {file = "ipykernel-6.28.0.tar.gz", hash = "sha256:69c11403d26de69df02225916f916b37ea4b9af417da0a8c827f84328d88e5f3"},
+    {file = "ipykernel-6.29.0-py3-none-any.whl", hash = "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f"},
+    {file = "ipykernel-6.29.0.tar.gz", hash = "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f"},
 ]
 
 [[package]]
@@ -1340,12 +1344,12 @@ files = [
 
 [[package]]
 name = "packaging"
-version = "23.1"
+version = "23.2"
 requires_python = ">=3.7"
 summary = "Core utilities for Python packages"
 files = [
-    {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"},
-    {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"},
+    {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"},
+    {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
 ]
 
 [[package]]
@@ -1462,12 +1466,12 @@ files = [
 
 [[package]]
 name = "platformdirs"
-version = "3.10.0"
-requires_python = ">=3.7"
+version = "4.2.0"
+requires_python = ">=3.8"
 summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
 files = [
-    {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"},
-    {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"},
+    {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"},
+    {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"},
 ]
 
 [[package]]
@@ -1482,16 +1486,16 @@ files = [
 
 [[package]]
 name = "polars"
-version = "0.20.3"
+version = "0.20.6"
 requires_python = ">=3.8"
 summary = "Blazingly fast DataFrame library"
 files = [
-    {file = "polars-0.20.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ff5ad360f5fab35cbc608eccaea583e387fe4e629f44d4ebfa752dc79502d3f5"},
-    {file = "polars-0.20.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6450d62becd40175661c5143c4e967d89e46104771aded951d1f0faadc63709e"},
-    {file = "polars-0.20.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c89848562e3176d0e7bc517d1761c6fb5a9fca57ca2950cb58d3d001958dc285"},
-    {file = "polars-0.20.3-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:dc685edd2d8742c71ffb238c2c25c17354631ddcfc8e9a105aaf9c228c1a0eb3"},
-    {file = "polars-0.20.3-cp38-abi3-win_amd64.whl", hash = "sha256:89e08f669b63017124f1ea197ab4c14730cc5edee32d9bf2bddb2753b2726091"},
-    {file = "polars-0.20.3.tar.gz", hash = "sha256:8562bffe602b131036e996e0161d96ea7ba1c004e513e49cbec55debc8b5fada"},
+    {file = "polars-0.20.6-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:59845bae0b614b3291baa889cfc2a251e1024129696bb655596f2b5556e9f9a1"},
+    {file = "polars-0.20.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:9e86736f68440bf97a9100fa0a79ae7ce616d1af6fd4669fff1345f03aab14c0"},
+    {file = "polars-0.20.6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f4e3335fdcc863f6aac0616510b1baa5e13d5e818ebbfcb980ad534bd6edc2"},
+    {file = "polars-0.20.6-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:7c7b494beea914a54bcae8868dee3988a88ecb48525df948e07aacf2fb83e711"},
+    {file = "polars-0.20.6-cp38-abi3-win_amd64.whl", hash = "sha256:a96b157d68697c8d6ef2f7c2cc1734d498c3c6cc0c9c18d4fff7283ccfabdd1d"},
+    {file = "polars-0.20.6.tar.gz", hash = "sha256:b53553308bc7e2b4f841b18f1949b61ed7f2cf155c5c64712298efa5af67a997"},
 ]
 
 [[package]]
@@ -2188,15 +2192,15 @@ files = [
 
 [[package]]
 name = "shibuya"
-version = "2024.1.2"
+version = "2024.1.17"
 requires_python = ">=3.7"
 summary = "A clean, responsive, and customizable Sphinx documentation theme with light/dark mode."
 dependencies = [
     "Sphinx",
 ]
 files = [
-    {file = "shibuya-2024.1.2-py3-none-any.whl", hash = "sha256:27533d5ed93881c3de3eec9c9f3004fa2fb3120c73869ffc2c719fda65cc78ee"},
-    {file = "shibuya-2024.1.2.tar.gz", hash = "sha256:12937ad82c660db660a4ce196bd126630c9bd90d96a8593203eefd2ad255957e"},
+    {file = "shibuya-2024.1.17-py3-none-any.whl", hash = "sha256:9ed1b4225b3b8abe9234908f197904158355c92ba24e1e8cd414e73d1a937465"},
+    {file = "shibuya-2024.1.17.tar.gz", hash = "sha256:e1c709c343d0fe948d7a1be2a4ec90b48cca12e06464b17654d6c0c94bb0f9f9"},
 ]
 
 [[package]]
@@ -2342,7 +2346,7 @@ files = [
 
 [[package]]
 name = "sphinxcontrib-bibtex"
-version = "2.6.1"
+version = "2.6.2"
 requires_python = ">=3.7"
 summary = "Sphinx extension for BibTeX style citations."
 dependencies = [
@@ -2353,8 +2357,8 @@ dependencies = [
     "pybtex>=0.24",
 ]
 files = [
-    {file = "sphinxcontrib-bibtex-2.6.1.tar.gz", hash = "sha256:046b49f070ae5276af34c1b8ddb9bc9562ef6de2f7a52d37a91cb8e53f54b863"},
-    {file = "sphinxcontrib_bibtex-2.6.1-py3-none-any.whl", hash = "sha256:094c772098fe6b030cda8618c45722b2957cad0c04f328ba2b154aa08dfe720a"},
+    {file = "sphinxcontrib-bibtex-2.6.2.tar.gz", hash = "sha256:f487af694336f28bfb7d6a17070953a7d264bec43000a2379724274f5f8d70ae"},
+    {file = "sphinxcontrib_bibtex-2.6.2-py3-none-any.whl", hash = "sha256:10d45ebbb19207c5665396c9446f8012a79b8a538cb729f895b5910ab2d0b2da"},
 ]
 
 [[package]]
@@ -2525,24 +2529,24 @@ files = [
 
 [[package]]
 name = "tox"
-version = "4.11.4"
+version = "4.12.1"
 requires_python = ">=3.8"
 summary = "tox is a generic virtualenv management and test command line tool"
 dependencies = [
-    "cachetools>=5.3.1",
+    "cachetools>=5.3.2",
     "chardet>=5.2",
     "colorama>=0.4.6",
-    "filelock>=3.12.3",
-    "packaging>=23.1",
-    "platformdirs>=3.10",
+    "filelock>=3.13.1",
+    "packaging>=23.2",
+    "platformdirs>=4.1",
     "pluggy>=1.3",
     "pyproject-api>=1.6.1",
     "tomli>=2.0.1; python_version < \"3.11\"",
-    "virtualenv>=20.24.3",
+    "virtualenv>=20.25",
 ]
 files = [
-    {file = "tox-4.11.4-py3-none-any.whl", hash = "sha256:2adb83d68f27116812b69aa36676a8d6a52249cb0d173649de0e7d0c2e3e7229"},
-    {file = "tox-4.11.4.tar.gz", hash = "sha256:73a7240778fabf305aeb05ab8ea26e575e042ab5a18d71d0ed13e343a51d6ce1"},
+    {file = "tox-4.12.1-py3-none-any.whl", hash = "sha256:c07ea797880a44f3c4f200ad88ad92b446b83079d4ccef89585df64cc574375c"},
+    {file = "tox-4.12.1.tar.gz", hash = "sha256:61aafbeff1bd8a5af84e54ef6e8402f53c6a6066d0782336171ddfbf5362122e"},
 ]
 
 [[package]]
@@ -2633,17 +2637,17 @@ files = [
 
 [[package]]
 name = "virtualenv"
-version = "20.24.3"
+version = "20.25.0"
 requires_python = ">=3.7"
 summary = "Virtual Python Environment builder"
 dependencies = [
     "distlib<1,>=0.3.7",
     "filelock<4,>=3.12.2",
-    "platformdirs<4,>=3.9.1",
+    "platformdirs<5,>=3.9.1",
 ]
 files = [
-    {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"},
-    {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"},
+    {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"},
+    {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"},
 ]
 
 [[package]]
diff --git a/pyproject.toml b/pyproject.toml
index 597f591..6c9bae1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -101,9 +101,9 @@ tests = [
 ]
 release = [
     "twine~=4.0",
-    "build~=0.10",
-    "isort~=5.12",
-    "black[jupyter]~=23.7",
+    "build~=1.0",
+    "isort~=5.13",
+    "black[jupyter]~=24.1",
     "codecov~=2.1",
     "towncrier~=23.6",
     "bump-my-version~=0.9.2",
diff --git a/tox.ini b/tox.ini
index 15a6109..5001281 100644
--- a/tox.ini
+++ b/tox.ini
@@ -38,8 +38,8 @@ commands =
 [testenv:lint]
 description = Run Linters
 deps =
-    black>=23.3.0
-    isort>=5.12.0
+    black>=24.1.1
+    isort>=5.13.2
 commands =
     isort . --check-only
     black . --check --verbose


Test patch:
diff --git a/tests/models/data/bradleyterryfull.json b/tests/models/data/bradleyterryfull.json
index 8754e40..817f660 100644
--- a/tests/models/data/bradleyterryfull.json
+++ b/tests/models/data/bradleyterryfull.json
@@ -1,123 +1,123 @@
 {
     "model": {
-        "mu": 29.36396996731831,
-        "sigma": 4.171204886973876
+        "mu": 17.842929377297303,
+        "sigma": 1.511049869752525
     },
     "normal": {
         "team_1": [
             {
-                "mu": 31.153959099540106,
-                "sigma": 4.164662443820041
+                "mu": 18.177036976922977,
+                "sigma": 1.512801806019586
             }
         ],
         "team_2": [
             {
-                "mu": 27.573980835096517,
-                "sigma": 4.161603879330805
+                "mu": 17.508821777671628,
+                "sigma": 1.5125763309974716
             },
             {
-                "mu": 27.573980835096517,
-                "sigma": 4.161603879330805
+                "mu": 17.508821777671628,
+                "sigma": 1.5125763309974716
             }
         ]
     },
     "ranks": {
         "team_1": [
             {
-                "mu": 29.287206490045804,
-                "sigma": 4.164662443820041
+                "mu": 17.82192360542754,
+                "sigma": 1.512801806019586
             }
         ],
         "team_2": [
             {
-                "mu": 29.44073344459082,
-                "sigma": 4.161603879330805
+                "mu": 17.863935149167066,
+                "sigma": 1.5125763309974716
             },
             {
-                "mu": 29.44073344459082,
-                "sigma": 4.161603879330805
+                "mu": 17.863935149167066,
+                "sigma": 1.5125763309974716
             }
         ]
     },
     "scores": {
         "team_1": [
             {
-                "mu": 29.287206490045804,
-                "sigma": 4.164662443820041
+                "mu": 17.82192360542754,
+                "sigma": 1.512801806019586
             }
         ],
         "team_2": [
             {
-                "mu": 29.44073344459082,
-                "sigma": 4.161603879330805
+                "mu": 17.863935149167066,
+                "sigma": 1.5125763309974716
             },
             {
-                "mu": 29.44073344459082,
-                "sigma": 4.161603879330805
+                "mu": 17.863935149167066,
+                "sigma": 1.5125763309974716
             }
         ]
     },
     "limit_sigma": {
         "team_1": [
             {
-                "mu": 30.98575395732507,
-                "sigma": 4.164211798652542
+                "mu": 18.166071600249957,
+                "sigma": 1.511049869752525
             }
         ],
         "team_2": [
             {
-                "mu": 30.91518357463656,
-                "sigma": 4.151834626521716
+                "mu": 18.178227027344036,
+                "sigma": 1.511049869752525
             },
             {
-                "mu": 30.91518357463656,
-                "sigma": 4.151834626521716
+                "mu": 18.178227027344036,
+                "sigma": 1.511049869752525
             }
         ],
         "team_3": [
             {
-                "mu": 26.190972369993304,
-                "sigma": 4.159317810753674
+                "mu": 17.18448950429791,
+                "sigma": 1.511049869752525
             },
             {
-                "mu": 26.190972369993304,
-                "sigma": 4.159317810753674
+                "mu": 17.18448950429791,
+                "sigma": 1.511049869752525
             },
             {
-                "mu": 26.190972369993304,
-                "sigma": 4.159317810753674
+                "mu": 17.18448950429791,
+                "sigma": 1.511049869752525
             }
         ]
     },
     "ties": {
         "team_1": [
             {
-                "mu": 32.000527612789725,
-                "sigma": 4.164211798652542
+                "mu": 18.348323624601324,
+                "sigma": 1.5127608868869538
             }
         ],
         "team_2": [
             {
-                "mu": 27.4709691990532,
-                "sigma": 4.151834626521716
+                "mu": 17.486074000410817,
+                "sigma": 1.5118317884973382
             },
             {
-                "mu": 27.4709691990532,
-                "sigma": 4.151834626521716
+                "mu": 17.486074000410817,
+                "sigma": 1.5118317884973382
             }
         ],
         "team_3": [
             {
-                "mu": 28.620413090112006,
-                "sigma": 4.159317810753674
+                "mu": 17.69439050687977,
+                "sigma": 1.5123636594987848
             },
             {
-                "mu": 28.620413090112006,
-                "sigma": 4.159317810753674
+                "mu": 17.69439050687977,
+                "sigma": 1.5123636594987848
             },
             {
-                "mu": 28.620413090112006,
-                "sigma": 4.159317810753674
+                "mu": 17.69439050687977,
+                "sigma": 1.5123636594987848
             }
         ]
     }
diff --git a/tests/models/data/bradleyterrypart.json b/tests/models/data/bradleyterrypart.json
index b3f5fd5..6c2070f 100644
--- a/tests/models/data/bradleyterrypart.json
+++ b/tests/models/data/bradleyterrypart.json
@@ -1,123 +1,123 @@
 {
     "model": {
-        "mu": 23.42618920652956,
-        "sigma": 6.620037113814815
+        "mu": 10.26558503511445,
+        "sigma": 9.328809427064739
     },
     "normal": {
         "team_1": [
             {
-                "mu": 26.350714477306713,
-                "sigma": 6.566437175049652
+                "mu": 13.529115856530728,
+                "sigma": 9.157136493268368
             }
         ],
         "team_2": [
             {
-                "mu": 20.501663935752408,
-                "sigma": 6.543886990267017
+                "mu": 7.002054213698171,
+                "sigma": 9.084918843073634
             },
             {
-                "mu": 20.501663935752408,
-                "sigma": 6.543886990267017
+                "mu": 7.002054213698171,
+                "sigma": 9.084918843073634
             }
         ]
     },
     "ranks": {
         "team_1": [
             {
-                "mu": 22.95093312306163,
-                "sigma": 6.566437175049652
+                "mu": 8.468876664717218,
+                "sigma": 9.157136493268368
             }
         ],
         "team_2": [
             {
-                "mu": 23.90144528999749,
-                "sigma": 6.543886990267017
+                "mu": 12.062293405511681,
+                "sigma": 9.084918843073634
             },
             {
-                "mu": 23.90144528999749,
-                "sigma": 6.543886990267017
+                "mu": 12.062293405511681,
+                "sigma": 9.084918843073634
             }
         ]
     },
     "scores": {
         "team_1": [
             {
-                "mu": 22.95093312306163,
-                "sigma": 6.566437175049652
+                "mu": 8.468876664717218,
+                "sigma": 9.157136493268368
             }
         ],
         "team_2": [
             {
-                "mu": 23.90144528999749,
-                "sigma": 6.543886990267017
+                "mu": 12.062293405511681,
+                "sigma": 9.084918843073634
             },
             {
-                "mu": 23.90144528999749,
-                "sigma": 6.543886990267017
+                "mu": 12.062293405511681,
+                "sigma": 9.084918843073634
             }
         ]
     },
     "limit_sigma": {
         "team_1": [
             {
-                "mu": 25.86048074100693,
-                "sigma": 6.554810683388137
+                "mu": 11.763268530665895,
+                "sigma": 9.057653033492564
             }
         ],
         "team_2": [
             {
-                "mu": 23.90144528999749,
-                "sigma": 6.543886990267017
+                "mu": 12.062293405511681,
+                "sigma": 9.084918843073634
             },
             {
-                "mu": 23.90144528999749,
-                "sigma": 6.543886990267017
+                "mu": 12.062293405511681,
+                "sigma": 9.084918843073634
             }
         ],
         "team_3": [
             {
-                "mu": 20.51664158858426,
-                "sigma": 6.6005760670808815
+                "mu": 6.9711931691657725,
+                "sigma": 9.15942312468392
             },
             {
-                "mu": 20.51664158858426,
-                "sigma": 6.6005760670808815
+                "mu": 6.9711931691657725,
+                "sigma": 9.15942312468392
             },
             {
-                "mu": 20.51664158858426,
-                "sigma": 6.6005760670808815
+                "mu": 6.9711931691657725,
+                "sigma": 9.15942312468392
             }
         ]
     },
     "ties": {
         "team_1": [
             {
-                "mu": 24.823573253695134,
-                "sigma": 6.60903031873173
+                "mu": 11.335955554350374,
+                "sigma": 9.2315523878558
             }
         ],
         "team_2": [
             {
-                "mu": 22.912026931066997,
-                "sigma": 6.569326466933734
+                "mu": 8.72473165362405,
+                "sigma": 9.203982072532947
             },
             {
-                "mu": 22.912026931066997,
-                "sigma": 6.569326466933734
+                "mu": 8.72473165362405,
+                "sigma": 9.203982072532947
             }
         ],
         "team_3": [
             {
-                "mu": 22.54296743482655,
-                "sigma": 6.537579021716175
+                "mu": 10.736067897368924,
+                "sigma": 9.002955227772386
             },
             {
-                "mu": 22.54296743482655,
-                "sigma": 6.537579021716175
+                "mu": 10.736067897368924,
+                "sigma": 9.002955227772386
             },
             {
-                "mu": 22.54296743482655,
-                "sigma": 6.537579021716175
+                "mu": 10.736067897368924,
+                "sigma": 9.002955227772386
             }
         ]
     }
diff --git a/tests/models/data/plackettluce.json b/tests/models/data/plackettluce.json
index 7afd62e..4a61697 100644
--- a/tests/models/data/plackettluce.json
+++ b/tests/models/data/plackettluce.json
@@ -1,123 +1,123 @@
 {
     "model": {
-        "mu": 34.769193779029436,
-        "sigma": 6.201579611813977
+        "mu": 31.321989232514305,
+        "sigma": 11.379964801443018
     },
     "normal": {
         "team_1": [
             {
-                "mu": 37.735025845053656,
-                "sigma": 6.1810840601280885
+                "mu": 36.48967347401391,
+                "sigma": 11.237778601372977
             }
         ],
         "team_2": [
             {
-                "mu": 31.80336171300522,
-                "sigma": 6.172341582637791
+                "mu": 26.154304991014694,
+                "sigma": 11.17822477763209
             },
             {
-                "mu": 31.80336171300522,
-                "sigma": 6.172341582637791
+                "mu": 26.154304991014694,
+                "sigma": 11.17822477763209
             }
         ]
     },
     "ranks": {
         "team_1": [
             {
-                "mu": 34.59552112325378,
-                "sigma": 6.1810840601280885
+                "mu": 30.19454401757094,
+                "sigma": 11.237778601372977
             }
         ],
         "team_2": [
             {
-                "mu": 34.94286643480509,
-                "sigma": 6.172341582637791
+                "mu": 32.44943444745767,
+                "sigma": 11.17822477763209
             },
             {
-                "mu": 34.94286643480509,
-                "sigma": 6.172341582637791
+                "mu": 32.44943444745767,
+                "sigma": 11.17822477763209
             }
         ]
     },
     "scores": {
         "team_1": [
             {
-                "mu": 34.59552112325378,
-                "sigma": 6.1810840601280885
+                "mu": 30.19454401757094,
+                "sigma": 11.237778601372977
             }
         ],
         "team_2": [
             {
-                "mu": 34.94286643480509,
-                "sigma": 6.172341582637791
+                "mu": 32.44943444745767,
+                "sigma": 11.17822477763209
             },
             {
-                "mu": 34.94286643480509,
-                "sigma": 6.172341582637791
+                "mu": 32.44943444745767,
+                "sigma": 11.17822477763209
             }
         ]
     },
     "limit_sigma": {
         "team_1": [
             {
-                "mu": 36.98817598826861,
-                "sigma": 6.197577454406944
+                "mu": 35.008962716922355,
+                "sigma": 11.322612945836939
             }
         ],
         "team_2": [
             {
-                "mu": 36.802978703338965,
-                "sigma": 6.18044438287098
+                "mu": 34.774820565754936,
+                "sigma": 11.291328826858104
             },
             {
-                "mu": 36.802978703338965,
-                "sigma": 6.18044438287098
+                "mu": 34.774820565754936,
+                "sigma": 11.291328826858104
             }
         ],
         "team_3": [
             {
-                "mu": 30.516426645480728,
-                "sigma": 6.168460776023396
+                "mu": 24.182184414865624,
+                "sigma": 11.192736898569162
             },
             {
-                "mu": 30.516426645480728,
-                "sigma": 6.168460776023396
+                "mu": 24.182184414865624,
+                "sigma": 11.192736898569162
             },
             {
-                "mu": 30.516426645480728,
-                "sigma": 6.168460776023396
+                "mu": 24.182184414865624,
+                "sigma": 11.192736898569162
             }
         ]
     },
     "ties": {
         "team_1": [
             {
-                "mu": 35.88068061230261,
-                "sigma": 6.199990584127615
+                "mu": 33.21874815457553,
+                "sigma": 11.354896725884002
             }
         ],
         "team_2": [
             {
-                "mu": 34.515905909487216,
-                "sigma": 6.18044438287098
+                "mu": 30.27713112192334,
+                "sigma": 11.291328826858104
             },
             {
-                "mu": 34.515905909487216,
-                "sigma": 6.18044438287098
+                "mu": 30.27713112192334,
+                "sigma": 11.291328826858104
             }
         ],
         "team_3": [
             {
-                "mu": 33.91099481529849,
-                "sigma": 6.172659556888684
+                "mu": 30.470088421044046,
+                "sigma": 11.249240904583088
             },
             {
-                "mu": 33.91099481529849,
-                "sigma": 6.172659556888684
+                "mu": 30.470088421044046,
+                "sigma": 11.249240904583088
             },
             {
-                "mu": 33.91099481529849,
-                "sigma": 6.172659556888684
+                "mu": 30.470088421044046,
+                "sigma": 11.249240904583088
             }
         ]
     }
diff --git a/tests/models/data/thurstonemostellerfull.json b/tests/models/data/thurstonemostellerfull.json
index db1cd90..a7bffa4 100644
--- a/tests/models/data/thurstonemostellerfull.json
+++ b/tests/models/data/thurstonemostellerfull.json
@@ -1,123 +1,123 @@
 {
     "model": {
-        "mu": 45.80576023612373,
-        "sigma": 10.119814840999156
+        "mu": 35.57651902477546,
+        "sigma": 8.156812640776703
     },
     "normal": {
         "team_1": [
             {
-                "mu": 61.32295448667373,
-                "sigma": 9.334981415942869
+                "mu": 47.15222313993581,
+                "sigma": 7.5795052534375085
             }
         ],
         "team_2": [
             {
-                "mu": 30.288565985573733,
-                "sigma": 8.989686764502482
+                "mu": 24.0008149096151,
+                "sigma": 7.326869763507038
             },
             {
-                "mu": 30.288565985573733,
-                "sigma": 8.989686764502482
+                "mu": 24.0008149096151,
+                "sigma": 7.326869763507038
             }
         ]
     },
     "ranks": {
         "team_1": [
             {
-                "mu": 45.70227321717305,
-                "sigma": 10.081409510764281
+                "mu": 35.458850994184225,
+                "sigma": 8.117867387952899
             }
         ],
         "team_2": [
             {
-                "mu": 45.90924725507441,
-                "sigma": 10.065315692461603
+                "mu": 35.69418705536669,
+                "sigma": 8.10150337728452
             },
             {
-                "mu": 45.90924725507441,
-                "sigma": 10.065315692461603
+                "mu": 35.69418705536669,
+                "sigma": 8.10150337728452
             }
         ]
     },
     "scores": {
         "team_1": [
             {
-                "mu": 45.70227321717305,
-                "sigma": 10.081409510764281
+                "mu": 35.458850994184225,
+                "sigma": 8.117867387952899
             }
         ],
         "team_2": [
             {
-                "mu": 45.90924725507441,
-                "sigma": 10.065315692461603
+                "mu": 35.69418705536669,
+                "sigma": 8.10150337728452
             },
             {
-                "mu": 45.90924725507441,
-                "sigma": 10.065315692461603
+                "mu": 35.69418705536669,
+                "sigma": 8.10150337728452
             }
         ]
     },
     "limit_sigma": {
         "team_1": [
             {
-                "mu": 67.8382439021007,
-                "sigma": 9.527236687971314
+                "mu": 52.04189256271772,
+                "sigma": 7.70002104227257
             }
         ],
         "team_2": [
             {
-                "mu": 56.14412057619168,
-                "sigma": 9.536278276265291
+                "mu": 43.492001748842696,
+                "sigma": 7.6990822049176
             },
             {
-                "mu": 56.14412057619168,
-                "sigma": 9.536278276265291
+                "mu": 43.492001748842696,
+                "sigma": 7.6990822049176
             }
         ],
         "team_3": [
             {
-                "mu": 13.434916230078812,
-                "sigma": 8.419949795487625
+                "mu": 11.195662762765956,
+                "sigma": 6.87787110012144
             },
             {
-                "mu": 13.434916230078812,
-                "sigma": 8.419949795487625
+                "mu": 11.195662762765956,
+                "sigma": 6.87787110012144
             },
             {
-                "mu": 13.434916230078812,
-                "sigma": 8.419949795487625
+                "mu": 11.195662762765956,
+                "sigma": 6.87787110012144
             }
         ]
     },
     "ties": {
         "team_1": [
             {
-                "mu": 82.43631534304387,
-                "sigma": 8.706944769860177
+                "mu": 62.88768557900054,
+                "sigma": 7.108379880506001
             }
         ],
         "team_2": [
             {
-                "mu": 30.02543143660279,
-                "sigma": 8.91012758629402
+                "mu": 23.745309933957923,
+                "sigma": 7.256239130199337
             },
             {
-                "mu": 30.02543143660279,
-                "sigma": 8.91012758629402
+                "mu": 23.745309933957923,
+                "sigma": 7.256239130199337
             }
         ],
         "team_3": [
             {
-                "mu": 24.955533928724524,
-                "sigma": 9.002643646004634
+                "mu": 20.096561561367913,
+                "sigma": 7.3002414923037975
             },
             {
-                "mu": 24.955533928724524,
-                "sigma": 9.002643646004634
+                "mu": 20.096561561367913,
+                "sigma": 7.3002414923037975
             },
             {
-                "mu": 24.955533928724524,
-                "sigma": 9.002643646004634
+                "mu": 20.096561561367913,
+                "sigma": 7.3002414923037975
             }
         ]
     }
diff --git a/tests/models/data/thurstonemostellerpart.json b/tests/models/data/thurstonemostellerpart.json
index ba018fe..3bd9578 100644
--- a/tests/models/data/thurstonemostellerpart.json
+++ b/tests/models/data/thurstonemostellerpart.json
@@ -1,123 +1,123 @@
 {
     "model": {
-        "mu": 17.712411553528373,
-        "sigma": 4.0516555328540695
+        "mu": 22.177612349590575,
+        "sigma": 11.187832724040407
     },
     "normal": {
         "team_1": [
             {
-                "mu": 19.05482890639545,
-                "sigma": 4.035022659165134
+                "mu": 25.81146210015194,
+                "sigma": 11.100692300903118
             }
         ],
         "team_2": [
             {
-                "mu": 16.369994200661296,
-                "sigma": 4.027755914554947
+                "mu": 18.54376259902921,
+                "sigma": 11.064266557117664
             },
             {
-                "mu": 16.369994200661296,
-                "sigma": 4.027755914554947
+                "mu": 18.54376259902921,
+                "sigma": 11.064266557117664
             }
         ]
     },
     "ranks": {
         "team_1": [
             {
-                "mu": 17.44340623089713,
-                "sigma": 4.044176299828259
+                "mu": 20.678709339425158,
+                "sigma": 11.128957601994994
             }
         ],
         "team_2": [
             {
-                "mu": 17.981416876159617,
-                "sigma": 4.04071832425657
+                "mu": 23.676515359755992,
+                "sigma": 11.104349781474195
             },
             {
-                "mu": 17.981416876159617,
-                "sigma": 4.04071832425657
+                "mu": 23.676515359755992,
+                "sigma": 11.104349781474195
             }
         ]
     },
     "scores": {
         "team_1": [
             {
-                "mu": 17.44340623089713,
-                "sigma": 4.044176299828259
+                "mu": 20.678709339425158,
+                "sigma": 11.128957601994994
             }
         ],
         "team_2": [
             {
-                "mu": 17.981416876159617,
-                "sigma": 4.04071832425657
+                "mu": 23.676515359755992,
+                "sigma": 11.104349781474195
             },
             {
-                "mu": 17.981416876159617,
-                "sigma": 4.04071832425657
+                "mu": 23.676515359755992,
+                "sigma": 11.104349781474195
             }
         ]
     },
     "limit_sigma": {
         "team_1": [
             {
-                "mu": 19.22084021482846,
-                "sigma": 4.0295313748931525
+                "mu": 24.714188074647936,
+                "sigma": 11.065525094152306
             }
         ],
         "team_2": [
             {
-                "mu": 17.981416876159617,
-                "sigma": 4.04071832425657
+                "mu": 23.676515359755992,
+                "sigma": 11.104349781474195
             },
             {
-                "mu": 17.981416876159617,
-                "sigma": 4.04071832425657
+                "mu": 23.676515359755992,
+                "sigma": 11.104349781474195
             }
         ],
         "team_3": [
             {
-                "mu": 15.934977569597041,
-                "sigma": 4.027165419760776
+                "mu": 18.142133614367797,
+                "sigma": 11.078631451385885
             },
             {
-                "mu": 15.934977569597041,
-                "sigma": 4.027165419760776
+                "mu": 18.142133614367797,
+                "sigma": 11.078631451385885
             },
             {
-                "mu": 15.934977569597041,
-                "sigma": 4.027165419760776
+                "mu": 18.142133614367797,
+                "sigma": 11.078631451385885
             }
         ]
     },
     "ties": {
         "team_1": [
             {
-                "mu": 19.16085795643484,
-                "sigma": 4.035725121124812
+                "mu": 24.77002969633752,
+                "sigma": 11.108818051494769
             }
         ],
         "team_2": [
             {
-                "mu": 17.43944206383774,
-                "sigma": 4.044509996311233
+                "mu": 20.850421823779325,
+                "sigma": 11.144648253090196
             },
             {
-                "mu": 17.43944206383774,
-                "sigma": 4.044509996311233
+                "mu": 20.850421823779325,
+                "sigma": 11.144648253090196
             }
         ],
         "team_3": [
             {
-                "mu": 16.53693464031254,
-                "sigma": 4.01351730328268
+                "mu": 20.91238552865488,
+                "sigma": 10.996426052460139
             },
             {
-                "mu": 16.53693464031254,
-                "sigma": 4.01351730328268
+                "mu": 20.91238552865488,
+                "sigma": 10.996426052460139
             },
             {
-                "mu": 16.53693464031254,
-                "sigma": 4.01351730328268
+                "mu": 20.91238552865488,
+                "sigma": 10.996426052460139
             }
         ]
     }
diff --git a/tests/models/generate.py b/tests/models/generate.py
index 8e49549..539c806 100644
--- a/tests/models/generate.py
+++ b/tests/models/generate.py
@@ -1,6 +1,7 @@
 """
 CLI utility to generate expected test data for the Weng-Lin models.
 """
+
 import json
 import pathlib
 from statistics import NormalDist
diff --git a/tests/models/test_common.py b/tests/models/test_common.py
index 706f2ec..8fdb4eb 100644
--- a/tests/models/test_common.py
+++ b/tests/models/test_common.py
@@ -1,6 +1,7 @@
 """
 Tests common for all models.
 """
+
 from openskill.models import MODELS
 from openskill.models.common import (
     _arg_sort,
diff --git a/tests/models/weng_lin/test_bradley_terry_full.py b/tests/models/weng_lin/test_bradley_terry_full.py
index ef36015..e289612 100644
--- a/tests/models/weng_lin/test_bradley_terry_full.py
+++ b/tests/models/weng_lin/test_bradley_terry_full.py
@@ -1,6 +1,7 @@
 """
 All tests for the BradleyTerryFull model are located here.
 """
+
 import json
 import pathlib
 from typing import List
@@ -477,10 +478,10 @@ def test_predict_draw():
     team_2 = [b1, b2]
 
     probability = model.predict_draw(teams=[team_1, team_2])
-    assert probability == pytest.approx(0.2355271, 0.0001)
+    assert probability == pytest.approx(0.3839934, 0.0001)
 
     probability = model.predict_draw(teams=[team_1, team_2, [a1], [a2], [b1]])
-    assert probability == pytest.approx(0.1144874, 0.0001)
+    assert probability == pytest.approx(0.0535105, 0.0001)
 
     probability = model.predict_draw(teams=[[b1], [b1]])
     assert probability == pytest.approx(1)
diff --git a/tests/models/weng_lin/test_bradley_terry_part.py b/tests/models/weng_lin/test_bradley_terry_part.py
index 50c3757..f3b5d4f 100644
--- a/tests/models/weng_lin/test_bradley_terry_part.py
+++ b/tests/models/weng_lin/test_bradley_terry_part.py
@@ -1,6 +1,7 @@
 """
 All tests for the BradleyTerryPart model are located here.
 """
+
 import json
 import pathlib
 from typing import List
@@ -480,10 +481,10 @@ def test_predict_draw():
     team_2 = [b1, b2]
 
     probability = model.predict_draw(teams=[team_1, team_2])
-    assert probability == pytest.approx(0.2355271, 0.0001)
+    assert probability == pytest.approx(0.3839934, 0.0001)
 
     probability = model.predict_draw(teams=[team_1, team_2, [a1], [a2], [b1]])
-    assert probability == pytest.approx(0.1144874, 0.0001)
+    assert probability == pytest.approx(0.0535105, 0.0001)
 
     probability = model.predict_draw(teams=[[b1], [b1]])
     assert probability == pytest.approx(1)
diff --git a/tests/models/weng_lin/test_common.py b/tests/models/weng_lin/test_common.py
index dffbcc7..49968eb 100644
--- a/tests/models/weng_lin/test_common.py
+++ b/tests/models/weng_lin/test_common.py
@@ -1,6 +1,7 @@
 """
 All tests common for Weng-Lin models are located here.
 """
+
 import random
 from typing import Any, List
 
diff --git a/tests/models/weng_lin/test_plackett_luce.py b/tests/models/weng_lin/test_plackett_luce.py
index 89666b4..2079add 100644
--- a/tests/models/weng_lin/test_plackett_luce.py
+++ b/tests/models/weng_lin/test_plackett_luce.py
@@ -1,6 +1,7 @@
 """
 All tests for the PlackettLuce model are located here.
 """
+
 import json
 import pathlib
 from typing import List
@@ -475,10 +476,10 @@ def test_predict_draw():
     team_2 = [b1, b2]
 
     probability = model.predict_draw(teams=[team_1, team_2])
-    assert probability == pytest.approx(0.2355271, 0.0001)
+    assert probability == pytest.approx(0.3839934, 0.0001)
 
     probability = model.predict_draw(teams=[team_1, team_2, [a1], [a2], [b1]])
-    assert probability == pytest.approx(0.1144874, 0.0001)
+    assert probability == pytest.approx(0.0535105, 0.0001)
 
     probability = model.predict_draw(teams=[[b1], [b1]])
     assert probability == pytest.approx(1)
diff --git a/tests/models/weng_lin/test_thurstone_mosteller_full.py b/tests/models/weng_lin/test_thurstone_mosteller_full.py
index 5d91a4f..2435846 100644
--- a/tests/models/weng_lin/test_thurstone_mosteller_full.py
+++ b/tests/models/weng_lin/test_thurstone_mosteller_full.py
@@ -1,6 +1,7 @@
 """
 All tests for the ThurstoneMostellerFull model are located here.
 """
+
 import json
 import pathlib
 from typing import List
@@ -484,10 +485,10 @@ def test_predict_draw():
     team_2 = [b1, b2]
 
     probability = model.predict_draw(teams=[team_1, team_2])
-    assert probability == pytest.approx(0.2355271, 0.0001)
+    assert probability == pytest.approx(0.3839934, 0.0001)
 
     probability = model.predict_draw(teams=[team_1, team_2, [a1], [a2], [b1]])
-    assert probability == pytest.approx(0.1144874, 0.0001)
+    assert probability == pytest.approx(0.0535105, 0.0001)
 
     probability = model.predict_draw(teams=[[b1], [b1]])
     assert probability == pytest.approx(1)
diff --git a/tests/models/weng_lin/test_thurstone_mosteller_part.py b/tests/models/weng_lin/test_thurstone_mosteller_part.py
index 714c3b8..dd01d86 100644
--- a/tests/models/weng_lin/test_thurstone_mosteller_part.py
+++ b/tests/models/weng_lin/test_thurstone_mosteller_part.py
@@ -1,6 +1,7 @@
 """
 All tests for the ThurstoneMostellerPart model are located here.
 """
+
 import json
 import pathlib
 from typing import List
@@ -488,10 +489,10 @@ def test_predict_draw():
     team_2 = [b1, b2]
 
     probability = model.predict_draw(teams=[team_1, team_2])
-    assert probability == pytest.approx(0.2355271, 0.0001)
+    assert probability == pytest.approx(0.3839934, 0.0001)
 
     probability = model.predict_draw(teams=[team_1, team_2, [a1], [a2], [b1]])
-    assert probability == pytest.approx(0.1144874, 0.0001)
+    assert probability == pytest.approx(0.0535105, 0.0001)
 
     probability = model.predict_draw(teams=[[b1], [b1]])
     assert probability == pytest.approx(1)