mirror of
				https://github.com/avitex/elixir-glicko
				synced 2025-11-04 07:33:27 +00:00 
			
		
		
		
	Follow community conventions for typespecs
This commit is contained in:
		
							parent
							
								
									1a3cbb9163
								
							
						
					
					
						commit
						8cc3fd1acb
					
				@ -31,14 +31,14 @@ defmodule Glicko do
 | 
				
			|||||||
	@default_system_constant 0.8
 | 
						@default_system_constant 0.8
 | 
				
			||||||
	@default_convergence_tolerance 1.0e-7
 | 
						@default_convergence_tolerance 1.0e-7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@type new_rating_opts_t :: [system_constant: float, convergence_tolerance: float]
 | 
						@type new_rating_opts :: [system_constant: float, convergence_tolerance: float]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	Generate a new rating from an existing rating and a series (or lack) of results.
 | 
						Generate a new rating from an existing rating and a series (or lack) of results.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Returns the updated player with the same version given to the function.
 | 
						Returns the updated player with the same version given to the function.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec new_rating(player :: Player.t, results :: list(Result.t), opts :: new_rating_opts_t) :: Player.t
 | 
						@spec new_rating(player :: Player.t, results :: list(Result.t), opts :: new_rating_opts) :: Player.t
 | 
				
			||||||
	def new_rating(player, results, opts \\ [])
 | 
						def new_rating(player, results, opts \\ [])
 | 
				
			||||||
	def new_rating(player, results, opts) when tuple_size(player) == 3 do
 | 
						def new_rating(player, results, opts) when tuple_size(player) == 3 do
 | 
				
			||||||
		do_new_rating(player, results, opts)
 | 
							do_new_rating(player, results, opts)
 | 
				
			||||||
 | 
				
			|||||||
