*Last updated: 2019-10-30*

- What is it? What does it measures ?
- What data is needed ?
- How to calculate OPI ?
- How about an example ?
- How to calculate OPI for the winning player ?
- How to calculate OPI during an ongoing match ?
- How to display OPI ?
- How significant is an OPI value ?
- What does the number means ?
- Is OPI implemented in any scoring application ?
- What sample data for the value of OPI is available at this points ?
- How to combine multiple OPI values ?
- How is OPI modelized ? Why is it calculated this way ?
- I have implemented OPI in my scoring app. How to make sure I did it right ?
- I have questions. Who can I contact ?

The *Offensive Play Index* (OPI hereafter) is meant to be an objective measurement of the quality of a player's offensive play during a match of continuous 14.1 also known as straight pool. The measurement takes the form of a decimal value between 0.000 and 1.000, 1.000 being perfect play (never missing) and 0.000 the worst possible play (missing every shot).

OPI is deemed objective as it relies only on objective aspects of the game:

For each shot:

- Whether a player is:
- playing offensively (attempting to pocket a ball by calling it explicitely or implicitely) -or-
- playing defensively (with a safety shot or an intentional foul shot)

- For offensive shots, what the result is:
- one or more balls pocketed legally -or-
- no ball pocketed legally (on a legal shot or on a foul)

Hereafter we will use the following lingo to describe shot intents and shot results:

Shot intents:

- MAKE → Intent to pocket a ball
- SAFE → Intent to do a legal shot that doesn't pocket any ball but leaves the opponent in a difficult position
- TAKE-FOUL → Intent to do an illegal shot that will be penalized by one point but leaves the opponent in a difficult position (or cause a 3-fouls rerack penalty)

- POCKET-1 → 1 ball pocketed legally
- POCKET-2 → 2 balls pocketed legally in one shot
- POCKET-X → X balls pocketed legally in one shot
- LEGAL-NO-BALL → Legal shot but no ball pocketed legally
- FOUL → 1 point penalty regular foul
- BREAK-FOUL → 2 points penalty breaking foul

At this point it is important to notice that many of the existing straight pool scoring apps do not carry enough information to calculate OPI. For example, scoring apps using an inning-by-inning system will often ask the user to end an inning by chosing between 'miss', 'safe' or 'foul'. Altough 'miss' clearly means that the player's intent was MAKE and 'safe' clearly means the intent was SAFE, the intent for 'foul' could have been MAKE, SAFE or TAKE-FOUL. This is relevant for the calculation of OPI as only the shots where the intent is MAKE are included. All other shots are only considered as ending an offensive inning and their result is ignored.

Also, in these scoring app, at the end of an inning only the number of balls pocketed is reported, not the number of shots that was required to do so. The OPI measure ignores additional balls pocketed on a shot so the inning-by-inning way of inputing data is again inappropriate for OPI.

As mentionned before, shots where the intent is not MAKE are ignored in the calculation of OPI. So the first step in the calculation of OPI is to take all the shots played by a player in a match and strip the shots where the intent is not MAKE. Once this is done we are left with 0 or more sequences of 1 or more shots where the intent is MAKE and the result is POCKET-X except for the last shot of the sequence whose intent is MAKE but the result can be any of the results listed above. These sequence are sometimes called offensive innings or attempted scoring innings (altough they usually include the SAFE or TAKE-FOUL intent shot that ends the inning if there is one).

For each shot in each sequence, points are earned as follow:

- If the result of the shot is POCKET-X, 1/2 point is earned, no point at all is earned for this shot otherwise.
- If there is at least one more shot after in the sequence and the result of the shot right after is POCKET-X, an additional 1/3 point is earned.
- If there is at least two more shot after in the sequence and the result of the second shot right after is POCKET-X, an additional 1/6 points is earned.

The reason for the 1/2, 1/3 and 1/6 numbers are explained in the section 'How is OPI modelized ?'.

There are a few things to notice here. First, nothing is earned by pocketing more that 1 ball in a single shot. Also it makes no difference whether a sequence ends with a miss (LEGAL-NO-BALL result) or a foul (FOUL result), they are both earning no points.

