did some renaming of main dirs (apps, libs, etc.)

This commit is contained in:
swaits committed 2005-05-09 22:53:48 +00:00
commit 63f8b0a13c
14 files changed
+4047

No files matched your search

+351
View File
@@ -0,0 +1,351 @@
/*
Copyright (c) 2004 Stephen Waits
This software is provided 'as-is', without any express or implied warranty. In
no event will the authors be held liable for any damages arising from the use
of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim
that you wrote the original software. If you use this software in a
product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "glicko2.h"
#include <vector>
#include <cmath>
class Glicko2_impl
{
public:
// constructors
Glicko2_impl();
Glicko2_impl(const Glicko2_impl& rhs);
// copy assignment
Glicko2_impl& operator=(const Glicko2_impl& rhs);
// destructor
virtual ~Glicko2_impl();
// system constants
static const double dvolatility;
// rating data
double rating;
double deviation;
double volatility;
// result data (copy of each opponent and results, 0.0, 0.5, or 1.0)
std::vector<Glicko2> opponents;
std::vector<double> results;
// utility functions
double g(const double& deviation);
double E(const double& rating, const double& rating_opponent, const double& deviation_opponent);
};
const double Glicko2_impl::dvolatility = 0.3; // should be [0.3,1.2]
Glicko2_impl::Glicko2_impl() :
rating(0.0),
deviation(0.0),
volatility(0.0),
opponents(),
results()
{
}
Glicko2_impl::Glicko2_impl(const Glicko2_impl& rhs) :
rating(rhs.rating),
deviation(rhs.deviation),
volatility(rhs.volatility),
opponents(rhs.opponents),
results(rhs.results)
{
}
Glicko2_impl& Glicko2_impl::operator=(const Glicko2_impl& rhs)
{
if ( this == &rhs )
{
return *this;
}
rating = rhs.rating;
deviation = rhs.deviation;
volatility = rhs.volatility;
opponents = rhs.opponents;
results = rhs.results;
return *this;
}
Glicko2_impl::~Glicko2_impl()
{
}
double Glicko2_impl::g(const double& deviation)
{
#define PI_SQUARED (9.86960440108935861883)
return 1.0 / (sqrt(1.0 + 3.0 * deviation * deviation / PI_SQUARED));
}
double Glicko2_impl::E(const double& rating, const double& rating_opponent, const double& deviation_opponent)
{
return 1.0 / (1.0 + exp(-g(deviation_opponent)*(rating - rating_opponent)));
}
Glicko2::Glicko2() :
pimpl(0)
{
pimpl = new Glicko2_impl();
SetRating(1500.0);
SetDeviation(350.0);
SetVolatility(0.06);
}
Glicko2::Glicko2(const Glicko2& rhs) :
pimpl(0)
{
pimpl = new Glicko2_impl(*(rhs.pimpl));
}
Glicko2::Glicko2(double rating, double deviation, double volatility) :
pimpl(0)
{
pimpl = new Glicko2_impl;
SetRating(rating);
SetDeviation(deviation);
SetVolatility(volatility);
}
Glicko2& Glicko2::operator=(const Glicko2& rhs)
{
if ( this == &rhs )
{
return *this;
}
*pimpl = *rhs.pimpl;
return *this;
}
Glicko2::~Glicko2()
{
delete pimpl;
}
bool Glicko2::operator< (const Glicko2& rhs)
{
return pimpl->rating < rhs.pimpl->rating;
}
double Glicko2::GetRating() const
{
return pimpl->rating * 173.7178 + 1500.0;
}
double Glicko2::GetDeviation() const
{
return pimpl->deviation * 173.7178;
}
double Glicko2::GetVolatility() const
{
return pimpl->volatility;
}
void Glicko2::SetRating(double rating)
{
pimpl->rating = (rating - 1500.0) / 173.7178;
}
void Glicko2::SetDeviation(double deviation)
{
pimpl->deviation = deviation / 173.7178;
}
void Glicko2::SetVolatility(double volatility)
{
pimpl->volatility = volatility;
}
void Glicko2::ClearResults()
{
pimpl->opponents.clear();
pimpl->results.clear();
}
void Glicko2::AddResult(const Glicko2& opponent, RESULT result)
{
pimpl->opponents.push_back(opponent);
switch ( result )
{
case WIN:
pimpl->results.push_back(1.0);
break;
case LOSS:
pimpl->results.push_back(0.0);
break;
case DRAW:
pimpl->results.push_back(0.5);
break;
}
}
void Glicko2::AddWin(const Glicko2& opponent)
{
AddResult(opponent,WIN);
}
void Glicko2::AddLoss(const Glicko2& opponent)
{
AddResult(opponent,LOSS);
}
void Glicko2::AddDraw(const Glicko2& opponent)
{
AddResult(opponent,DRAW);
}
void Glicko2::Update()
{
// bail if no opponents set
if ( pimpl->opponents.size() == 0 )
{
return;
}
// compute variance
double variance = 0.0;
for ( unsigned int i=0;i<pimpl->opponents.size();i++ )
{
double g_i = pimpl->g(pimpl->opponents[i].pimpl->deviation);
double E_i = pimpl->E(pimpl->rating,pimpl->opponents[i].pimpl->rating,pimpl->opponents[i].pimpl->deviation);
variance += g_i * g_i * E_i * (1.0 - E_i);
}
variance = 1.0 / variance;
// compute delta
double delta = 0.0;
for ( unsigned int i=0;i<pimpl->opponents.size();i++ )
{
delta += pimpl->g(pimpl->opponents[i].pimpl->deviation) * (pimpl->results[i] - pimpl->E(pimpl->rating,pimpl->opponents[i].pimpl->rating,pimpl->opponents[i].pimpl->deviation));
}
delta *= variance;
// determine new volatility
double new_volatility = 0.0;
double a = log(pimpl->volatility*pimpl->volatility);
double x = 0.0;
double x_new = a;
while ( abs(x - x_new) > 0.0000001 )
{
x = x_new;
double d = pimpl->deviation*pimpl->deviation + variance + exp(x);
double h1 = -(x - a)/(Glicko2_impl::dvolatility*Glicko2_impl::dvolatility) - 0.5*exp(x)/d + 0.5*exp(x)*(delta/d)*(delta/d);
double h2 = -1.0/(Glicko2_impl::dvolatility*Glicko2_impl::dvolatility) - 0.5*exp(x)*(pimpl->deviation*pimpl->deviation+variance)/(d*d) + 0.5*(delta*delta)*exp(x)*((pimpl->deviation*pimpl->deviation) + variance - exp(x))/(d*d*d);
x_new = x - h1/h2;
}
new_volatility = exp(x_new / 2.0);
// update the rating deviation to the new pre-rating period value
double pre_deviation = sqrt( pimpl->deviation*pimpl->deviation + new_volatility*new_volatility );
// update the rating and deviation
double new_deviation = 1.0 / (sqrt( 1.0/(pre_deviation*pre_deviation) + 1.0 / variance));
double new_rating = 0.0;
for ( unsigned int i=0;i<pimpl->opponents.size();i++ )
{
new_rating += pimpl->g(pimpl->opponents[i].pimpl->deviation) * (pimpl->results[i] - pimpl->E(pimpl->rating,pimpl->opponents[i].pimpl->rating,pimpl->opponents[i].pimpl->deviation));
}
new_rating = new_rating * new_deviation * new_deviation;
new_rating += pimpl->rating;
// copy new values
pimpl->rating = new_rating;
pimpl->deviation = new_deviation;
pimpl->volatility = new_volatility;
// wipe our result lists
ClearResults();
}
+245
View File
@@ -0,0 +1,245 @@
/*
Copyright (c) 2004 Stephen Waits
This software is provided 'as-is', without any express or implied warranty. In
no event will the authors be held liable for any damages arising from the use
of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim
that you wrote the original software. If you use this software in a
product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#ifndef __glicko2_h__
#define __glicko2_h__
class Glicko2_impl;
/**
* Glicko-2 Rating calculator class.
*
* This class implements the Glicko-2 rating system algorithm written by
* Professor Mark E. Glickman. All rating inputs and outputs are Glicko ratings,
* but internally everything is converted to and considered Glicko-2 ratings.
*
* Glicko-2 is an improvement on the original Glicko, which was, in turn, an
* improvement on the ELO system.
*
* The Glicko-2 system is specified on http://www.glicko.com/
*/
class Glicko2
{
public:
/**
* Enumeration of possible results.
*/
enum RESULT
{
/**
* A win result, internally 1.0.
*/
WIN,
/**
* A loss result, internally 0.0.
*/
LOSS,
/**
* A draw result, internally 0.5.
*/
DRAW
};
/**
* Default constructor. Initializes to a rating of 1500, a rating deviation
* of 350, and a volatility of 0.06.
*/
Glicko2();
/**
* Copy constructor.
*
* @param rhs Object to copy.
*/
Glicko2(const Glicko2& rhs);
/**
* Constructor with rating, rating deviation, and volatility specified.
*
* @param rating Initial rating.
* @param deviation Initial rating deviation.
* @param volatility Initial volatility.
*/
Glicko2(double rating, double deviation, double volatility);
/**
* Copy assignment operator.
*
* @param rhs Object to copy.
*
* @return Reference to self after copy assignment.
*/
Glicko2& operator=(const Glicko2& rhs);
/**
* Destructor.
*/
virtual ~Glicko2();
/**
* Less than comparison operator.
*
* @param rhs Object to compare against.
*
* @return true if this object's rating is less than rhs's rating; false otherwise.
*/
bool operator< (const Glicko2& rhs);
/**
* Get the current rating. This rating is a Glicko rating, not a Glicko2 rating.
* For details, please see http://www.glicko.com/
*
* @return
*/
double GetRating() const;
/**
* Get the current rating deviation. This is a Glicko rating deviation, not a
* Glicko-2 RD. For details, please see http://www.glicko.com/
*
* @return
*/
double GetDeviation() const;
/**
* Get the current rating volatility.
*
* @return
*/
double GetVolatility() const;
/**
* Set Glicko rating. Internally this is converted to a Glicko2 rating.
* For details, please see http://www.glicko.com/
*
* @param rating Rating.
*/
void SetRating(double rating);
/**
* Set Glicko rating deviation. Internally this is converted to a Glicko-2 RD.
* For details, please see http://www.glicko.com/
*
* @param deviation Rating deviation.
*/
void SetDeviation(double deviation);
/**
* Set rating volatility.
*
* @param volatility Rating volatility.
*/
void SetVolatility(double volatility);
/**
* Clear all results previously added via AddResult(), AddWin(), AddLoss(),
* and/or AddDraw(). This method is called automatically whenever Update()
* is called.
*/
void ClearResults();
/**
* Add a result to this rating. Note that no calculation is performed until
* Update() is called.
*
* @param opponent Other player in contest.
* @param result WIN, LOSS, or DRAW; from the point of view of this player.
*/
void AddResult(const Glicko2& opponent, RESULT result);
/**
* Add a win result to this rating. Note that no calculation is performed until
* Update() is called.
*
* @param opponent Other (losing) player in contest.
*/
void AddWin(const Glicko2& opponent);
/**
* Add a loss result to this rating. Note that no calculation is performed until
* Update() is called.
*
* @param opponent Other (winning) player in contest.
*/
void AddLoss(const Glicko2& opponent);
/**
* Add a draw result to this rating. Note that no calculation is performed until
* Update() is called.
*
* @param opponent Other (drawing) player in contest.
*/
void AddDraw(const Glicko2& opponent);
/**
* Update rating based on current results list, and clear results.
*/
void Update();
private:
/**
* Private Implementation.
*/
Glicko2_impl* pimpl;
};
#endif // __glicko2_h__
+25
View File
@@ -0,0 +1,25 @@
#include "glicko2.h"
#include <cstdio>
int main()
{
// Glicko-2 Example
// calculation from http://www.glicko.com/glicko2.doc/example.html
Glicko2 A(1500.0, 200.0, 0.06);
Glicko2 B(1400.0, 30.0, 0.06);
Glicko2 C(1550.0, 100.0, 0.06);
Glicko2 D(1700.0, 300.0, 0.06);
A.AddWin(B);
A.AddLoss(C);
A.AddResult(D,Glicko2::LOSS); // alternative way to add a result
A.Update();
printf("rating = %f, RD = %f\n", A.GetRating(), A.GetDeviation());
return 0;
}
+464
View File
@@ -0,0 +1,464 @@
<?xml version="1.0" encoding="UTF-8"?>
<ratingdoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.waits.net/XML/xmlrate.xsd">
<!-- players -->
<player><name>Mathew Mladin</name></player>
<player><name>Jake P Zemke</name></player>
<player><name>Miguel Duhamel</name></player>
<player><name>Jack E Pfeifer</name></player>
<player><name>Lee Acree</name></player>
<player><name>Opie Caylor</name></player>
<player><name>Scott Jensen</name></player>
<player><name>Eric C Wood</name></player>
<player><name>Cory Denton West</name></player>
<player><name>John Haner</name></player>
<player><name>J J Roetlin</name></player>
<player><name>Geoff May</name></player>
<player><name>Aaron W Yates</name></player>
<player><name>Dean Mizdal</name></player>
<player><name>David Bell</name></player>
<player><name>Eric Bostrom</name></player>
<player><name>Larry Pegram</name></player>
<player><name>Ben D Bostrom</name></player>
<player><name>Joshua Kurt Hayes</name></player>
<player><name>Jason Curtis</name></player>
<player><name>Shawn M Higbee</name></player>
<!--
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
-->
<!-- Daytona -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Lee Acree</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Cory Denton West</competitor>
<competitor>John Haner</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Geoff May</competitor>
<competitor>David Bell</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
</race>
</period>
<!-- Fontana Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Geoff May</competitor>
<competitor>Larry Pegram</competitor>
<competitor>John Haner</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Lee Acree</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>J J Roetlin</competitor>
<competitor>David Bell</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Shawn M Higbee</competitor>
</race>
</period>
<!-- Fontana Race 2 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Geoff May</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Lee Acree</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Cory Denton West</competitor>
<competitor>John Haner</competitor>
<competitor>Jason Curtis</competitor>
<competitor>David Bell</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Opie Caylor</competitor>
</race>
</period>
<!-- Sears Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Geoff May</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Lee Acree</competitor>
<competitor>Opie Caylor</competitor>
<competitor>John Haner</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>David Bell</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Eric C Wood</competitor>
</race>
</period>
<!-- Sears Race 2 -->
<period>
<race>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Geoff May</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Lee Acree</competitor>
<competitor>Eric C Wood</competitor>
<competitor>John Haner</competitor>
<competitor>David Bell</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Opie Caylor</competitor>
</race>
</period>
<!-- Barber Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>John Haner</competitor>
<competitor>Geoff May</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Cory Denton West</competitor>
<competitor>David Bell</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Lee Acree</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Ben D Bostrom</competitor>
</race>
</period>
<!-- Barber Race 2 -->
<period>
<race>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>John Haner</competitor>
<competitor>Geoff May</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Lee Acree</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Cory Denton West</competitor>
<competitor>J J Roetlin</competitor>
<competitor>David Bell</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Scott Jensen</competitor>
</race>
</period>
<!-- Pikes Peak -->
<period>
<race>
<competitor>Eric Bostrom</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Geoff May</competitor>
<competitor>Lee Acree</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Eric C Wood</competitor>
<competitor>John Haner</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Opie Caylor</competitor>
<competitor>David Bell</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Jason Curtis</competitor>
</race>
</period>
<!-- Road America Race 1 -->
<period>
<race>
<competitor>Miguel Duhamel</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Geoff May</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Opie Caylor</competitor>
<competitor>John Haner</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Cory Denton West</competitor>
<competitor>David Bell</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jason Curtis</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Lee Acree</competitor>
</race>
</period>
<!-- Road America Race 2 -->
<period>
<race>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Geoff May</competitor>
<competitor>Eric C Wood</competitor>
<competitor>John Haner</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Opie Caylor</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Lee Acree</competitor>
<competitor>David Bell</competitor>
</race>
</period>
<!-- Brainerd -->
<period>
<race>
<competitor>Jake P Zemke</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Geoff May</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Cory Denton West</competitor>
<competitor>John Haner</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Scott Jensen</competitor>
<competitor>David Bell</competitor>
<competitor>Jack E Pfeifer</competitor>
</race>
</period>
<!-- Laguna Seca -->
<period>
<race>
<competitor>Ben D Bostrom</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Geoff May</competitor>
<competitor>John Haner</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Lee Acree</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Cory Denton West</competitor>
<competitor>David Bell</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jack E Pfeifer</competitor>
</race>
</period>
<!-- Mid Ohio Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>John Haner</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Geoff May</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Lee Acree</competitor>
<competitor>Opie Caylor</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jack E Pfeifer</competitor>
</race>
</period>
<!-- Mid Ohio Race 2 -->
<period>
<race>
<competitor>Jake P Zemke</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Eric C Wood</competitor>
<competitor>John Haner</competitor>
<competitor>Lee Acree</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Geoff May</competitor>
<competitor>Cory Denton West</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Miguel Duhamel</competitor>
</race>
</period>
<!-- Road Atlanta Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>John Haner</competitor>
<competitor>Geoff May</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Opie Caylor</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Lee Acree</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Jason Curtis</competitor>
</race>
</period>
<!-- Road Atlanta Race 2 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>John Haner</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Geoff May</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Lee Acree</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jason Curtis</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Eric Bostrom</competitor>
</race>
</period>
</ratingdoc>
+729
View File
@@ -0,0 +1,729 @@
<?xml version="1.0" encoding="UTF-8"?>
<ratingdoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.waits.net/XML/xmlrate.xsd">
<!-- players -->
<player><name>Mathew Mladin</name></player>
<player><name>Jake P Zemke</name></player>
<player><name>Miguel Duhamel</name></player>
<player><name>Jack E Pfeifer</name></player>
<player><name>Lee Acree</name></player>
<player><name>Ricky Orlando</name></player>
<player><name>Pascal Picotte</name></player>
<player><name>Opie Caylor</name></player>
<player><name>Scott Jensen</name></player>
<player><name>Eric C Wood</name></player>
<player><name>Marco Martinez</name></player>
<player><name>C R Gittere</name></player>
<player><name>Cory Denton West</name></player>
<player><name>Frank Trombino</name></player>
<player><name>John Haner</name></player>
<player><name>J J Roetlin</name></player>
<player><name>Geoff May</name></player>
<player><name>David Bell</name></player>
<player><name>Roger Bell</name></player>
<player><name>Craig Fitzpatrick</name></player>
<player><name>Byron Barbour</name></player>
<player><name>Rick R Narup</name></player>
<player><name>Aaron W Yates</name></player>
<player><name>Dean Mizdal</name></player>
<player><name>Anthony W Fania</name></player>
<player><name>Eric Bostrom</name></player>
<player><name>Larry Pegram</name></player>
<player><name>K Mark Crozier</name></player>
<player><name>Mike Sullivan</name></player>
<player><name>Ben D Bostrom</name></player>
<player><name>Ron McGill</name></player>
<player><name>Jeffrey S Tigert</name></player>
<player><name>Joshua Kurt Hayes</name></player>
<player><name>Michael A Hanley</name></player>
<player><name>Scott E Carpenter</name></player>
<player><name>Jordan M Szoke</name></player>
<player><name>John Dugan</name></player>
<player><name>Steve Crevier</name></player>
<player><name>Martin Craggill</name></player>
<player><name>Clint McBain</name></player>
<player><name>Jeremy Toye</name></player>
<player><name>Chris Siglin</name></player>
<player><name>Robert M Christman</name></player>
<player><name>Jason Curtis</name></player>
<player><name>Mark Ledesma</name></player>
<player><name>Garry Combs</name></player>
<player><name>Kim Nakashima</name></player>
<player><name>Corey Sarros</name></player>
<player><name>Kevin Hanson</name></player>
<player><name>Jeremiah J Johnson</name></player>
<player><name>Jeff Williams</name></player>
<player><name>Rob Mesa</name></player>
<player><name>Craig Connell</name></player>
<player><name>Shawn M Higbee</name></player>
<player><name>A J Ammann</name></player>
<player><name>David Stanton</name></player>
<player><name>Ken Hill</name></player>
<player><name>Mark C Foster</name></player>
<player><name>Brien K Whitlock</name></player>
<player><name>James Randolph</name></player>
<player><name>James J King</name></player>
<player><name>Andrew Nelson</name></player>
<player><name>John Scott Wilson</name></player>
<player><name>Thomas G Montano</name></player>
<player><name>Kenyon Kluge</name></player>
<player><name>Mike Krynock</name></player>
<player><name>Michael J Sanchez</name></player>
<player><name>John R Jacobi</name></player>
<player><name>Lenny Beckman</name></player>
<player><name>Michael A Smith</name></player>
<player><name>Christian Pistoni</name></player>
<player><name>Daniel L Turner</name></player>
<player><name>Darren Luck</name></player>
<player><name>Andrew J Deatherage</name></player>
<player><name>Reuben Frankenfield</name></player>
<player><name>Chris M Voelker</name></player>
<player><name>Brian Boyd</name></player>
<player><name>James Kerker</name></player>
<player><name>Paul Ducato</name></player>
<player><name>Dave Ebben</name></player>
<player><name>David Weber</name></player>
<player><name>Jacob L Holden</name></player>
<player><name>Jason R Pridmore</name></player>
<player><name>Mark Vandal</name></player>
<player><name>Roger M Hendricks</name></player>
<player><name>Greg J Fryer</name></player>
<player><name>Corey D Eaton</name></player>
<player><name>Dave Kunzelman</name></player>
<player><name>Fritz Kling</name></player>
<player><name>Jeff Muskopf</name></player>
<player><name>Kevin W Pate</name></player>
<player><name>Chuck Allen</name></player>
<player><name>Charles Sorensen</name></player>
<player><name>Jesse A Janisch</name></player>
<!--
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
<player><name></name></player>
-->
<!-- Daytona -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Lee Acree</competitor>
<competitor>Ricky Orlando</competitor>
<competitor>Pascal Picotte</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Marco Martinez</competitor>
<competitor>C R Gittere</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Frank Trombino</competitor>
<competitor>John Haner</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Geoff May</competitor>
<competitor>David Bell</competitor>
<competitor>Roger Bell</competitor>
<competitor>Craig Fitzpatrick</competitor>
<competitor>Byron Barbour</competitor>
<competitor>Rick R Narup</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Anthony W Fania</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Larry Pegram</competitor>
<competitor>K Mark Crozier</competitor>
<competitor>Mike Sullivan</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Ron McGill</competitor>
<competitor>Jeffrey S Tigert</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Michael A Hanley</competitor>
<competitor>Scott E Carpenter</competitor>
<competitor>Jordan M Szoke</competitor>
<competitor>John Dugan</competitor>
</race>
</period>
<!-- Fontana Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Geoff May</competitor>
<competitor>Steve Crevier</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Martin Craggill</competitor>
<competitor>John Haner</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Clint McBain</competitor>
<competitor>Lee Acree</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Chris Siglin</competitor>
<competitor>Robert M Christman</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Mark Ledesma</competitor>
<competitor>David Bell</competitor>
<competitor>Garry Combs</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Kim Nakashima</competitor>
<competitor>Corey Sarros</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Jeremiah J Johnson</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Jeff Williams</competitor>
<competitor>Rob Mesa</competitor>
<competitor>Craig Connell</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>A J Ammann</competitor>
</race>
</period>
<!-- Fontana Race 2 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Steve Crevier</competitor>
<competitor>Geoff May</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Lee Acree</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Clint McBain</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Jeff Williams</competitor>
<competitor>John Haner</competitor>
<competitor>Jason Curtis</competitor>
<competitor>David Bell</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Rob Mesa</competitor>
<competitor>Mark Ledesma</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Corey Sarros</competitor>
<competitor>Chris Siglin</competitor>
<competitor>Garry Combs</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jeremiah J Johnson</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Craig Connell</competitor>
<competitor>Kim Nakashima</competitor>
<competitor>Martin Craggill</competitor>
<competitor>Robert M Christman</competitor>
<competitor>Opie Caylor</competitor>
<competitor>A J Ammann</competitor>
</race>
</period>
<!-- Sears Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>David Stanton</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Geoff May</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Ken Hill</competitor>
<competitor>Clint McBain</competitor>
<competitor>Lee Acree</competitor>
<competitor>Opie Caylor</competitor>
<competitor>John Haner</competitor>
<competitor>Robert M Christman</competitor>
<competitor>Mark C Foster</competitor>
<competitor>Brien K Whitlock</competitor>
<competitor>Cory Denton West</competitor>
<competitor>James Randolph</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Garry Combs</competitor>
<competitor>Rob Mesa</competitor>
<competitor>Jeff Williams</competitor>
<competitor>David Bell</competitor>
<competitor>Andrew Nelson</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>J J Roetlin</competitor>
<competitor>John Scott Wilson</competitor>
<competitor>Jeremiah J Johnson</competitor>
<competitor>Steve Crevier</competitor>
<competitor>James J King</competitor>
<competitor>Kim Nakashima</competitor>
<competitor>Chris Siglin</competitor>
<competitor>Craig Connell</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Thomas G Montano</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Kenyon Kluge</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>Mike Krynock</competitor>
</race>
</period>
<!-- Sears Race 2 -->
<period>
<race>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Steve Crevier</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Geoff May</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Lee Acree</competitor>
<competitor>Clint McBain</competitor>
<competitor>Ken Hill</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Robert M Christman</competitor>
<competitor>John Haner</competitor>
<competitor>David Bell</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Thomas G Montano</competitor>
<competitor>Brien K Whitlock</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Kim Nakashima</competitor>
<competitor>Jeremiah J Johnson</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>J J Roetlin</competitor>
<competitor>John Scott Wilson</competitor>
<competitor>Andrew Nelson</competitor>
<competitor>Garry Combs</competitor>
<competitor>James J King</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Chris Siglin</competitor>
<competitor>David Stanton</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>James Randolph</competitor>
<competitor>Jeff Williams</competitor>
<competitor>Kenyon Kluge</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>Mark C Foster</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Craig Connell</competitor>
<competitor>Rob Mesa</competitor>
<competitor>Mike Krynock</competitor>
</race>
</period>
<!-- Barber Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>John Haner</competitor>
<competitor>Geoff May</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Byron Barbour</competitor>
<competitor>Michael J Sanchez</competitor>
<competitor>Cory Denton West</competitor>
<competitor>David Bell</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Lee Acree</competitor>
<competitor>Mike Sullivan</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>John R Jacobi</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Marco Martinez</competitor>
<competitor>Mark Ledesma</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Scott E Carpenter</competitor>
<competitor>Lenny Beckman</competitor>
<competitor>C R Gittere</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Rick R Narup</competitor>
<competitor>Michael A Smith</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Jeremiah J Johnson</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Christian Pistoni</competitor>
</race>
</period>
<!-- Barber Race 2 -->
<period>
<race>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>John Haner</competitor>
<competitor>Geoff May</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Michael A Smith</competitor>
<competitor>Byron Barbour</competitor>
<competitor>Lee Acree</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Cory Denton West</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Mike Sullivan</competitor>
<competitor>David Bell</competitor>
<competitor>Marco Martinez</competitor>
<competitor>Mark Ledesma</competitor>
<competitor>John R Jacobi</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Lenny Beckman</competitor>
<competitor>Scott E Carpenter</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Rick R Narup</competitor>
<competitor>C R Gittere</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Jeremiah J Johnson</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Michael J Sanchez</competitor>
<competitor>Christian Pistoni</competitor>
</race>
</period>
<!-- Pikes Peak -->
<period>
<race>
<competitor>Eric Bostrom</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Ricky Orlando</competitor>
<competitor>Geoff May</competitor>
<competitor>Lee Acree</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Daniel L Turner</competitor>
<competitor>Eric C Wood</competitor>
<competitor>John Haner</competitor>
<competitor>Darren Luck</competitor>
<competitor>Mike Sullivan</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Robert M Christman</competitor>
<competitor>Mark Ledesma</competitor>
<competitor>David Bell</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Lenny Beckman</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Jason Curtis</competitor>
</race>
</period>
<!-- Road America Race 1 -->
<period>
<race>
<competitor>Miguel Duhamel</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Steve Crevier</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Geoff May</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Andrew J Deatherage</competitor>
<competitor>Pascal Picotte</competitor>
<competitor>John Haner</competitor>
<competitor>Roger Bell</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Cory Denton West</competitor>
<competitor>John R Jacobi</competitor>
<competitor>David Bell</competitor>
<competitor>Mike Sullivan</competitor>
<competitor>Reuben Frankenfield</competitor>
<competitor>Chris M Voelker</competitor>
<competitor>Robert M Christman</competitor>
<competitor>C R Gittere</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Jeremiah J Johnson</competitor>
<competitor>Brian Boyd</competitor>
<competitor>James Kerker</competitor>
<competitor>Lenny Beckman</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Paul Ducato</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Dave Ebben</competitor>
<competitor>David Weber</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Lee Acree</competitor>
<competitor>Marco Martinez</competitor>
<competitor>Jacob L Holden</competitor>
<competitor>Jason R Pridmore</competitor>
</race>
</period>
<!-- Road America Race 2 -->
<period>
<race>
<competitor>Miguel Duhamel</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Steve Crevier</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Geoff May</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>John Haner</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Andrew J Deatherage</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Cory Denton West</competitor>
<competitor>David Weber</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Reuben Frankenfield</competitor>
<competitor>John R Jacobi</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Chris M Voelker</competitor>
<competitor>Robert M Christman</competitor>
<competitor>C R Gittere</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Kevin Hanson</competitor>
<competitor>Dave Ebben</competitor>
<competitor>Lenny Beckman</competitor>
<competitor>Brian Boyd</competitor>
<competitor>James Kerker</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Roger Bell</competitor>
<competitor>Jacob L Holden</competitor>
<competitor>Pascal Picotte</competitor>
<competitor>Lee Acree</competitor>
<competitor>David Bell</competitor>
<competitor>Mike Sullivan</competitor>
<competitor>Jeremiah J Johnson</competitor>
<competitor>Jason R Pridmore</competitor>
<competitor>Marco Martinez</competitor>
<competitor>Paul Ducato</competitor>
</race>
</period>
<!-- Brainerd -->
<period>
<race>
<competitor>Jake P Zemke</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Pascal Picotte</competitor>
<competitor>Jacob L Holden</competitor>
<competitor>Geoff May</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Cory Denton West</competitor>
<competitor>John Haner</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Andrew J Deatherage</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Mark Vandal</competitor>
<competitor>James Kerker</competitor>
<competitor>Scott Jensen</competitor>
<competitor>David Bell</competitor>
<competitor>Roger M Hendricks</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>Greg J Fryer</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jason R Pridmore</competitor>
<competitor>C R Gittere</competitor>
<competitor>A J Ammann</competitor>
</race>
</period>
<!-- Laguna Seca -->
<period>
<race>
<competitor>Ben D Bostrom</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Jacob L Holden</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Geoff May</competitor>
<competitor>Jeremy Toye</competitor>
<competitor>John Haner</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Martin Craggill</competitor>
<competitor>Chris Siglin</competitor>
<competitor>Lee Acree</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Mike Sullivan</competitor>
<competitor>Mark Ledesma</competitor>
<competitor>Ken Hill</competitor>
<competitor>Marco Martinez</competitor>
<competitor>Ricky Orlando</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Thomas G Montano</competitor>
<competitor>Brien K Whitlock</competitor>
<competitor>Kim Nakashima</competitor>
<competitor>Corey D Eaton</competitor>
<competitor>Rob Mesa</competitor>
<competitor>Dave Kunzelman</competitor>
<competitor>Garry Combs</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Jeffrey S Tigert</competitor>
<competitor>David Bell</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Jack E Pfeifer</competitor>
</race>
</period>
<!-- Mid Ohio Race 1 -->
<period>
<race>
<competitor>Mathew Mladin</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Jake P Zemke</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Jacob L Holden</competitor>
<competitor>John Haner</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Geoff May</competitor>
<competitor>Eric C Wood</competitor>
<competitor>Martin Craggill</competitor>
<competitor>Cory Denton West</competitor>
<competitor>Lee Acree</competitor>
<competitor>Opie Caylor</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Andrew J Deatherage</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>Fritz Kling</competitor>
<competitor>Paul Ducato</competitor>
<competitor>Byron Barbour</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Jeff Muskopf</competitor>
<competitor>Kevin W Pate</competitor>
<competitor>Roger Bell</competitor>
<competitor>Chuck Allen</competitor>
<competitor>C R Gittere</competitor>
<competitor>Charles Sorensen</competitor>
<competitor>David Weber</competitor>
<competitor>James Kerker</competitor>
<competitor>Jesse A Janisch</competitor>
<competitor>John R Jacobi</competitor>
<competitor>Jason R Pridmore</competitor>
</race>
</period>
<!-- Mid Ohio Race 2 -->
<period>
<race>
<competitor>Jake P Zemke</competitor>
<competitor>Ben D Bostrom</competitor>
<competitor>Mathew Mladin</competitor>
<competitor>Aaron W Yates</competitor>
<competitor>Joshua Kurt Hayes</competitor>
<competitor>Jacob L Holden</competitor>
<competitor>Eric Bostrom</competitor>
<competitor>Larry Pegram</competitor>
<competitor>Eric C Wood</competitor>
<competitor>John Haner</competitor>
<competitor>Lee Acree</competitor>
<competitor>Shawn M Higbee</competitor>
<competitor>Geoff May</competitor>
<competitor>Andrew J Deatherage</competitor>
<competitor>Cory Denton West</competitor>
<competitor>David Weber</competitor>
<competitor>J J Roetlin</competitor>
<competitor>Jesse A Janisch</competitor>
<competitor>Scott Jensen</competitor>
<competitor>Opie Caylor</competitor>
<competitor>Jason Curtis</competitor>
<competitor>Byron Barbour</competitor>
<competitor>Dean Mizdal</competitor>
<competitor>C R Gittere</competitor>
<competitor>Paul Ducato</competitor>
<competitor>Jeff Muskopf</competitor>
<competitor>Jack E Pfeifer</competitor>
<competitor>Charles Sorensen</competitor>
<competitor>Miguel Duhamel</competitor>
<competitor>Fritz Kling</competitor>
<competitor>Chuck Allen</competitor>
<competitor>James Kerker</competitor>
<competitor>Roger Bell</competitor>
<competitor>Martin Craggill</competitor>
<competitor>John R Jacobi</competitor>
<competitor>Kevin W Pate</competitor>
<competitor>Jason R Pridmore</competitor>
</race>
</period>
</ratingdoc>
+403
View File
@@ -0,0 +1,403 @@
<?xml version="1.0" encoding="UTF-8"?>
<ratingdoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.waits.net/XML/xmlrate.xsd">
<player>
<name>penguins</name>
</player>
<player>
<name>no ties</name>
</player>
<player>
<name>zzyzzx</name>
</player>
<player>
<name>spitfires</name>
</player>
<player>
<name>red liners</name>
</player>
<player>
<name>space monkeys</name>
</player>
<player>
<name>phantoms</name>
</player>
<player>
<name>jinx</name>
</player>
<player>
<name>plug uglys</name>
</player>
<player>
<name>shockers</name>
</player>
<period>
<game>
<home>jinx</home>
<away>space monkeys</away>
<result>win</result>
</game>
<game>
<home>zzyzzx</home>
<away>no ties</away>
<result>loss</result>
</game>
<game>
<home>plug uglys</home>
<away>red liners</away>
<result>loss</result>
</game>
<game>
<home>phantoms</home>
<away>penguins</away>
<result>loss</result>
</game>
</period>
<period>
<game>
<home>no ties</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>jinx</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>space monkeys</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>zzyzzx</home>
<away>plug uglys</away>
<result>win</result>
</game>
<game>
<home>penguins</home>
<away>red liners</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>penguins</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
<game>
<home>spitfires</home>
<away>plug uglys</away>
<result>win</result>
</game>
<game>
<home>no ties</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>red liners</home>
<away>jinx</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>phantoms</away>
<result>draw</result>
</game>
</period>
<period>
<game>
<home>jinx</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
<game>
<home>red liners</home>
<away>space monkeys</away>
<result>loss</result>
</game>
<game>
<home>plug uglys</home>
<away>no ties</away>
<result>loss</result>
</game>
<game>
<home>spitfires</home>
<away>penguins</away>
<result>win</result>
</game>
<game>
<home>phantoms</home>
<away>shockers</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>shockers</home>
<away>plug uglys</away>
<result>draw</result>
</game>
<game>
<home>spitfires</home>
<away>jinx</away>
<result>win</result>
</game>
<game>
<home>penguins</home>
<away>no ties</away>
<result>loss</result>
</game>
<game>
<home>red liners</home>
<away>phantoms</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
</period>
<period> <!-- July 26th -->
<game>
<home>plug uglys</home>
<away>penguins</away>
<result>draw</result>
</game>
<game>
<home>spitfires</home>
<away>space monkeys</away>
<result>draw</result>
</game>
<game>
<home>shockers</home>
<away>red liners</away>
<result>loss</result>
</game>
<game>
<home>phantoms</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
<game>
<home>no ties</home>
<away>jinx</away>
<result>loss</result>
</game>
</period>
<period> <!-- August 2nd -->
<game>
<home>phantoms</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>plug uglys</home>
<away>jinx</away>
<result>win</result>
</game>
<game>
<home>no ties</home>
<away>space monkeys</away>
<result>loss</result>
</game>
<game>
<home>shockers</home>
<away>penguins</away>
<result>loss</result>
</game>
<game>
<home>zzyzzx</home>
<away>red liners</away>
<result>loss</result>
</game>
</period>
<period> <!-- August 9th -->
<game>
<home>space monkeys</home>
<away>plug uglys</away>
<result>win</result>
</game>
<game>
<home>penguins</home>
<away>jinx</away>
<result>win</result>
</game>
<game>
<home>red liners</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>zzyzzx</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>phantoms</home>
<away>no ties</away>
<result>draw</result>
</game>
</period>
<period> <!-- August 16th -->
<game>
<home>red liners</home>
<away>no ties</away>
<result>win</result>
</game>
<game>
<home>zzyzzx</home>
<away>spitfires</away>
<result>win</result> <!-- upset! -->
</game>
<game>
<home>space monkeys</home>
<away>penguins</away>
<result>win</result>
</game>
<game>
<home>plug uglys</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>jinx</home>
<away>shockers</away>
<result>draw</result>
</game>
</period>
<period> <!-- August 23rd -->
<game>
<home>spitfires</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>no ties</home>
<away>zzyzzx</away>
<result>draw</result>
</game>
<game>
<home>space monkeys</home>
<away>jinx</away>
<result>win</result>
</game>
<game>
<home>red liners</home>
<away>plug uglys</away>
<result>win</result>
</game>
</period>
<period> <!-- August 30th -->
<game>
<home>spitfires</home>
<away>shockers</away>
<result>win</result>
</game>
</period>
<period> <!-- Sep 13th -->
<game>
<home>red liners</home>
<away>phantoms</away>
<result>win</result>
</game>
<game>
<home>red liners</home>
<away>space monkeys</away>
<result>win</result>
</game>
<game>
<home>spitfires</home>
<away>phantoms</away>
<result>loss</result>
</game>
<!-- other games unknown!!! -->
</period>
</ratingdoc>
+422
View File
@@ -0,0 +1,422 @@
<?xml version="1.0" encoding="UTF-8"?>
<ratingdoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.waits.net/XML/xmlrate.xsd">
<player>
<name>penguins</name>
<rating>1458.9</rating>
<deviation>145.9</deviation>
<variance>0.06</variance>
</player>
<player>
<name>no ties</name>
<rating>1474.4</rating>
<deviation>141.2</deviation>
<variance>0.06</variance>
</player>
<player>
<name>zzyzzx</name>
<rating>1747.3</rating>
<deviation>146.8</deviation>
<variance>0.06</variance>
</player>
<player>
<name>spitfires</name>
<rating>1688.8</rating>
<deviation>152.5</deviation>
<variance>0.06</variance>
</player>
<player>
<name>space monkeys</name>
<rating>1666.4</rating>
<deviation>132.5</deviation>
<variance>0.06</variance>
</player>
<player>
<name>plug uglys</name>
<rating>1247.4</rating>
<deviation>149.5</deviation>
<variance>0.06</variance>
</player>
<player>
<name>shockers</name>
<rating>1117.6</rating>
<deviation>162.1</deviation>
<variance>0.06</variance>
</player>
<player>
<name>phantoms</name>
<rating>1527.9</rating>
<deviation>134.9</deviation>
<variance>0.06</variance>
</player>
<player>
<name>buk hockey</name>
</player>
<player>
<name>battle apples</name>
</player>
<!-- 9/20/2004 -->
<period>
<game> <!-- no line -->
<home>shockers</home>
<away>plug uglys</away>
<result>win</result>
</game>
<game> <!-- spitfires over penguins -->
<home>spitfires</home>
<away>penguins</away>
<result>win</result>
</game>
<game> <!-- zzyzzx over space monkeys -->
<home>zzyzzx</home>
<away>space monkeys</away>
<result>win</result>
</game>
<game> <!-- no line -->
<home>no ties</home>
<away>buk hockey</away>
<result>loss</result>
</game>
</period>
<!-- 9/27/2004 -->
<period>
<game>
<home>buk hockey</home>
<away>space monkeys</away>
<result>draw</result>
</game>
<game>
<home>spitfires</home>
<away>zzyzzx</away>
<result>win</result>
</game>
<game>
<home>plug uglys</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>shockers</home>
<away>no ties</away>
<result>loss</result>
</game>
<game>
<home>penguins</home>
<away>battle apples</away>
<result>win</result>
</game>
</period>
<!-- 10/04/2004 -->
<period>
<game>
<home>buk hockey</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>plug uglys</home>
<away>no ties</away>
<result>loss</result>
</game>
<game>
<home>space monkeys</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>battle apples</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
<game>
<home>penguins</home>
<away>phantoms</away>
<result>loss</result>
</game>
</period>
<!-- 10/11/2004 -->
<period>
<game>
<home>zzyzzx</home>
<away>penguins</away>
<result>win</result>
</game>
<game>
<home>battle apples</home>
<away>buk hockey</away>
<result>loss</result>
</game>
<game>
<home>shockers</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>space monkeys</home>
<away>plug uglys</away>
<result>win</result>
</game>
<game>
<home>no ties</home>
<away>phantoms</away>
<result>loss</result>
</game>
</period>
<!-- 10/25/2004 -->
<period>
<game>
<home>battle apples</home>
<away>plug uglys</away>
<result>loss</result>
</game>
<game>
<home>penguins</home>
<away>shockers</away>
<result>loss</result>
</game>
<game>
<home>no ties</home>
<away>spitfires</away>
<result>win</result>
</game>
<game>
<home>phantoms</home>
<away>space monkeys</away>
<result>draw</result>
</game>
<game>
<home>zzyzzx</home>
<away>buk hockey</away>
<result>win</result>
</game>
</period>
<!-- 11/01/2004 -->
<period>
<game>
<home>phantoms</home>
<away>buk hockey</away>
<result>draw</result>
</game>
<game>
<home>zzyzzx</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>penguins</home>
<away>plug uglys</away>
<result>win</result>
</game>
<game>
<home>no ties</home>
<away>battle apples</away>
<result>win</result>
</game>
<game>
<home>spitfires</home>
<away>space monkeys</away>
<result>win</result>
</game>
</period>
<!-- 11/15/2004 -->
<period>
<game>
<home>shockers</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>zzyzzx</home>
<away>no ties</away>
<result>win</result>
</game>
<game>
<home>plug uglys</home>
<away>buk hockey</away>
<result>loss</result>
</game>
<game>
<home>spitfires</home>
<away>battle apples</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>penguins</away>
<result>win</result>
</game>
</period>
<!-- 11/22/2004 -->
<period>
<game>
<home>penguins</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>buk hockey</home>
<away>no ties</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>zzyzzx</away>
<result>win</result>
</game>
<game>
<home>battle apples</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>plug uglys</home>
<away>shockers</away>
<result>loss</result>
</game>
</period>
<!-- 11/29/2004 -->
<period>
<game>
<home>plug uglys</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>phantoms</home>
<away>zzyzzx</away>
<result>win</result>
</game>
<game>
<home>battle apples</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>no ties</away>
<result>win</result>
</game>
<game>
<home>buk hockey</home>
<away>penguins</away>
<result>loss</result>
</game>
</period>
<!-- 12/06/2004 -->
<period>
<game>
<home>space monkeys</home>
<away>battle apples</away>
<result>loss</result>
</game>
<game>
<home>no ties</home>
<away>penguins</away>
<result>win</result>
</game>
<game>
<home>buk hockey</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>spitfires</home>
<away>phantoms</away>
<result>win</result>
</game>
<game>
<home>plug uglys</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
</period>
<!-- 1/17/2005 -->
<period>
<game>
<home>phantoms</home>
<away>no ties</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>buk hockey</away>
<result>win</result>
</game>
<game>
<home>spitfires</home>
<away>battle apples</away>
<result>win</result>
</game>
<game>
<home>zzyzzx</home>
<away>penguins</away>
<result>loss</result>
</game>
</period>
</ratingdoc>
+503
View File
@@ -0,0 +1,503 @@
<?xml version="1.0" encoding="UTF-8"?>
<ratingdoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.waits.net/XML/xmlrate.xsd">
<player>
<name>no ties</name>
<rating>1472.6</rating>
<deviation>100.3</deviation>
<variance>0.06</variance>
</player>
<player>
<name>zzyzzx</name>
<rating>1657.5</rating>
<deviation>106.0</deviation>
<variance>0.06</variance>
</player>
<player>
<name>penguins</name>
<rating>1436.3</rating>
<deviation>103.2</deviation>
<variance>0.06</variance>
</player>
<player>
<name>spitfires</name>
<rating>1801.5</rating>
<deviation>112.3</deviation>
<variance>0.06</variance>
</player>
<player>
<name>space monkeys</name>
<rating>1659.8</rating>
<deviation>98.1</deviation>
<variance>0.06</variance>
</player>
<player>
<name>plug uglys</name>
<rating>1125.4</rating>
<deviation>113.1</deviation>
<variance>0.06</variance>
</player>
<player>
<name>shockers</name>
<rating>1196.3</rating>
<deviation>117.0</deviation>
<variance>0.06</variance>
</player>
<player>
<name>phantoms</name>
<rating>1652.6</rating>
<deviation>98.6</deviation>
<variance>0.06</variance>
</player>
<player>
<name>battle apples</name>
<rating>1302.6</rating>
<deviation>156.9</deviation>
<variance>0.06</variance>
</player>
<player>
<name>blackouts</name>
<rating>1531.3</rating>
<deviation>121.4</deviation>
<variance>0.06</variance>
</player>
<player>
<name>coaches team</name>
</player>
<player>
<name>old school</name>
</player>
<player>
<name>ballistic</name>
</player>
<player>
<name>velocity</name>
</player>
<player>
<name>puck heads</name>
</player>
<player>
<name>demons</name>
</player>
<player>
<name>section 8</name>
</player>
<player>
<name>who's your daddy</name>
</player>
<player>
<name>blackhawks</name>
</player>
<player>
<name>tiger sharks</name>
</player>
<period>
<game>
<home>phantoms</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>battle apples</home>
<away>blackouts</away>
<result>loss</result>
</game>
<game>
<home>zzyzzx</home>
<away>penguins</away>
<result>loss</result>
</game>
<game>
<home>plug uglys</home>
<away>space monkeys</away>
<result>loss</result>
</game>
<game>
<home>no ties</home>
<away>coaches team</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>spitfires</home>
<away>no ties</away>
<result>draw</result>
</game>
<game>
<home>penguins</home>
<away>blackouts</away>
<result>win</result>
</game>
<game>
<home>zzyzzx</home>
<away>plug uglys</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>old school</away>
<result>win</result>
</game>
<game>
<home>coaches team</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>phantoms</home>
<away>battle apples</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>space monkeys</home>
<away>zzyzzx</away>
<result>win</result>
</game>
<game>
<home>coaches team</home>
<away>battle apples</away>
<result>win</result>
</game>
<game>
<home>plug uglys</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>shockers</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>blackouts</home>
<away>old school</away>
<result>win</result>
</game>
<game>
<home>no ties</home>
<away>penguins</away>
<result>loss</result>
</game>
</period>
<period>
<game>
<home>old school</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>plug uglys</home>
<away>no ties</away>
<result>loss</result>
</game>
<game>
<home>shockers</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
<game>
<home>blackouts</home>
<away>space monkeys</away>
<result>win</result>
</game>
<game>
<home>coaches team</home>
<away>penguins</away>
<result>loss</result>
</game>
<game>
<home>spitfires</home>
<away>battle apples</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>battle apples</home>
<away>shockers</away>
<result>loss</result>
</game>
<game>
<home>zzyzzx</home>
<away>blackouts</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>no ties</home>
<away>old school</away>
<result>win</result>
</game>
<game>
<home>penguins</home>
<away>spitfires</away>
<result>loss</result>
</game>
<game>
<home>coaches team</home>
<away>plug uglys</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>no ties</home>
<away>space monkeys</away>
<result>win</result>
</game>
<game>
<home>old school</home>
<away>coaches team</away>
<result>win</result>
</game>
<game>
<home>penguins</home>
<away>battle apples</away>
<result>win</result>
</game>
<game>
<home>plug uglys</home>
<away>spitfires</away>
<result>draw</result>
</game>
<game>
<home>phantoms</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
<game>
<home>shockers</home>
<away>blackouts</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>blackouts</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>penguins</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>zzyzzx</home>
<away>no ties</away>
<result>win</result>
</game>
<game>
<home>space monkeys</home>
<away>coaches team</away>
<result>loss</result>
</game>
<game>
<home>battle apples</home>
<away>plug uglys</away>
<result>loss</result>
</game>
<game>
<home>spitfires</home>
<away>old school</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>phantoms</home>
<away>shockers</away>
<result>win</result>
</game>
<game>
<home>blackouts</home>
<away>no ties</away>
<result>loss</result>
</game>
<game>
<home>battle apples</home>
<away>old school</away>
<result>win</result>
</game>
<game>
<home>plug uglys</home>
<away>penguins</away>
<result>loss</result>
</game>
<game>
<home>space monkeys</home>
<away>spitfires</away>
<result>draw</result>
</game>
<game>
<home>zzyzzx</home>
<away>coaches team</away>
<result>win</result>
</game>
</period>
<period>
<game>
<home>spitfires</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
<game>
<home>space monkeys</home>
<away>battle apples</away>
<result>win</result>
</game>
<game>
<home>no ties</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>coaches team</home>
<away>blackouts</away>
<result>loss</result>
</game>
<game>
<home>shockers</home>
<away>plug uglys</away>
<result>loss</result>
</game>
<game>
<home>old school</home>
<away>penguins</away>
<result>loss</result>
</game>
</period>
<period>
<game>
<home>old school</home>
<away>shockers</away>
<result>win</result>
</game>
</period>
<!-- mon, 4/25 -->
<period>
<game>
<home>spitfires</home>
<away>coaches team</away>
<result>win</result>
</game>
<game>
<home>battle apples</home>
<away>no ties</away>
<result>loss</result>
</game>
<game>
<home>old school</home>
<away>zzyzzx</away>
<result>loss</result>
</game>
<game>
<home>penguins</home>
<away>phantoms</away>
<result>loss</result>
</game>
<game>
<home>blackouts</home>
<away>plug uglys</away>
<result>win</result>
</game>
<game>
<home>shockers</home>
<away>space monkeys</away>
<result>loss</result>
</game>
</period>
<!-- wed, 4/27 -->
<period>
<game>
<home>shockers</home>
<away>ballistic</away>
<result>loss</result>
</game>
<game>
<home>blackhawks</home>
<away>puck heads</away>
<result>win</result>
</game>
<game>
<home>section 8</home>
<away>velocity</away>
<result>draw</result>
</game>
<game>
<home>demons</home>
<away>spitfires</away>
<result>draw</result>
</game>
<game>
<home>who's your daddy</home>
<away>tiger sharks</away>
<result>draw</result>
</game>
</period>
<!-- mon, 5/2 (playoffs round 1) -->
<period>
<game>
<home>no ties</home>
<away>penguins</away>
<result>loss</result>
</game>
<game>
<home>phantoms</home>
<away>space monkeys</away>
<result>loss</result>
</game>
<game>
<home>zzyzzx</home>
<away>coaches team</away>
<result>loss</result>
</game>
<game>
<home>spitfires</home>
<away>blackouts</away>
<result>win</result>
</game>
</period>
</ratingdoc>
+56
View File
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<ratingdoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.waits.net/XML/xmlrate.xsd">
<player>
<name>A</name>
<rating>1500</rating>
<deviation>200</deviation>
<volatility>0.06</volatility>
</player>
<player>
<name>B</name>
<rating>1400</rating>
<deviation>30</deviation>
<volatility>0.06</volatility>
</player>
<player>
<name>C</name>
<rating>1550</rating>
<deviation>100</deviation>
<volatility>0.06</volatility>
</player>
<player>
<name>D</name>
<rating>1700</rating>
<deviation>300</deviation>
<volatility>0.06</volatility>
</player>
<period>
<game>
<home>A</home>
<away>B</away>
<result>win</result>
</game>
<game>
<home>A</home>
<away>C</away>
<result>loss</result>
</game>
<game>
<home>A</home>
<away>D</away>
<result>loss</result>
</game>
</period>
</ratingdoc>
+240
View File
@@ -0,0 +1,240 @@
#
#
# Copyright (c) 2004 Stephen Waits
#
# This software is provided 'as-is', without any express or implied warranty. In
# no event will the authors be held liable for any damages arising from the use
# of this software.
#
# Permission is granted to anyone to use this software for any purpose,
# including commercial applications, and to alter it and redistribute it freely,
# subject to the following restrictions:
#
# 1. The origin of this software must not be misrepresented; you must not claim
# that you wrote the original software. If you use this software in a
# product, an acknowledgment in the product documentation would be
# appreciated but is not required.
#
# 2. Altered source versions must be plainly marked as such, and must not be
# misrepresented as being the original software.
#
# 3. This notice may not be removed or altered from any source distribution.
#
#
import math
import copy
class Glicko2:
"""
Glicko-2 Rating calculator class.
This class implements the Glicko-2 rating system algorithm written by
Professor Mark E. Glickman. All rating inputs and outputs are Glicko ratings,
but internally everything is converted to and considered Glicko-2 ratings.
Glicko-2 is an improvement on the original Glicko, which was, in turn, an
improvement on the ELO system.
The Glicko-2 system is specified on http://www.glicko.com/
"""
WIN = 1.0
LOSS = 0.0
DRAW = 0.5
dvolatility = 0.3
def __init__ (self, rating = 1500.0, deviation = 350.0, volatility = 0.06):
"""
Constructor with rating, rating deviation, and volatility optionally
specified. If nothing specified, nitializes to a rating of 1500, a
rating deviation of 350, and a volatility of 0.06.
"""
# creat state vars
self.__rating = 0.0
self.__deviation = 0.0
self.__volatility = 0.0
# create empty result lists
self.__opponents = []
self.__results = []
# initialize state
self.SetRating(rating)
self.SetDeviation(deviation)
self.SetVolatility(volatility)
def __cmp__(self, other):
"""Comparison operator"""
return cmp( self.__rating, other.__rating )
def GetRating (self):
"""
Get the current rating. This rating is a Glicko rating, not a Glicko2 rating.
For details, please see http://www.glicko.com/
"""
return (self.__rating * 173.7178) + 1500.0
def GetDeviation (self):
"""
Get the current rating deviation. This is a Glicko rating deviation, not a
Glicko-2 RD. For details, please see http://www.glicko.com/
"""
return self.__deviation * 173.7178
def GetVolatility (self):
"""
Get the current rating volatility.
"""
return self.__volatility
def SetRating (self, rating):
"""
Set Glicko rating. Internally this is converted to a Glicko2 rating.
For details, please see http://www.glicko.com/
"""
self.__rating = (rating - 1500.0) / 173.7178
def SetDeviation(self, deviation):
"""
Set Glicko rating deviation. Internally this is converted to a Glicko-2 RD.
For details, please see http://www.glicko.com/
"""
self.__deviation = deviation / 173.7178
def SetVolatility(self, volatility):
"""
Set rating volatility.
"""
self.__volatility = volatility
def ClearResults (self):
"""
Clear all results previously added via AddResult(), AddWin(), AddLoss(),
and/or AddDraw(). This method is called automatically whenever Update()
is called.
"""
self.__opponents = []
self.__results = []
def AddResult (self, opponent, result):
"""
Add a result to this rating. Note that no calculation is performed until
Update() is called.
"""
self.__opponents.append(copy.copy(opponent))
self.__results.append(copy.copy(result)) # copy probably not needed
def AddWin (self, opponent):
"""
Add a win result to this rating. Note that no calculation is performed until
Update() is called.
"""
self.AddResult(opponent, self.WIN)
def AddLoss (self, opponent):
"""
Add a loss result to this rating. Note that no calculation is performed until
Update() is called.
"""
self.AddResult(opponent, self.LOSS)
def AddDraw (self, opponent):
"""
Add a draw result to this rating. Note that no calculation is performed until
Update() is called.
"""
self.AddResult(opponent, self.DRAW)
def Update (self):
"""
Update rating based on current results list, and clear results.
"""
# util func
def g (deviation):
"""
Internal utility function.
"""
return 1.0 / (math.sqrt(1.0 + 3.0 * deviation * deviation / (math.pi * math.pi)));
# util func
def E (rating, rating_opponent, deviation_opponent):
"""
Internal utility function.
"""
return 1.0 / (1.0 + math.exp(-g(deviation_opponent)*(rating - rating_opponent)));
# bail if no opponents set
if len(self.__opponents) == 0:
return
# compute variance
variance = 0.0
for opp in self.__opponents:
g_i = g(opp.__deviation)
E_i = E(self.__rating,opp.__rating,opp.__deviation)
variance += g_i * g_i * E_i * (1.0 - E_i)
variance = 1.0 / variance
# compute delta
delta = 0.0
for i in range(len(self.__opponents)):
delta += g(self.__opponents[i].__deviation) * (self.__results[i] - E(self.__rating, self.__opponents[i].__rating, self.__opponents[i].__deviation))
delta *= variance
# determine new volatility
new_volatility = 0.0
a = math.log( math.pow(self.__volatility,2.0) )
x = 0.0
x_new = a
while ( abs(x - x_new) > 0.0000001 ):
x = x_new;
d = math.pow(self.__deviation,2.0) + variance + math.exp(x)
h1 = -(x - a)/(math.pow(self.dvolatility,2.0)) - 0.5*math.exp(x)/d + 0.5*math.exp(x)*(delta/d)*(delta/d)
h2 = -1.0/(math.pow(self.dvolatility,2.0)) - 0.5*math.exp(x)*(math.pow(self.__deviation,2.0)+variance)/(pow(d,2.0)) + 0.5*(math.pow(delta,2.0))*math.exp(x)*((math.pow(self.__deviation,2.0)) + variance - math.exp(x))/(pow(d,3.0))
x_new = x - h1/h2
new_volatility = math.exp(x_new / 2.0)
# update the rating deviation to the new pre-rating period value
pre_deviation = math.sqrt( math.pow(self.__deviation,2.0) + math.pow(new_volatility,2.0) )
# update the rating and deviation
new_deviation = 1.0 / (math.sqrt( 1.0/(pow(pre_deviation,2.0)) + 1.0 / variance))
new_rating = 0.0
for i in range(len(self.__opponents)):
new_rating += g(self.__opponents[i].__deviation) * (self.__results[i] - E(self.__rating, self.__opponents[i].__rating, self.__opponents[i].__deviation))
new_rating = new_rating * pow(new_deviation,2.0)
new_rating += self.__rating
# copy new values
self.__rating = new_rating
self.__deviation = new_deviation
self.__volatility = new_volatility
# wipe our result lists
self.ClearResults()
# test code
if __name__ == "__main__":
A = Glicko2(1500.0, 200.0, 0.06)
B = Glicko2(1400.0, 30.0, 0.06)
C = Glicko2(1550.0, 100.0, 0.06)
D = Glicko2(1700.0, 300.0, 0.06)
A.AddWin(B)
A.AddLoss(C)
A.AddResult(D,Glicko2.LOSS)
A.Update();
print "rating",A.GetRating(), "deviation",A.GetDeviation()
Executable
+228
View File
@@ -0,0 +1,228 @@
#!/usr/bin/env python
import sys
import glicko2
import xml.dom.minidom
# globals
gPlayers = dict()
gTeams = dict()
def getText(nodelist):
rc = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc = rc + node.data
return rc
def parsePlayers (docroot):
# get players
playerelements = docroot.getElementsByTagName("player")
# parse each player
for player in playerelements:
# get the name
namenode = player.getElementsByTagName("name")
assert namenode
name = getText(namenode[0].childNodes)
# setup default rating data
g2 = glicko2.Glicko2()
# look for rating
ratingnode = player.getElementsByTagName("rating")
if ratingnode:
g2.SetRating( float(getText(ratingnode[0].childNodes)) )
# look for deviation
deviationnode = player.getElementsByTagName("deviation")
if deviationnode:
g2.SetDeviation( float(getText(deviationnode[0].childNodes)) )
# look for volatility
volatilitynode = player.getElementsByTagName("volatility")
if volatilitynode:
g2.SetVolatility( float(getText(volatilitynode[0].childNodes)) )
# add to dictionary
gPlayers[name] = g2
def parseTeams (docroot):
# get teams
teamelements = docroot.getElementsByTagName("team")
# parse each team
for team in teamelements:
# get the name
namenode = team.getElementsByTagName("name")
assert namenode
name = getText(namenode[0].childNodes)
# add name to our dictionary
gTeams[name] = []
# look for members, add to dictionary
membernode = team.getElementsByTagName("member")
assert membernode # makes certain team is not empty
for member in membernode:
gTeams[name].append( getText(member.childNodes) )
def outputPlayers():
sorted = [(v, k) for k, v in gPlayers.items()]
sorted.sort()
sorted.reverse() # so largest is first
sorted = [(k, v) for v, k in sorted]
i = 0
for k,v in sorted:
i += 1
print "%3d%30s: %6.1f +/- %5.1f %0.05f" % \
( i, k, v.GetRating(), v.GetDeviation(), v.GetVolatility() )
def handlePeriods (docroot):
# our period count
periodcount = 0
# get all periods
periodelements = docroot.getElementsByTagName("period")
# handle each period
for period in periodelements:
# track period id
periodcount += 1
print
print "after rating period",periodcount
# deal with either a race or a game node
for node in period.childNodes:
if node.nodeType == node.ELEMENT_NODE:
if node.tagName == "race":
handleRace(node)
elif node.tagName == "game":
handleGame(node)
# all games entered for this period, now update all players ratings
for k,v in gPlayers.items():
v.Update()
# sort players for output
outputPlayers()
def handleRace (race):
# get competitors
competitornodes = race.getElementsByTagName("competitor")
# a list of our racers
racelist = []
for competitor in competitornodes:
# get name from XML
competitorname = getText(competitor.childNodes)
# look name up in our team list
if gTeams.has_key(competitorname):
competitornames = gTeams[competitorname]
else:
competitornames = [competitorname]
# make all of these competitors losers to everyone already in the list
for plist in racelist:
for pl in plist:
for co in competitornames:
gPlayers[pl].AddWin(gPlayers[co])
gPlayers[co].AddLoss(gPlayers[pl])
# now let's add this list to our race list
racelist.append( competitornames )
def handleGame (game):
# get home
homenode = game.getElementsByTagName("home")
assert homenode
home = getText(homenode[0].childNodes)
# get away
awaynode = game.getElementsByTagName("away")
assert awaynode
away = getText(awaynode[0].childNodes)
# get result
resultnode = game.getElementsByTagName("result")
assert resultnode
result = getText(resultnode[0].childNodes)
assert result == "win" or result == "loss" or result == "draw"
# see if home is a team
if gTeams.has_key(home):
homeplayernames = gTeams[home]
else:
homeplayernames = [home]
# see if away is a team
if gTeams.has_key(away):
awayplayernames = gTeams[away]
else:
awayplayernames = [away]
# determine each team's result
if result == "win":
homeresult = glicko2.Glicko2.WIN
awayresult = glicko2.Glicko2.LOSS
elif result == "loss":
homeresult = glicko2.Glicko2.LOSS
awayresult = glicko2.Glicko2.WIN
elif result == "draw":
homeresult = glicko2.Glicko2.DRAW
awayresult = glicko2.Glicko2.DRAW
# now let's add all the results to the Glicko2 objects
for hname in homeplayernames:
for aname in awayplayernames:
gPlayers[hname].AddResult( gPlayers[aname], homeresult )
for aname in awayplayernames:
for hname in homeplayernames:
gPlayers[aname].AddResult( gPlayers[hname], awayresult )
def main ():
# parse input document
docroot = xml.dom.minidom.parse(sys.argv[1])
# build player & team list
parsePlayers(docroot)
parseTeams(docroot)
# show initial ratings
print "initial ratings"
outputPlayers()
# process all the periods
handlePeriods(docroot)
if __name__ == '__main__':
main()
+94
View File
@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="ratingtype">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="100.0"/>
<xs:maxInclusive value="4000.0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="deviationtype">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.0"/>
<xs:maxInclusive value="700.0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="volatilitytype">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.0"/>
<xs:maxInclusive value="10.0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="nametype">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="commenttype">
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="resulttype">
<xs:restriction base ="xs:string">
<xs:enumeration value="win"/>
<xs:enumeration value="loss"/>
<xs:enumeration value="draw"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="racetype">
<xs:choice>
<xs:element minOccurs="1" maxOccurs="unbounded" name="competitor" type="nametype"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="gametype">
<xs:all>
<xs:element minOccurs="1" name="home" type="nametype"/>
<xs:element minOccurs="1" name="away" type="nametype"/>
<xs:element minOccurs="1" name="result" type="resulttype"/>
<xs:element minOccurs="0" name="comment" type="commenttype"/>
</xs:all>
</xs:complexType>
<xs:complexType name="periodtype">
<xs:choice>
<xs:element maxOccurs="unbounded" name="game" type="gametype"/>
<xs:element maxOccurs="unbounded" name="race" type="racetype"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="teamtype">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="name" type="nametype"/>
<xs:element minOccurs="1" maxOccurs="unbounded" name="member" type="nametype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="playertype">
<xs:all>
<xs:element minOccurs="1" name="name" type="nametype"/>
<xs:element minOccurs="0" name="rating" type="ratingtype"/>
<xs:element minOccurs="0" name="deviation" type="deviationtype"/>
<xs:element minOccurs="0" name="volatility" type="volatilitytype"/>
</xs:all>
</xs:complexType>
<xs:complexType name="ratingdoctype">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="player" type="playertype"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="team" type="teamtype"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="period" type="periodtype"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ratingdoc" type="ratingdoctype"/>
</xs:schema>
Executable
+230
View File
@@ -0,0 +1,230 @@
#!/usr/bin/env ruby
#
#
# Copyright (c) 2004 Stephen Waits
#
# This software is provided 'as-is', without any express or implied warranty. In
# no event will the authors be held liable for any damages arising from the use
# of this software.
#
# Permission is granted to anyone to use this software for any purpose,
# including commercial applications, and to alter it and redistribute it freely,
# subject to the following restrictions:
#
# 1. The origin of this software must not be misrepresented; you must not claim
# that you wrote the original software. If you use this software in a
# product, an acknowledgment in the product documentation would be
# appreciated but is not required.
#
# 2. Altered source versions must be plainly marked as such, and must not be
# misrepresented as being the original software.
#
# 3. This notice may not be removed or altered from any source distribution.
#
#
# Glicko-2 Rating calculator class.
#
# This class implements the Glicko-2 rating system algorithm written by
# Professor Mark E. Glickman. All rating inputs and outputs are Glicko ratings,
# but internally everything is converted to and considered Glicko-2 ratings.
#
# Glicko-2 is an improvement on the original Glicko, which was, in turn, an
# improvement on the ELO system.
#
# The Glicko-2 system is specified on http://www.glicko.com/
#
class Glicko2
protected
# Glicko2 reprensentation (Glicko2 uses different scales from Glicko)
attr_accessor :g2rating, :g2deviation, :g2volatility
# a nested Class to hold a single result
Result = Struct.new(:opponent, :result)
public
WIN = 1.0
LOSS = 0.0
DRAW = 0.5
# Constructor with rating, rating deviation, and volatility optionally
# specified. If nothing specified, nitializes to a rating of 1500, a
# rating deviation of 350, and a volatility of 0.06.
def initialize(rating = 1500.0, deviation = 350.0, volatility = 0.06)
@dvolatility = 0.3
self.rating = rating
self.deviation = deviation
self.volatility = volatility
clear_results
end
include Comparable
# Comparison operator
def <=>(other)
self.rating <=> other.rating
end
# Get the current rating. This rating is a Glicko rating, not a Glicko2 rating.
# For details, please see http://www.glicko.com/
def rating
(@g2rating * 173.7178) + 1500.0
end
# Set Glicko rating. Internally this is converted to a Glicko2 rating.
# For details, please see http://www.glicko.com/
def rating=(r)
@g2rating = (r - 1500.0) / 173.7178
end
# Get the current rating deviation. This is a Glicko rating deviation, not a
# Glicko-2 RD. For details, please see http://www.glicko.com/
def deviation
@g2deviation * 173.7178
end
# Set Glicko rating deviation. Internally this is converted to a Glicko-2 RD.
# For details, please see http://www.glicko.com/
def deviation=(d)
@g2deviation = d / 173.7178
end
# Get the current rating volatility.
def volatility
@g2volatility
end
# Set rating volatility.
def volatility=(v)
@g2volatility = v
end
# Clear all results previously added via add_result(), add_win(), add_loss(),
# and/or add_draw(). This method is called automatically whenever update()
# is called.
def clear_results
@opponents = []
@results = []
end
# Add a result to this rating. Note that no calculation is performed until
# update() is called.
def add_result(opponent,result)
@results.push( Result.new(opponent.clone, result) )
end
# Add a win result to this rating. Note that no calculation is performed until
# update() is called.
def add_win(opponent)
add_result(opponent,Glicko2::WIN)
end
# Add a loss result to this rating. Note that no calculation is performed until
# update() is called.
def add_loss(opponent)
add_result(opponent,Glicko2::LOSS)
end
# Add a draw result to this rating. Note that no calculation is performed until
# update() is called.
def add_draw(opponent)
add_result(opponent,Glicko2::DRAW)
end
# Update rating based on current results list, and clear results.
def update
# util func
def Glicko2.g(deviation)
1.0 / (Math.sqrt(1.0 + 3.0 * deviation ** 2.0 / (Math::PI ** 2.0)))
end
# util func
def Glicko2.E(rating, rating_opponent, deviation_opponent)
1.0 / (1.0 + Math.exp(-Glicko2.g(deviation_opponent)*(rating - rating_opponent)));
end
# bail if no opponents set
if @results.empty?
return nil
end
# compute variance
#variance = 0.0
#@results.inject(0.0) do |variance,r|
# g_i = Glicko2.g(r.opponent.g2deviation)
# e_i = Glicko2.E(@g2rating,r.opponent.g2rating,r.opponent.g2deviation)
# g_i ** 2.0 * e_i * (1.0 - e_i)
#end
variance = 0.0
@results.each do |r|
g_i = Glicko2.g(r.opponent.g2deviation)
e_i = Glicko2.E(@g2rating,r.opponent.g2rating,r.opponent.g2deviation)
variance += g_i ** 2.0 * e_i * (1.0 - e_i)
end
variance = 1.0 / variance
# compute delta
delta = 0.0
@results.each do |r|
delta += Glicko2.g(r.opponent.g2deviation) * (r.result - Glicko2.E(@g2rating, r.opponent.g2rating, r.opponent.g2deviation))
end
delta *= variance
# determine new volatility
new_volatility = 0.0
a = Math.log( @g2volatility**2.0 )
x = 0.0
x_new = a
while ( (x - x_new).abs > 0.0000001 )
x = x_new
d = @g2deviation**2.0 + variance + Math.exp(x)
h1 = -(x - a)/(@dvolatility**2.0) - 0.5*Math.exp(x)/d + 0.5*Math.exp(x)*(delta/d)*(delta/d)
h2 = -1.0/(@dvolatility**2.0) - 0.5*Math.exp(x)*(@g2deviation**2.0+variance)/(d**2.0) + 0.5*(delta**2.0)*Math.exp(x)*((@g2deviation**2.0) + variance - Math.exp(x))/(d**3.0)
x_new = x - h1/h2
end
new_volatility = Math.exp(x_new / 2.0)
# update the rating deviation to the new pre-rating period value
pre_deviation = Math.sqrt( @g2deviation**2.0 + new_volatility**2.0 )
# update the rating and deviation
new_deviation = 1.0 / (Math.sqrt( 1.0/(pre_deviation**2.0) + 1.0 / variance))
new_rating = 0.0
@results.each do |r|
new_rating += Glicko2.g(r.opponent.g2deviation) * (r.result - Glicko2.E(@g2rating, r.opponent.g2rating, r.opponent.g2deviation))
end
new_rating = new_rating * new_deviation**2.0
new_rating += @g2rating
# wipe our result lists
clear_results
# copy new values
@g2deviation = new_deviation
@g2volatility = new_volatility
@g2rating = new_rating
end
end
A = Glicko2.new(1500.0, 200.0, 0.06)
B = Glicko2.new(1400.0, 30.0, 0.06)
C = Glicko2.new(1550.0, 100.0, 0.06)
D = Glicko2.new(1700.0, 300.0, 0.06)
A.add_win(B)
A.add_loss(C)
A.add_result(D,0.0)
A.update()
print "rating ", A.rating, " deviation ", A.deviation
+57
View File
@@ -0,0 +1,57 @@
require "rexml/document"
file = File.new( "../py/data/hockey-2005.xml" )
doc = REXML::Document.new(file)
# each rating doc
doc.elements.each("ratingdoc") do |root|
# each player
root.elements.each("player") do |player|
name = player.elements["name"].text
rating = 1500.0
deviation = 350.0
variance = 0.06
# TODO: find better "Ruby-esqe" way of doing these
if player.elements["rating"]
rating = player.elements["rating"].text
end
if player.elements["deviation"]
deviation = player.elements["deviation"].text
end
if player.elements["variance"]
variance = player.elements["variance"].text
end
puts name,rating,deviation,variance
puts
end
# each rating period
root.elements.each("period") do |period|
# each regular game
period.elements.each("game") do |game|
puts "home",game.elements["home"].text
puts "away",game.elements["away"].text
puts "result",game.elements["result"].text
puts
end
# each race
period.elements.each("race") do |race|
race.elements.each("competitor") do |c|
puts c.text
end
puts
end
end
end