In the wake of the Pac-12

Getting back to the actual MCC code after a long absence, I realized I had this sad localmod on my box:

$ git diff virtualconf.py
diff --git a/vconf/virtualconf.py b/vconf/virtualconf.py
index 9eb2314..92c5946 100644
--- a/vconf/virtualconf.py
+++ b/vconf/virtualconf.py
@@ -438,6 +438,7 @@ def find_possibilities(time_sorted_games):

 def monte_carlo_simulation(time_sorted_games, predictor):
     scoreboard = PossibilityScoreboard("Monte Carlo [" + str(predictor) + "]")
+    second_scoreboard = PossibilityScoreboard("2nd place [" + str(predictor) + "]")
     for run_id in range(0, 10000):
         # make a clean copy of the games
         local_games_copy = []
@@ -456,9 +457,12 @@ def monte_carlo_simulation(time_sorted_games, predictor):
         if (check_minimum_wins(ordered_standings, [])):
             if (break_ties(ordered_standings, local_games_copy, [])):
                 scoreboard.record_winner(ordered_standings[0].team_name)
+                second_scoreboard.record_winner(ordered_standings[1].team_name)
                 continue
         scoreboard.record_no_winner()
+        second_scoreboard.record_winner(ordered_standings[1].team_name)
     print(str(scoreboard))
+    print(str(second_scoreboard))

 def find_coach(configuration, team_name, year):
     api_instance = cfbd.CoachesApi(cfbd.ApiClient(configuration))

Keeping a “second scoreboard” is something I never fully committed to the actual codebase because it has one narrow use: tracking seconds in the full Pac-12 sim helps see what the potential Pac-12 championship game could be.

Those days are now gone forever. Out with the old. Are we getting rid of this code too?


actual_pac_12 = {25: 'California',
                 24: 'Stanford',
                 26: 'UCLA', 30: 'USC',
                 12: 'Arizona',
                 9: 'Arizona State',
                 38: 'Colorado',
                 2483: 'Oregon',
                 204: 'Oregon State',
                 254: 'Utah',
                 264: 'Washington',
                 265: 'Washington State'
                 }

preset_confs = { 'CALIFORNIA': all_ca_teams,
                 'TEXAS' : all_tx_teams,
                 'PAC_12' : actual_pac_12,
                 }

Never in life! virtualconf.py was designed for the “mythical” California conference. I added the actual Pac-12 later since the Monte Carlo code became fairly useful. But now that the Pac-12 has ascended to Olympus and resides purely in the mythical realm it’s even more appropriate. What has been undefined by Fox and ESPN can remain defined in code.

Can we crown a Pac-12 champion in 2024?

$ MCC_CONFERENCE=PAC_12 python ./mcc_schedule.py -v

Oregon at Oregon State on Sep 14, 2024
Washington State at Washington on Sep 14, 2024
Oregon at UCLA on Sep 27, 2024
Arizona at Utah on Sep 27, 2024
Utah at Arizona State on Oct 11, 2024
Colorado at Arizona on Oct 18, 2024
Oregon State at California on Oct 25, 2024
USC at Washington on Nov 01, 2024
UCLA at Washington on Nov 15, 2024
Utah at Colorado on Nov 15, 2024
Stanford at California on Nov 22, 2024
USC at UCLA on Nov 22, 2024
Washington State at Oregon State on Nov 23, 2024
Arizona State at Arizona on Nov 29, 2024
Washington at Oregon on Nov 29, 2024

Full Enumeration Simulation:
Oregon 3072 [9%]
Washington 2988 [9%]
UCLA 2688 [8%]
Oregon State 2496 [8%]
Utah 2400 [7%]
Arizona 2400 [7%]
Arizona State 1116 [3%]
Colorado 1116 [3%]
Washington State 1020 [3%]
USC 940 [3%]
California 860 [3%]
No Winner 11672 [36%]

Monte Carlo [Sampled Home Margin Predictor] Simulation:
UCLA 1137 [11%]
Oregon State 1074 [11%]
Washington 1060 [11%]
Arizona 1017 [10%]
Oregon 997 [10%]
California 894 [9%]
Utah 884 [9%]
Arizona State 779 [8%]
Colorado 723 [7%]
Washington State 581 [6%]
USC 566 [6%]
No Winner 288 [3%]

There are in fact 15 Pac-12 games coming up this fall. (Since CFB Data doesn’t have Elo rating for this year yet we are using the hack of pulling last year’s Elos.)

In the shadow of “No Winner”

While we’re at it here’s the actual MCC 2024 run:

$ python3 ./mcc_schedule.py  -v
San Diego State at California on Sep 14, 2024
San José State at Fresno State on Oct 26, 2024
Stanford at California on Nov 22, 2024
USC at UCLA on Nov 22, 2024
Stanford at San José State on Nov 29, 2024
Fresno State at UCLA on Nov 29, 2024

Full Enumeration Simulation:
San José State 9 [14%]
Fresno State 8 [12%]
Stanford 8 [12%]
California 5 [8%]
UCLA 5 [8%]
No Winner 29 [45%]

Monte Carlo [Sampled Home Margin Predictor] Simulation:
UCLA 1987 [20%]
California 1922 [19%]
Fresno State 1832 [18%]
San José State 1781 [18%]
Stanford 1404 [14%]
No Winner 1074 [11%]

Monte Carlo [Elo Predictor] Simulation:
California 3681 [37%]
San José State 2355 [24%]
Fresno State 1619 [16%]
UCLA 1348 [13%]
Stanford 58 [1%]
No Winner 939 [9%]

There are no standings, possibly because no games were completed.
2024, 6, ,

“No Winner” is a significant outcome in the Bayesian tree-walk because the pool is so shallow and our rules say you must win at least two games to qualify. With so many fewer games it becomes more possible to end up with standings that have no two-game winners.

The closer the simulations get to “real” the less likely No Winner becomes. This is roughly because of the power laws that “good teams are good and bad teams are bad” and outcomes where Stanford loses both their games are much more likely than tortured ends of the full outcome tree where an upset throws everyone into 1-win territory.

This jumped out at me:

TeamCoach years with team
Fresno State0
San Jose State0
San Diego State*0
UCLA0
Stanford1
USC*2
California7
*USC and SDSU cannot win with only 1 MCC game

There’s a lot of coaching staff transition out there. Cal might be even more of a lock than the simulation says. They play a bad team and a team with a new coach and the only teams that can really challenge also have new coaches.