To calculate OPI, the points earned for all shots in all sequences are summed and this is then divided by the total number of shots in all sequences. Since the maximum of points that can be earned for a shot is 1.0, this will yield a number between 0.0 and 1.0. The value of OPI is that number squared which will give another number between 0.0 and 1.0 that will be smaller (or equal for 0.0 and 1.0).

The reason for squaring the value is explained in the section 'How is OPI modelized ?'.

Example:

Let's say that during a completed match, a played has 5 offensive innings (sequences) as described below:

1: POCKET-1, LEGAL_NO_BALL,

2: POCKET-1, POCKET-2, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, FOUL

3: LEGAL_NO_BALL

4: POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-1, POCKET-3

5: FOUL

As explained before, the intent of all these shots is MAKE.

*On the first inning*, the player pockets one ball and then misses. 2 shots total.

This will earn 0.5 points: (0.5 + 0.0).

Details:

The result of the first shot is POCKET-1 which earns 1/2 point (0.5). The result of the next shot is not POCKET-X so no additional point is earned for this first shot.

The result of the second shot is LEGAL_NO_BALL so no points is earned.

*On the second inning*, the player pockets 10 balls in 9 shots and then commits a foul while trying to pocket a ball. 10 shots total.

This will earn a total of 8.333 points: (1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 0.833 + 0.500 + 0.0)

Details:

The result of the first 7 shots is POCKET-1 or POCKET-2 which earns 1/2 point (0.5). For each of these 7 shots there are 2 POCKET-X result shot right after which earns 1/3 point (0.333) and 1/6 point (0.166) respectively for a total of 1.0 point for each shot.

The result of the 8th shot is POCKET-1 which earns 1/2 point (0.5). The result of the shot right after is POCKET-1 which earns 1/3 point (0.333) but the result of the second shot after is not POCKET-X so 1/6 point (0.166) is NOT earned in this case, for a total of 0.833.

The result of the 9th shot is POCKET-1 which earns 1/2 point (0.5). The result of the next shot is not POCKET-X and there is no second next shot in the inning, so 1/3 points and 1/6 point are NOT earned, for a total of 0.5 points.

The result of the 10th shot is FOUL which earns 0.0 point.

*On the third inning*, the player misses right away. 1 shot total.

This will earned 0.0 points.

*On the fourth inning*, the player pockets 16 balls in 14 shots. After, the inning ends on a SAFE or TAKE-FOUL intent shot which, as explained before, is ignored and not included in the inning. 14 shots total.

This will earn a total of 13.333 points: (1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 0.833 + 0.500)

Notice the difference between this inning and the second inning. The second inning ended on an offensive shot (MAKE intent) that earned no point while the fourth inning ends on a successful offensive shot (because what really ended the inning is a SAFE or TAKE-FOUL intent shot which are not included in the inning). This shows the value of OPI will be less affected if a player ends the inning on a defensive shot (which is not included in the calculation) instead of ending the inning on a failed offensive shot which is included in the calculation and earned no points.

*On the fifth inning*, the player commits a foul right away. 1 shot total.

This will earned 0.0 points.

The OPI of the player for this completed match will be:

OPI = ((0.5 + 8.333 + 0.0 + 13.333 + 0.0) / (2 + 10 + 1 + 14 + 1)) ^{2} = (22.166 / 28) ^{2} = 0.62673611

In the previous section, the player in the example obviously lost the match since the last inning ends with a foul. Now when a player wins a match, the last shot in the last inning will have result POCKET-X and earns only 0.5 points as there is no shot after and no second shot after. This is problematic because, had the match not be over, the player might have pocketed the next 2 balls and this will negatively impact the value of OPI. Also, it makes OPI=1.0 impossible because at least 4/6 point (1/6 on second last shot, 1/3 + 1/6 on last shot) cannot be earned even if the player runs out in one inning.

