Here is a ZIP file containing the component OPR scores.
The columns are as follows:
Team Number, Final Score, Qual, Coop, Auto, RC, Tote, Litter, DQ
South Florida (FLFO) and Lake Superior (MNDU) are missing: I’m pondering the best way to handle the surrogate team data (in the Match Results) with the Rankings data (which doesn’t have surrogate data).
Create 2 whitespace-delimited text files for each event: one for the Rankings data and one for the Qualification Match Results data.
Run an AWK script which reads the Match Results data and creates the alliances design matrix [A], the alliance scores vector **, and a vector [T] which maps the team numbers to consecutive integers. [A] is a 2MxT binary matrix (each element either 1 or 0), where M is the number of matches and T is the number of teams.
Run an AWK script which reads the Rankings data and the [T] vector, and creates a matrix [dr] whose columns correspond to the component scores and whose rows are ordered to correspond to the columns of the design matrix [A]
Run an Octave script which reads [A], **, [T], and [dr], and does the following computations:
[N]=[A[b]’**]*[A] …N will be a square symmetric positive definite TxT matrix
[x]=[N][d] … “left division” solves for [x]
sort Tx by team and by OPR
… and writes the sorted [Tx] matrices containing the components scores, sorted by team and sorted by final score OPR
Ed takes great pains to handle special cases like DQ’s and surrogates, and does so in a manner that is as consistent as possible from year to year.
I don’t have Ed’s remarkable patience and attention span, so the calculations I did don’t have special-case handling for DQ/surrogate and so they won’t agree exactly with Ed’s for events with DQ’s and/or surrogates.
Ed’s numbers are the de facto official OPR numbers for FRC, so always use them when they are available.