Let’s test the portability of the “virtual conference” API. I added a canned dictionary of Texas teams to the python executable.
Inside the API code I also added the final tiebreaker, total margin. As identified last week this was technically in the rules but never came up in the California runs so far. This code is starting to get a little stretched out. We could probably refactor the margin check for a given team into a common function that could be used by “common opponent margin” tiebreaker “total margin” tiebreaker.
So how does the code perform and are the results interesting? First let’s cherry-pick the verbose run from 1996 where we can see a test of that final tiebreaker:
North Texas 0 at Texas A&M 55 on Sep 20, 1996 Baylor 24 at Texas Tech 45 on Oct 04, 1996 UTEP 0 at TCU 18 on Oct 11, 1996 SMU 17 at Rice 35 on Oct 18, 1996 Texas Tech 13 at Texas A&M 10 on Oct 25, 1996 Rice 48 at UTEP 21 on Oct 25, 1996 Baylor 23 at Texas 28 on Nov 01, 1996 Texas 38 at Texas Tech 32 on Nov 08, 1996 SMU 30 at UTEP 0 on Nov 08, 1996 Texas A&M 24 at Baylor 7 on Nov 08, 1996 Rice 30 at TCU 17 on Nov 15, 1996 TCU 24 at SMU 27 on Nov 20, 1996 Texas A&M 15 at Texas 51 on Nov 28, 1996 looks like a tie for the cup head to head didn't resolve anything oppo check for Rice and Texas common opponent margin didn't resolve anything 1996 final standings Rice 3-0 Texas 3-0 Texas Tech 2-1 SMU 2-1 Texas A&M 2-2 TCU 1-2 North Texas 0-1 UTEP 0-3 Baylor 0-3 1996, 13, Rice, 3-0
Rice was good? Rice beat TCU? This was actually the start of a three-game win streak Rice put together against TCU in the 90s. This season exemplifies a problem in the Texas dataset in that the lower tier teams don’t cross-schedule the top teams as much as in California. Rice and Texas both managed to go 3-0 with no common opponents. Rice’s total margin was 58 and Texas managed 47, so the win goes to Rice. 1996 Texas was a good team that ended up ranked 23 and upset Nebraska in the Big 12 Championship, but for a Texas-only cup I don’t see this result as too terrible.
Here’s a run from 1970 on with just results:
1970, 21, Texas, 6-0 1971, 22, Texas, 6-0 1972, 22, Texas, 6-0 1973, 22, Texas, 6-0 1974, 23, Baylor, 5-1 1975, 24, Texas A&M, 6-0 1976, 30, Houston, 7-0 1977, 30, Texas, 7-0 1978, 30, Houston, 6-1 1979, 30, Texas, 6-1 1980, 32, Baylor, 7-0 1981, 30, Texas, 7-0 1982, 31, SMU, 9-0 1983, 29, Texas, 7-0 1984, 29, Houston, 6-1 1985, 29, Baylor, 6-1 1986, 28, Texas A&M, 7-0 1987, 21, Texas A&M, 5-1 1988, 21, Texas A&M, 6-0 1989, 28, Texas A&M, 6-1 1990, 28, Texas, 7-0 1991, 29, Texas A&M, 7-0 1992, 28, Texas A&M, 7-0 1993, 28, Texas A&M, 7-0 1994, 28, Texas A&M, 6-0 1995, 28, Texas, 7-0 1996, 13, Rice, 3-0 1997, 15, Texas Tech, 3-1 1998, 14, Texas Tech, 4-1 1999, 17, Texas, 3-1 2000, 18, Texas, 4-0 2001, 15, Texas, 4-0 2002, 16, Texas Tech, 4-0 2003, 16, Texas, 4-0 2004, 17, Texas, 5-0 2005, 16, Texas, 4-0 2006, 19, Houston, 3-0 2007, 21, Houston, 3-0 2008, 17, Texas Tech, 4-0 2009, 16, Texas, 4-0 2010, 19, Texas A&M, 3-0 2011, 18, Houston, 4-0 2012, 20, Rice, 3-1 2013, 21, Texas A&M, 3-0 2014, 21, Baylor, 4-0 2015, 20, TCU, 4-0 2016, 20, TCU, 3-1 2017, 19, TCU, 4-0 2018, 19, North Texas, 4-0 2019, 23, Baylor, 5-0 2020, 14, UT San Antonio, 3-0
Pretty nice. Lots of diversity, UT glory years are represented as expected, Rice actually gets another title in 2012. More A&M than I would have thought. Before going further take a look at the jaw-dropping 9-0 SMU put up in 1982. Here’s the verbose run:
North Texas 17 at Baylor 21 on Sep 03, 1982 SMU 31 at UTEP 10 on Sep 17, 1982 Baylor 24 at Texas Tech 23 on Sep 24, 1982 TCU 13 at SMU 16 on Sep 24, 1982 Texas Tech 24 at Texas A&M 15 on Oct 01, 1982 Baylor 21 at Houston 21 on Oct 01, 1982 North Texas 10 at SMU 38 on Oct 01, 1982 Texas 34 at Rice 7 on Oct 01, 1982 Rice 16 at TCU 24 on Oct 08, 1982 SMU 22 at Baylor 19 on Oct 08, 1982 Texas A&M 20 at Houston 24 on Oct 08, 1982 Baylor 23 at Texas A&M 28 on Oct 15, 1982 Houston 14 at SMU 20 on Oct 15, 1982 Texas Tech 23 at Rice 21 on Oct 15, 1982 Baylor 14 at TCU 38 on Oct 22, 1982 SMU 30 at Texas 17 on Oct 22, 1982 Rice 7 at Texas A&M 49 on Oct 22, 1982 Texas 27 at Texas Tech 0 on Oct 29, 1982 TCU 27 at Houston 31 on Oct 29, 1982 Texas A&M 9 at SMU 47 on Oct 29, 1982 Texas Tech 16 at TCU 14 on Nov 05, 1982 Houston 0 at Texas 50 on Nov 05, 1982 SMU 41 at Rice 14 on Nov 05, 1982 Texas 38 at TCU 21 on Nov 12, 1982 SMU 34 at Texas Tech 27 on Nov 12, 1982 Baylor 35 at Rice 13 on Nov 12, 1982 TCU 14 at Texas A&M 34 on Nov 19, 1982 Houston 24 at Texas Tech 7 on Nov 19, 1982 Texas 31 at Baylor 23 on Nov 19, 1982 Texas A&M 16 at Texas 53 on Nov 24, 1982 Rice 21 at Houston 28 on Nov 26, 1982 1982 final standings SMU 9-0 Texas 6-1 Houston 4-2-1 Texas Tech 3-4 Texas A&M 3-4 Baylor 3-4-1 TCU 2-5 UTEP 0-1 North Texas 0-2 Rice 0-7 1982, 31, SMU, 9-0
31 total games. SMU’s schedule is quite a document. Of their 11 regular season games 9 were against Texas teams. The other two were against neighboring state schools Tulane and Arkansas. They actually played those two teams at home, so every single one of their regular season games was in the state of Texas. And as the SWC champ they ended their season in the Cotton Bowl, seven miles from their campus. They finished ranked number two, so the all-Texas strategy worked. It used to be a more regional game. (It also helps that the old SWC was basically a Texas conference.) There are some incredible intra-California 80s schedules that we will get to later but I doubt anything like SMU’s 82 season has been equalled before or since. (Something to put on the board that we can answer with code later on.)
(Update: I should have bit my tongue and looked around the early 80s SWC a little more because there are at least three more never-left-Texas teams: 1980 and 1982 Texas as well as 1983 A&M! Although those teams did find opponents from farther away than just over the state line.)
Now the problems. The tiebreak messages still print to stderr so we can identify when the funky parts of the code are getting hit. Here’s the verbose run for 2013:
Texas Tech 41 at SMU 23 on Aug 30, 2013 Rice 31 at Texas A&M 52 on Aug 31, 2013 TCU 10 at Texas Tech 20 on Sep 12, 2013 Houston 31 at Rice 26 on Sep 21, 2013 SMU 13 at Texas A&M 42 on Sep 21, 2013 Texas State 7 at Texas Tech 33 on Sep 21, 2013 UT San Antonio 32 at UTEP 13 on Sep 21, 2013 SMU 17 at TCU 48 on Sep 28, 2013 Houston 59 at UT San Antonio 28 on Sep 28, 2013 Rice 27 at UT San Antonio 21 on Oct 12, 2013 UTEP 7 at Rice 45 on Oct 26, 2013 Texas 30 at TCU 7 on Oct 26, 2013 Rice 16 at North Texas 28 on Oct 31, 2013 UTEP 7 at Texas A&M 57 on Nov 02, 2013 UTEP 7 at North Texas 41 on Nov 09, 2013 Texas Tech 34 at Baylor 63 on Nov 16, 2013 UT San Antonio 21 at North Texas 13 on Nov 23, 2013 Texas Tech 16 at Texas 41 on Nov 28, 2013 SMU 0 at Houston 34 on Nov 29, 2013 Baylor 41 at TCU 38 on Nov 30, 2013 Texas 10 at Baylor 30 on Dec 07, 2013 looks like a tie for the cup head to head didn't resolve anything oppo check for Baylor and Texas A&M common opponent margin didn't resolve anything 2013 final standings Texas A&M 3-0 Baylor 3-0 Houston 3-0 North Texas 2-1 Texas 2-1 Texas Tech 3-2 UT San Antonio 2-2 Rice 2-3 TCU 1-3 Texas State 0-1 UTEP 0-4 SMU 0-4 2013, 21, Texas A&M, 3-0
We get into total margin tiebreak for A&M and Baylor but the problem is that Houston also went 3-0. The tiebreaker system only really works pitting one team against another. More specifically, there’s a weakness in the code in that tiebreakers only check the first two entrants in the raw ordered standings and then run through tiebreakers against them. There’s also a general weakness in the virtual conference concept in that if you collect teams that are uncorrelated eventually you can have multiple teams at the top with identical records that didn’t play in each other’s universe.
The most pragmatic solution is probably to make the code recursively check if there are more than two teams with identical standings scores at the top and then apply the tiebreakers to each dyad and attempt to arbitrate that way. There is a deeper solution, though, which is to score the resultset as being sufficiently “entangled” enough to produce a meaningful virtual conference. Imagine a torture test where you just glued together the sets of two conferences that didn’t play each other at all. There would still be virtual results from all the intra-conference play of the two conferences, but it would be isolated in two pools and no doubt identical records would often float to the top.
Our platonic ideal code would have some threshold for sanity where it could declare no winner in cases where multiple winners are not sufficiently connected enough to tiebreak between them. (But then again if gross margin is good enough to tiebreak between two teams, why not between three? Earlier I was happy enough when gross margin broke the 1996 two-way tie.)
For now, “handle more than two teams in tiebreaker” is our bug. We’ll start with the gory coding details of fully enumerating and arbitrating top-n dyads and we’ll punt the full solution down the road after the mist clears on that implementation issue.