To fix this, in the last inning of the winning player, the additional points for the last shot (1/3 point and 1/6 point) and the additional points for the second last shot (1/6 point) (if it is in this same, last inning of the match), for shots that will NOT BE PLAYED because the match has ended, will be given anyway. This will elegantly make the result OPI=1.000 possible and will prevent the value of OPI for the player that wins to be negatively affected by the match ending.

The value of OPI for an ongoing match is calculated the same way as for a completed match, with the exception of the ongoing offensive inning if there is one. The additional points for the last played shot (1/3 point + 1/6 point) and the additional points for the second last played shot (1/6 point) (if it is in this same, ongoing inning of the match), for shots that have NOT BEEN PLAYED YET, will temporarily be given anyway. This will elegantly make the value of OPI equal to 1.000 at the beginning of the match, until the first offensive inning ends.

OPI should be displayed as a decimal value rounded to 3 digits after the period. Examples: 1.000, 0.995, 0.655, 0.300, 0.050, 0.000. Before the first offensive shot has been played, no points have been earned over 0 shots so the value of OPI will be:

OPI = (0 / 0) ^{2}

This is a division by zero, an illegal arithmetic operation. This result should NOT be displayed as 0.000. It should be displayed with something like 'N/A', 'NaN' or '-' to express the fact that the value of OPI doesn't exist yet.

The significance of the value of OPI is strongly dependant on the number of offensive shots played. At the beginning of a match, the value of OPI can vary widly between 0.000 and 1.000 and will often not be a good representation of a player's overall skill level. For this reason is the better to show the value of OPI together with the number of offensive shots used to calculate it. That way the significance of the OPI value can be estimated at first sight.

This is best acheived by showing the number of offensive shots between brackets next to the value of OPI. In the first example above, the player had an OPI of 0.62673611 over 28 offensive shots. This would be displayed as '0.627 [28]'. A non-existing OPI value can be displayed as 'N/A [0]', 'NaN [0]' or '- [0]'.

As explain before the significance of the value of OPI depends enormously on the number of offensive shots used to calculate the value. Values calculated from less than 10 offensive shots should be considered outright meaningless.

Now assuming that a player is in fact at a skill level of OPI=0.745, basic statistical analysis can tell us this:

To obtain a measure within a confidence interval of ±10%, 19 out of 20 times, a sample size of 96 is needed. This means if we evaluate the player's performance in a match with 96 offensive shots, we should get a value between 0.671 and 0.819, 19 out of 20 times.

To obtain a measure within a confidence interval of ±7%, 19 out of 20 times, a sample size of 196 is needed. This means if we evaluate the player's performance in a match with 196 offensive shots, we should get a value between 0.693 and 0.789, 19 out of 20 times.

So even with a long 200 points match, the *statistical* margin of error will still around ±7%, 19 times out of 20 for the winning player. Fortunately, the OPI values of many matches involving the same player can easily be combined with little or no distortion to obtain a more significant value. See the How to combine multiple OPI values ? section below.

OPI being a young concept, little data is available yet. But good amateurs will typically score between 0.500 and 0.750 and professionals between 0.750 and 1.000. However, over 100 offensive shots of more, only top professionals can hope to score better than 0.900 on a regular basis.

For the time being, the following breakdown seem reasonable for putting a word on a match performance using the value of OPI:

- 0.000 to 0.200: Beginner
- 0.200 to 0.500: Amateur
- 0.500 to 0.750: Good amateur
- 0.750 to 0.900: Pro
- 0.900 to 1.000: Top pro

As of October 2019, OPI is fully implement in:

- the Fourteen-One Engine scoreboard software. This software is used on a semi-regular basis at Amsterdam Billiards in New York city, NY, USA during the live streaming of matches involving pro and amateur league players. It has also been used during live streaming of matches at Bayshore Billiards in Bayshore, NY, USA and at The Spot in Nanuet, NY, USA. It was used to obtain stats on recorded matches available online, like the final and semi-finals matches of the American 14.1 Straigh Pool Championship 2018. Finally it was the scoring system used by BSN for all streamed matches throughout the American 14.1 Straigh Pool Championship 2019. In this software, the value of OPI is displayed at the top of the statistics board showing in-between racks.

