Skip to content

Instantly share code, notes, and snippets.

View mattmazzola's full-sized avatar

Matt Mazzola mattmazzola

View GitHub Profile
@mattmazzola
mattmazzola / createPlayers.ts
Created November 23, 2020 02:23
Create Players
// Create players
const initialRating = 1000
const numPlayers = 10
const playerTiers = 5
const playerRatingRange = 6000 - initialRating
const playerSegmentSize = Math.floor(numPlayers / playerTiers)
const playerIncrementAmount = Math.floor(playerRatingRange / playerTiers)
const playerGeneration = {
total: numPlayers,
@mattmazzola
mattmazzola / createSystems.ts
Created November 23, 2020 02:21
Create rating systems
const symmetricRatingSystem = createRatingSystem()
const playerKFactor = 32
const questionKFactor = 4
const asymmetricKFactorFn: KFactorFunctionWithPlayers = (rating, playerIndex) => {
let kFactor = playerIndex === 0
? playerKFactor
: questionKFactor
if (rating > 6000) {
@mattmazzola
mattmazzola / createRatingSystem.ts
Created November 9, 2020 20:34
Create Rating System Final
export type KFactorOption =
| KFactorFunctionWithPlayers
| KFactorFunction
| number
export function createRatingSystem(kFactor: KFactorOption = 32, exponentDenominator: number = 400, exponentBase: number = 10): RatingSystem {
let resolvedKFactor: KFactorFunctionWithPlayers
if (typeof kFactor === 'number') {
@mattmazzola
mattmazzola / expectedUsage.ts
Created November 9, 2020 18:30
Expected Usage
const {
playerAProbability,
playerBProbability,
nextPlayerARating,
playerARatingDiff,
nextPlayerBRating,
playerBRatingDiff
} = rating.getNextRatings(playerARating, playerBRating, actualScore)
@mattmazzola
mattmazzola / expectedUsage.ts
Created November 9, 2020 18:28
Expected Usage
function createNextRatingsFn(
getExpectedPlayerProbabilities: ExpectedProbabilitiesFn,
getNextARating: NextRatingFn,
getNextBRating: NextRatingFn
): NextRatingsFn {
const nextRatingsFn = (playerARating: number, playerBRating: number, playerAScore: number) => {
const [expectedPlayerAProbability, expectedPlayerBProbability] = getExpectedPlayerProbabilities(playerARating, playerBRating)
const aProbability = playerAScore
const bProbability = 1 - playerAScore
@mattmazzola
mattmazzola / manualUsage.ts
Last active November 9, 2020 18:19
Manual Usage
import createRatingSystem from '@sc2/rating'
// Defaults to K 32, Scale 400, Base 10
const ratingSystem = createRatingSystem()
// get two players
const playerA = {
id: 'playerA',
rating: 1000,
}
@mattmazzola
mattmazzola / createRatingSystem.ts
Created November 9, 2020 08:15
Create Rating System
export function createRatingSystem(kFactor = 32, exponentDenominator = 400, exponentBase = 10): RatingSystem {
// Standard Elo implementation with symmetric kfactor functions for each player
// This would be a true zero-sum game where A(-x) = B(+x)
const getPlayerProbabilities = createPlayerProbabilitiesFn(exponentBase, exponentDenominator)
const getNextRating = createNextRatingFn(kFactor)
return {
getPlayerProbabilities,
getNextRating
}
@mattmazzola
mattmazzola / nextRating.ts
Created November 9, 2020 08:06
Next Rating
type NextRatingFn = (rating: number, actualPoints: number, expectedPoints: number) => [nextRating: number, ratingChange: number]
type KFactorFunction = (rating: number) => number
function createNextRatingFn(kFactor: number | KFactorFunction): NextRatingFn {
const kFactorFn: KFactorFunction = typeof kFactor === 'number'
? () => kFactor
: kFactor
return (rating: number, actualPoints: number, expectedPoints: number): [number, number] => {
const change = Math.round(kFactorFn(rating) * (actualPoints - expectedPoints))
@mattmazzola
mattmazzola / createPlayerProbabilitiesFn.ts
Created November 9, 2020 06:55
Create Player Probabilities
type ExpectedProbabilitiesFn = (playerARating: number, playerBRating: number) =>
[
playerAProbability: number,
playerBProbability: number,
ratingADifference: number,
ratingBDifference: number
]
function createPlayerProbabilitiesFn(exponentBase: number, exponentDenominator: number): ExpectedProbabilitiesFn {
const expectedPlayerProbabilityFn = createBaseExpectedPlayerProbabilityFn(exponentBase, exponentDenominator)
@mattmazzola
mattmazzola / probabilities.ts
Created November 9, 2020 06:51
Probabilities Base
function createBaseExpectedPlayerProbabilityFn(exponentBase: number, exponentDenominator: number) {
return (ratingDifference: number): number => {
const exponent = ratingDifference / exponentDenominator
return 1 / (1 + Math.pow(exponentBase, exponent))
}
}