@ -41,34 +41,34 @@ defmodule Glicko.Player do
 | 
				
			|||||||
	@magic_version_scale 173.7178
 | 
						@magic_version_scale 173.7178
 | 
				
			||||||
	@magic_version_scale_rating 1500.0
 | 
						@magic_version_scale_rating 1500.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@type t :: v1_t | v2_t
 | 
						@type t :: v1 | v2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@type v1_t :: {rating_t, rating_deviation_t}
 | 
						@type v1 :: {rating, rating_deviation}
 | 
				
			||||||
	@type v2_t :: {rating_t, rating_deviation_t, volatility_t}
 | 
						@type v2 :: {rating, rating_deviation, volatility}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@type version_t :: :v1 | :v2
 | 
						@type version :: :v1 | :v2
 | 
				
			||||||
	@type rating_t :: float
 | 
						@type rating :: float
 | 
				
			||||||
	@type rating_deviation_t :: float
 | 
						@type rating_deviation :: float
 | 
				
			||||||
	@type volatility_t :: float
 | 
						@type volatility :: float
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	The recommended initial rating value for a new player.
 | 
						The recommended initial rating value for a new player.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec initial_rating(version_t) :: rating_t
 | 
						@spec initial_rating(version) :: rating
 | 
				
			||||||
	def initial_rating(_version = :v1), do: 1500.0
 | 
						def initial_rating(_version = :v1), do: 1500.0
 | 
				
			||||||
	def initial_rating(_version = :v2), do: :v1 |> initial_rating |> scale_rating_to(:v2)
 | 
						def initial_rating(_version = :v2), do: :v1 |> initial_rating |> scale_rating_to(:v2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	The recommended initial rating deviation value for a new player.
 | 
						The recommended initial rating deviation value for a new player.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec initial_rating_deviation(version_t) :: rating_deviation_t
 | 
						@spec initial_rating_deviation(version) :: rating_deviation
 | 
				
			||||||
	def initial_rating_deviation(_version = :v1), do: 350.0
 | 
						def initial_rating_deviation(_version = :v1), do: 350.0
 | 
				
			||||||
	def initial_rating_deviation(_version = :v2), do: :v1 |> initial_rating_deviation |> scale_rating_deviation_to(:v2)
 | 
						def initial_rating_deviation(_version = :v2), do: :v1 |> initial_rating_deviation |> scale_rating_deviation_to(:v2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	The recommended initial volatility value for a new player.
 | 
						The recommended initial volatility value for a new player.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec initial_volatility :: volatility_t
 | 
						@spec initial_volatility :: volatility
 | 
				
			||||||
	def initial_volatility, do: 0.06
 | 
						def initial_volatility, do: 0.06
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
@ -76,7 +76,7 @@ defmodule Glicko.Player do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	If not overriden, will use the default values for an unrated player.
 | 
						If not overriden, will use the default values for an unrated player.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec new_v1([rating: rating_t, rating_deviation: rating_deviation_t]) :: v1_t
 | 
						@spec new_v1([rating: rating, rating_deviation: rating_deviation]) :: v1
 | 
				
			||||||
	def new_v1(opts \\ []) when is_list(opts), do: {
 | 
						def new_v1(opts \\ []) when is_list(opts), do: {
 | 
				
			||||||
		Keyword.get(opts, :rating, initial_rating(:v1)),
 | 
							Keyword.get(opts, :rating, initial_rating(:v1)),
 | 
				
			||||||
		Keyword.get(opts, :rating_deviation, initial_rating_deviation(:v1)),
 | 
							Keyword.get(opts, :rating_deviation, initial_rating_deviation(:v1)),
 | 
				
			||||||
@ -87,7 +87,7 @@ defmodule Glicko.Player do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	If not overriden, will use default values for an unrated player.
 | 
						If not overriden, will use default values for an unrated player.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec new_v2([rating: rating_t, rating_deviation: rating_deviation_t, volatility: volatility_t]) :: v2_t
 | 
						@spec new_v2([rating: rating, rating_deviation: rating_deviation, volatility: volatility]) :: v2
 | 
				
			||||||
	def new_v2(opts \\ []) when is_list(opts), do: {
 | 
						def new_v2(opts \\ []) when is_list(opts), do: {
 | 
				
			||||||
		Keyword.get(opts, :rating, initial_rating(:v2)),
 | 
							Keyword.get(opts, :rating, initial_rating(:v2)),
 | 
				
			||||||
		Keyword.get(opts, :rating_deviation, initial_rating_deviation(:v2)),
 | 
							Keyword.get(opts, :rating_deviation, initial_rating_deviation(:v2)),
 | 
				
			||||||
@ -101,7 +101,7 @@ defmodule Glicko.Player do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	Note the volatility field used in a v2 player will be lost in the conversion.
 | 
						Note the volatility field used in a v2 player will be lost in the conversion.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec to_v1(player :: t) :: v1_t
 | 
						@spec to_v1(player :: t) :: v1
 | 
				
			||||||
	def to_v1({rating, rating_deviation}), do: {rating, rating_deviation}
 | 
						def to_v1({rating, rating_deviation}), do: {rating, rating_deviation}
 | 
				
			||||||
	def to_v1({rating, rating_deviation, _}), do: {
 | 
						def to_v1({rating, rating_deviation, _}), do: {
 | 
				
			||||||
		rating |> scale_rating_to(:v1),
 | 
							rating |> scale_rating_to(:v1),
 | 
				
			||||||
@ -113,7 +113,7 @@ defmodule Glicko.Player do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	A v2 player will pass-through unchanged with the volatility arg ignored.
 | 
						A v2 player will pass-through unchanged with the volatility arg ignored.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec to_v2(player :: t, volatility :: volatility_t) :: v2_t
 | 
						@spec to_v2(player :: t, volatility :: volatility) :: v2
 | 
				
			||||||
	def to_v2(player, volatility \\ initial_volatility())
 | 
						def to_v2(player, volatility \\ initial_volatility())
 | 
				
			||||||
	def to_v2({rating, rating_deviation, volatility}, _volatility), do: {rating, rating_deviation, volatility}
 | 
						def to_v2({rating, rating_deviation, volatility}, _volatility), do: {rating, rating_deviation, volatility}
 | 
				
			||||||
	def to_v2({rating, rating_deviation}, volatility), do: {
 | 
						def to_v2({rating, rating_deviation}, volatility), do: {
 | 
				
			||||||
@ -125,7 +125,7 @@ defmodule Glicko.Player do
 | 
				
			|||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	A version agnostic method for getting a player's rating.
 | 
						A version agnostic method for getting a player's rating.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec rating(player :: t, as_version :: version_t) :: rating_t
 | 
						@spec rating(player :: t, as_version :: version) :: rating
 | 
				
			||||||
	def rating(player, as_version \\ nil)
 | 
						def rating(player, as_version \\ nil)
 | 
				
			||||||
	def rating({rating, _}, nil), do: rating
 | 
						def rating({rating, _}, nil), do: rating
 | 
				
			||||||
	def rating({rating, _, _}, nil), do: rating
 | 
						def rating({rating, _, _}, nil), do: rating
 | 
				
			||||||
@ -137,7 +137,7 @@ defmodule Glicko.Player do
 | 
				
			|||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	A version agnostic method for getting a player's rating deviation.
 | 
						A version agnostic method for getting a player's rating deviation.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec rating_deviation(player :: t, as_version :: version_t) :: rating_deviation_t
 | 
						@spec rating_deviation(player :: t, as_version :: version) :: rating_deviation
 | 
				
			||||||
	def rating_deviation(player, as_version \\ nil)
 | 
						def rating_deviation(player, as_version \\ nil)
 | 
				
			||||||
	def rating_deviation({_, rating_deviation}, nil), do: rating_deviation
 | 
						def rating_deviation({_, rating_deviation}, nil), do: rating_deviation
 | 
				
			||||||
	def rating_deviation({_, rating_deviation, _}, nil), do: rating_deviation
 | 
						def rating_deviation({_, rating_deviation, _}, nil), do: rating_deviation
 | 
				
			||||||
@ -149,7 +149,7 @@ defmodule Glicko.Player do
 | 
				
			|||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	A version agnostic method for getting a player's volatility.
 | 
						A version agnostic method for getting a player's volatility.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec volatility(player :: t, default_volatility :: volatility_t) :: volatility_t
 | 
						@spec volatility(player :: t, default_volatility :: volatility) :: volatility
 | 
				
			||||||
	def volatility(player, default_volatility \\ initial_volatility())
 | 
						def volatility(player, default_volatility \\ initial_volatility())
 | 
				
			||||||
	def volatility({_, _}, default_volatility), do: default_volatility
 | 
						def volatility({_, _}, default_volatility), do: default_volatility
 | 
				
			||||||
	def volatility({_, _, volatility}, _), do: volatility
 | 
						def volatility({_, _, volatility}, _), do: volatility
 | 
				
			||||||
@ -178,14 +178,14 @@ defmodule Glicko.Player do
 | 
				
			|||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	Scales a player's rating.
 | 
						Scales a player's rating.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec scale_rating_to(rating :: rating_t, to_version :: version_t) :: rating_t
 | 
						@spec scale_rating_to(rating :: rating, to_version :: version) :: rating
 | 
				
			||||||
	def scale_rating_to(rating, _version = :v1), do: (rating * @magic_version_scale) + @magic_version_scale_rating
 | 
						def scale_rating_to(rating, _version = :v1), do: (rating * @magic_version_scale) + @magic_version_scale_rating
 | 
				
			||||||
	def scale_rating_to(rating, _version = :v2), do: (rating - @magic_version_scale_rating) / @magic_version_scale
 | 
						def scale_rating_to(rating, _version = :v2), do: (rating - @magic_version_scale_rating) / @magic_version_scale
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	Scales a player's rating deviation.
 | 
						Scales a player's rating deviation.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec scale_rating_deviation_to(rating_deviation :: rating_deviation_t, to_version :: version_t) :: rating_deviation_t
 | 
						@spec scale_rating_deviation_to(rating_deviation :: rating_deviation, to_version :: version) :: rating_deviation
 | 
				
			||||||
	def scale_rating_deviation_to(rating_deviation, _version = :v1), do: rating_deviation * @magic_version_scale
 | 
						def scale_rating_deviation_to(rating_deviation, _version = :v1), do: rating_deviation * @magic_version_scale
 | 
				
			||||||
	def scale_rating_deviation_to(rating_deviation, _version = :v2), do: rating_deviation / @magic_version_scale
 | 
						def scale_rating_deviation_to(rating_deviation, _version = :v2), do: rating_deviation / @magic_version_scale
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -14,10 +14,10 @@ defmodule Glicko.Result do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	alias Glicko.Player
 | 
						alias Glicko.Player
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@type t :: {Player.rating_t, Player.rating_deviation_t, score_t}
 | 
						@type t :: {Player.rating, Player.rating_deviation, score}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@type score_t :: float
 | 
						@type score :: float
 | 
				
			||||||
	@type score_shortcut_t :: :loss | :draw | :win
 | 
						@type score_shortcut :: :loss | :draw | :win
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@score_shortcut_map %{loss: 0.0, draw: 0.5, win: 1.0}
 | 
						@score_shortcut_map %{loss: 0.0, draw: 0.5, win: 1.0}
 | 
				
			||||||
	@score_shortcuts Map.keys(@score_shortcut_map)
 | 
						@score_shortcuts Map.keys(@score_shortcut_map)
 | 
				
			||||||
@ -27,7 +27,7 @@ defmodule Glicko.Result do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	Supports passing either `:loss`, `:draw`, or `:win` as shortcuts.
 | 
						Supports passing either `:loss`, `:draw`, or `:win` as shortcuts.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec new(Player.rating_t, Player.rating_deviation_t, score_t | score_shortcut_t) :: t
 | 
						@spec new(Player.rating, Player.rating_deviation, score | score_shortcut) :: t
 | 
				
			||||||
	def new(opponent_rating, opponent_rating_deviation, score) when is_number(score) do
 | 
						def new(opponent_rating, opponent_rating_deviation, score) when is_number(score) do
 | 
				
			||||||
		{opponent_rating, opponent_rating_deviation, score}
 | 
							{opponent_rating, opponent_rating_deviation, score}
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
@ -40,7 +40,7 @@ defmodule Glicko.Result do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	Supports passing either `:loss`, `:draw`, or `:win` as shortcuts.
 | 
						Supports passing either `:loss`, `:draw`, or `:win` as shortcuts.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec new(opponent :: Player.t, score :: score_t | score_shortcut_t) :: t
 | 
						@spec new(opponent :: Player.t, score :: score | score_shortcut) :: t
 | 
				
			||||||
	def new(opponent, score) do
 | 
						def new(opponent, score) do
 | 
				
			||||||
		new(Player.rating(opponent, :v2), Player.rating_deviation(opponent, :v2), score)
 | 
							new(Player.rating(opponent, :v2), Player.rating_deviation(opponent, :v2), score)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
@ -48,19 +48,19 @@ defmodule Glicko.Result do
 | 
				
			|||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	Convenience function for accessing an opponent's rating.
 | 
						Convenience function for accessing an opponent's rating.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec opponent_rating(result :: Result.t) :: Player.rating_t
 | 
						@spec opponent_rating(result :: Result.t) :: Player.rating
 | 
				
			||||||
	def opponent_rating(_result = {rating, _, _}), do: rating
 | 
						def opponent_rating(_result = {rating, _, _}), do: rating
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	Convenience function for accessing an opponent's rating deviation.
 | 
						Convenience function for accessing an opponent's rating deviation.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec opponent_rating_deviation(result :: Result.t) :: Player.rating_deviation_t
 | 
						@spec opponent_rating_deviation(result :: Result.t) :: Player.rating_deviation
 | 
				
			||||||
	def opponent_rating_deviation(_result = {_, rating_deviation, _}), do: rating_deviation
 | 
						def opponent_rating_deviation(_result = {_, rating_deviation, _}), do: rating_deviation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@doc """
 | 
						@doc """
 | 
				
			||||||
	Convenience function for accessing the score.
 | 
						Convenience function for accessing the score.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	@spec score(result :: Result.t) :: score_t
 | 
						@spec score(result :: Result.t) :: score
 | 
				
			||||||
	def score(_result = {_, _, score}), do: score
 | 
						def score(_result = {_, _, score}), do: score
 | 
				
			||||||
 | 
					
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user