The following table contains 54 OPI values for 27 matches involving 28 known and lesser known pros and amateurs. The value of OPI is believed to correct with respect to the current specifications.

Appleton, Darren | 1.000 [197]^{ 22} |

Batista, Bernardo | 0.457 [52]^{ 1} |

Bustamante, Francisco | 0.063 [2]^{ 22} |

Chinakhov, Ruslan | 0.978 [149]^{ 25}, 0.992 [172]^{ 27} |

Daquaro, Tom | 0.563 [126]^{ 2} |

Duddy, Emily | 0.479 [39]^{ 3} |

Dufresne, Pascal | 0.804 [132]^{ 3} |

Eberle, Max | 0.710 [36]^{ 28} |

Edmonds, Tim | 0.497 [35]^{ 4}, 0.625 [105]^{ 5} |

Hohmann, Thorsten | 0.894 [171]^{ 6}, 0.925 [156]^{ 7} |

Immonen, Mika | 0.925 [130]^{ 28} |

Jimmy, Jimmy | 0.506 [119]^{ 8} |

Juszczyszyn, Konrad | 0.820 [81]^{ 7} |

Kaçi, Eklent | 0.928 [155]^{ 9}, 0.930 [205]^{ 6} |

Kelly, Chris | 0.423 [51]^{ 10} |

Kunz, Eddie | 0.535 [121]^{ 2} |

Kudlik, Marek | 0.892 [114]^{ 9} |

Leon, Jim | 0.397 [69]^{ 11} |

Lipsky, Steve | 0.757 [163]^{ 12}, 0.758 [138]^{ 5}, 0.853 [187]^{ 13}, 0.872 [148]^{ 14}, 0.850 [158]^{ 24} |

Luna, Carlos | 0.730 [112]^{ 23}, 0.687 [72]^{ 24} |

McGovern, Daniel | 0.631 [85]^{ 15} |

Morgan, Sean | 0.752 [167]^{ 10}, 0.696 [164]^{ 11}, 0.682 [114]^{ 12}, 0.831 [158]^{ 16} |

Ouschan, Albin | 0.739 [19]^{ 25} |

Pagulayan, Alex | 0.912 [152]^{ 26}, 0.000 [1]^{ 27} |

Robles, Tony | 0.703 [99]^{ 13}, 0.882 [156]^{ 17}, 0.869 [155]^{ 18}, 0.855 [128]^{ 14}, 0.891 [157]^{ 4}, 0.869 [157]^{ 19}, 0.744 [115]^{ 23} |

Sim, Del | 0.721 [172]^{ 21}, 0.766 [92]^{ 20}, 0.826 [108]^{ 17}, 0.809 [146]^{ 18} |

Soriano, Lou | 0.547 [112]^{ 21} |

Warnock, Stewart | 0.665 [193]^{ 8} |

Zvi, Zion | 0.836 [161]^{ 20}, 0.760 [100]^{ 19}, 0.816 [157]^{ 1}, 0.805 [165]^{ 15}, 0.764 [118]^{ 16} |

[1] Zion Zvi vs Bernardo Batista - 2019.07.22 [stats and log]

[2] Eddie Kunz vs Tom Daquaro - 2019.02.19 [stats and log]

[3] Emily Duddy vs Pascal Dufresne - 2019.06.10 [stats and log]

[4] Tony Robles vs Tim Edmonds - 2019.01.21 [stats and log]

[5] Steve Lipsky vs Tim Edmonds - 2019.01.19 [stats and log]

[6] Thorsten Hohmann vs Eklent Kaçi - 2018.10.19 [stats and log]

[7] Thorsten Hohmann vs Konrad Juszczyszyn - 2018.10.19 [stats and log]

[8] Stewart Warnock vs Jimmy Jimmy - 2019.03.13 [stats and log]

[9] Marek Kudlik vs Eklent Kaçi - 2018.10.19 [stats and log]

[10] Sean Morgan vs Chris Kelly - 2019.08.19 [stats and log]

[11] Sean Morgan vs Jim Leon - 2019.03.26 [stats and log]

[12] Steve Lipsky vs Sean Morgan - 2019.06.17 [stats and log]

[13] Steve Lipsky vs Tony Robles - 2019.04.30 [stats and log]

[14] Tony Robles vs Steve Lipsky - 2019.08.26 [stats and log]

[15] Zion Zvi vs Daniel McGovern - 2019.06.24 [stats and log]

[16] Zion Zvi vs Sean Morgan - 2019.08.26 [stats and log]

[17] Tony Robles vs Del Sim - 2019.07.01 [stats and log]

[18] Tony Robles vs Del Sim - 2019.09.09 [stats and log]

[19] Tony Robles vs Zion Zvi - 2019.07.29 [stats and log]

[20] Del Sim vs Zion Zvi - 2019.08.12 [stats and log]

[21] Del Sim vs Lou Soriano - 2019.06.10 [stats and log]

[22] Darren Appleton vs Fransisco Bustamante - 2013.08.24

[23] Tony Robles vs Carlos Luna - 2019.09.23 [stats and log]

[24] Steve Lipsky vs Carlos Luna - 2019.09.25 [stats and log]

[25] Ruslan Chinakhov vs Albin Ouschan - 2019.10.26 [stats and log]

[26] Alex Pagulayan vs Marco Teutscher - 2019.10.26 [stats and log]

[27] Ruslan Chinakhov vs Alex Pagulayan - 2019.10.26 [stats and log]

[28] Mika Immonen vs Max Eberle - 2019.10.23 [stats and log]

[2] Eddie Kunz vs Tom Daquaro - 2019.02.19 [stats and log]

[3] Emily Duddy vs Pascal Dufresne - 2019.06.10 [stats and log]

[4] Tony Robles vs Tim Edmonds - 2019.01.21 [stats and log]

[5] Steve Lipsky vs Tim Edmonds - 2019.01.19 [stats and log]

[6] Thorsten Hohmann vs Eklent Kaçi - 2018.10.19 [stats and log]

[7] Thorsten Hohmann vs Konrad Juszczyszyn - 2018.10.19 [stats and log]

[8] Stewart Warnock vs Jimmy Jimmy - 2019.03.13 [stats and log]

[9] Marek Kudlik vs Eklent Kaçi - 2018.10.19 [stats and log]

[10] Sean Morgan vs Chris Kelly - 2019.08.19 [stats and log]

[11] Sean Morgan vs Jim Leon - 2019.03.26 [stats and log]

[12] Steve Lipsky vs Sean Morgan - 2019.06.17 [stats and log]

[13] Steve Lipsky vs Tony Robles - 2019.04.30 [stats and log]

[14] Tony Robles vs Steve Lipsky - 2019.08.26 [stats and log]

[15] Zion Zvi vs Daniel McGovern - 2019.06.24 [stats and log]

[16] Zion Zvi vs Sean Morgan - 2019.08.26 [stats and log]

[17] Tony Robles vs Del Sim - 2019.07.01 [stats and log]

[18] Tony Robles vs Del Sim - 2019.09.09 [stats and log]

[19] Tony Robles vs Zion Zvi - 2019.07.29 [stats and log]

[20] Del Sim vs Zion Zvi - 2019.08.12 [stats and log]

[21] Del Sim vs Lou Soriano - 2019.06.10 [stats and log]

[22] Darren Appleton vs Fransisco Bustamante - 2013.08.24

[23] Tony Robles vs Carlos Luna - 2019.09.23 [stats and log]

[24] Steve Lipsky vs Carlos Luna - 2019.09.25 [stats and log]

[25] Ruslan Chinakhov vs Albin Ouschan - 2019.10.26 [stats and log]

[26] Alex Pagulayan vs Marco Teutscher - 2019.10.26 [stats and log]

[27] Ruslan Chinakhov vs Alex Pagulayan - 2019.10.26 [stats and log]

[28] Mika Immonen vs Max Eberle - 2019.10.23 [stats and log]

*Coming soon ....*

*Coming soon ....*

*Coming soon ....*

For any inquiries please contact: opi@metaobjects.ca