From 49c8bcafde9e89c2c358408eac2ad9ce1f4f60ee Mon Sep 17 00:00:00 2001 From: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com> Date: Wed, 4 Mar 2020 18:55:45 -0600 Subject: [PATCH] analysis.py v 1.1.12.005 analysis pkg v 1.0.0.002 --- analysis-master/analysis.egg-info/PKG-INFO | 2 +- analysis-master/analysis/analysis.py | 7 +- .../build/lib/analysis/analysis.py | 7 +- .../dist/analysis-1.0.0.2-py3-none-any.whl | Bin 0 -> 21602 bytes analysis-master/dist/analysis-1.0.0.2.tar.gz | Bin 0 -> 19240 bytes analysis-master/setup.py | 2 +- data analysis/superscript.py | 130 ++++++++++++++---- 7 files changed, 109 insertions(+), 39 deletions(-) create mode 100644 analysis-master/dist/analysis-1.0.0.2-py3-none-any.whl create mode 100644 analysis-master/dist/analysis-1.0.0.2.tar.gz diff --git a/analysis-master/analysis.egg-info/PKG-INFO b/analysis-master/analysis.egg-info/PKG-INFO index aeeb9d14..a4f2adcc 100644 --- a/analysis-master/analysis.egg-info/PKG-INFO +++ b/analysis-master/analysis.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: analysis -Version: 1.0.0.1 +Version: 1.0.0.2 Summary: analysis package developed by Titan Scouting for The Red Alliance Home-page: https://github.com/titanscout2022/tr2022-strategy Author: The Titan Scouting Team diff --git a/analysis-master/analysis/analysis.py b/analysis-master/analysis/analysis.py index 82409a16..1d00e13b 100644 --- a/analysis-master/analysis/analysis.py +++ b/analysis-master/analysis/analysis.py @@ -7,10 +7,12 @@ # current benchmark of optimization: 1.33 times faster # setup: -__version__ = "1.1.12.004" +__version__ = "1.1.12.005" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 1.1.12.005: + - fixed numba issues by removing numba from elo, glicko2 and trueskill 1.1.12.004: - renamed gliko to glicko 1.1.12.003: @@ -384,14 +386,12 @@ def regression(ndevice, inputs, outputs, args, loss = torch.nn.MSELoss(), _itera return regressions -@jit(nopython=True) def elo(starting_score, opposing_score, observed, N, K): expected = 1/(1+10**((np.array(opposing_score) - starting_score)/N)) return starting_score + K*(np.sum(observed) - np.sum(expected)) -@jit(forceobj=True) def glicko2(starting_score, starting_rd, starting_vol, opposing_score, opposing_rd, observations): player = Glicko2(rating = starting_score, rd = starting_rd, vol = starting_vol) @@ -400,7 +400,6 @@ def glicko2(starting_score, starting_rd, starting_vol, opposing_score, opposing_ return (player.rating, player.rd, player.vol) -@jit(forceobj=True) def trueskill(teams_data, observations): # teams_data is array of array of tuples ie. [[(mu, sigma), (mu, sigma), (mu, sigma)], [(mu, sigma), (mu, sigma), (mu, sigma)]] team_ratings = [] diff --git a/analysis-master/build/lib/analysis/analysis.py b/analysis-master/build/lib/analysis/analysis.py index 82409a16..1d00e13b 100644 --- a/analysis-master/build/lib/analysis/analysis.py +++ b/analysis-master/build/lib/analysis/analysis.py @@ -7,10 +7,12 @@ # current benchmark of optimization: 1.33 times faster # setup: -__version__ = "1.1.12.004" +__version__ = "1.1.12.005" # changelog should be viewed using print(analysis.__changelog__) __changelog__ = """changelog: + 1.1.12.005: + - fixed numba issues by removing numba from elo, glicko2 and trueskill 1.1.12.004: - renamed gliko to glicko 1.1.12.003: @@ -384,14 +386,12 @@ def regression(ndevice, inputs, outputs, args, loss = torch.nn.MSELoss(), _itera return regressions -@jit(nopython=True) def elo(starting_score, opposing_score, observed, N, K): expected = 1/(1+10**((np.array(opposing_score) - starting_score)/N)) return starting_score + K*(np.sum(observed) - np.sum(expected)) -@jit(forceobj=True) def glicko2(starting_score, starting_rd, starting_vol, opposing_score, opposing_rd, observations): player = Glicko2(rating = starting_score, rd = starting_rd, vol = starting_vol) @@ -400,7 +400,6 @@ def glicko2(starting_score, starting_rd, starting_vol, opposing_score, opposing_ return (player.rating, player.rd, player.vol) -@jit(forceobj=True) def trueskill(teams_data, observations): # teams_data is array of array of tuples ie. [[(mu, sigma), (mu, sigma), (mu, sigma)], [(mu, sigma), (mu, sigma), (mu, sigma)]] team_ratings = [] diff --git a/analysis-master/dist/analysis-1.0.0.2-py3-none-any.whl b/analysis-master/dist/analysis-1.0.0.2-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..8e0ef0ee122b9b462a79fca0c6add6ba8f4c30a2 GIT binary patch literal 21602 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 P`{(}wp<)K00FVIyFaC~2 literal 0 HcmV?d00001 diff --git a/analysis-master/setup.py b/analysis-master/setup.py index 680f53c8..cc268ba3 100644 --- a/analysis-master/setup.py +++ b/analysis-master/setup.py @@ -2,7 +2,7 @@ import setuptools setuptools.setup( name="analysis", # Replace with your own username - version="1.0.0.001", + version="1.0.0.002", author="The Titan Scouting Team", author_email="titanscout2022@gmail.com", description="analysis package developed by Titan Scouting for The Red Alliance", diff --git a/data analysis/superscript.py b/data analysis/superscript.py index b86f93eb..4149cf0b 100644 --- a/data analysis/superscript.py +++ b/data analysis/superscript.py @@ -158,49 +158,121 @@ def push_to_database(apikey, competition, results, metrics): def metricsloop(tbakey, apikey, competition, timestamp): # listener based metrics update + elo_N = 400 + elo_K = 24 + matches = d.pull_new_tba_matches(tbakey, competition, timestamp) - red = load_metrics(apikey, competition, matches, "red") - blu = load_metrics(apikey, competition, matches, "blue") - - elo_red_total = 0 - elo_blu_total = 0 - - gl2_red_total = 0 - gl2_blu_total + 0 - - for team in red: - - return - -def load_metrics(apikey, competition, matches, group_name): + return_vector = {} for match in matches: - for team in match[group_name]: + red = load_metrics(apikey, competition, match, "red") + blu = load_metrics(apikey, competition, match, "blue") - group = {} + elo_red_total = 0 + elo_blu_total = 0 - db_data = d.get_team_metrics_data(apikey, competition, team) + gl2_red_score_total = 0 + gl2_blu_score_total = 0 - if d.get_team_metrics_data(apikey, competition, team) == None: + gl2_red_rd_total = 0 + gl2_blu_rd_total = 0 - elo = {"score": 1500} - gl2 = {"score": 1500, "rd": 250, "vol": 0.06} - ts = {"mu": 25, "sigma": 25/3} + gl2_red_vol_total = 0 + gl2_blu_vol_total = 0 - d.push_team_metrics_data(apikey, competition, team, {"elo":elo, "gliko2":gl2,"trueskill":ts}) + for team in red: - group[team] = {"elo": elo, "gl2": gl2, "ts": ts} + elo_red_total += red[team]["elo"]["score"] - else: + gl2_red_score_total += red[team]["gl2"]["score"] + gl2_red_rd_total += red[team]["gl2"]["rd"] + gl2_red_vol_total += red[team]["gl2"]["vol"] - metrics = db_data["metrics"] - elo = metrics["elo"] - gl2 = metrics["gliko2"] - ts = metrics["trueskill"] + for team in blu: - group[team] = {"elo": elo, "gl2": gl2, "ts": ts} + elo_blu_total += blu[team]["elo"]["score"] + + gl2_blu_score_total += blu[team]["gl2"]["score"] + gl2_blu_rd_total += blu[team]["gl2"]["rd"] + gl2_blu_vol_total += blu[team]["gl2"]["vol"] + + red_elo = {"score": elo_red_total / len(red)} + blu_elo = {"score": elo_blu_total / len(blu)} + + red_gl2 = {"score": gl2_red_score_total / len(red), "rd": gl2_red_rd_total / len(red), "vol": gl2_red_vol_total / len(red)} + blu_gl2 = {"score": gl2_blu_score_total / len(blu), "rd": gl2_blu_rd_total / len(blu), "vol": gl2_blu_vol_total / len(blu)} + + + if(match["winner"] == "red"): + + observations = {"red": 1, "blue": 0} + + elif(match["winner"] == "blue"): + + observations = {"red": 0, "blue": 1} + + else: + + observations = {"red": 0.5, "blue": 0.5} + + red_elo_delta = an.elo(red_elo["score"], blu_elo["score"], [observations["red"], observations["blue"]], elo_N, elo_K) - red_elo["score"] + blu_elo_delta = an.elo(blu_elo["score"], red_elo["score"], [observations["blue"], observations["red"]], elo_N, elo_K) - blu_elo["score"] + + new_red_gl2_score, new_red_gl2_rd, new_red_gl2_vol = an.glicko2(red_gl2["score"], red_gl2["rd"], red_gl2["vol"], [blu_gl2["score"]], [blu_gl2["rd"]], [observations["red"], observations["blue"]]) + new_blu_gl2_score, new_blu_gl2_rd, new_blu_gl2_vol = an.glicko2(blu_gl2["score"], blu_gl2["rd"], blu_gl2["vol"], [red_gl2["score"]], [red_gl2["rd"]], [observations["blue"], observations["red"]]) + + red_gl2_delta = {"score": new_red_gl2_score - red_gl2["score"], "rd": new_red_gl2_rd - red_gl2["rd"], "vol": new_red_gl2_vol - red_gl2["vol"]} + blu_gl2_delta = {"score": new_blu_gl2_score - blu_gl2["score"], "rd": new_blu_gl2_rd - blu_gl2["rd"], "vol": new_blu_gl2_vol - blu_gl2["vol"]} + + for team in red: + + red[team]["elo"]["score"] = red[team]["elo"]["score"] + red_elo_delta + + red[team]["gl2"]["score"] = red[team]["gl2"]["score"] + red_gl2_delta["score"] + red[team]["gl2"]["rd"] = red[team]["gl2"]["rd"] + red_gl2_delta["rd"] + red[team]["gl2"]["vol"] = red[team]["gl2"]["vol"] + red_gl2_delta["vol"] + + for team in blu: + + blu[team]["elo"]["score"] = blu[team]["elo"]["score"] + blu_elo_delta + + blu[team]["gl2"]["score"] = blu[team]["gl2"]["score"] + blu_gl2_delta["score"] + blu[team]["gl2"]["rd"] = blu[team]["gl2"]["rd"] + blu_gl2_delta["rd"] + blu[team]["gl2"]["vol"] = blu[team]["gl2"]["vol"] + blu_gl2_delta["vol"] + + return_vector.update(red) + return_vector.update(blu) + + return return_vector + +def load_metrics(apikey, competition, match, group_name): + + for team in match[group_name]: + + group = {} + + db_data = d.get_team_metrics_data(apikey, competition, team) + + if d.get_team_metrics_data(apikey, competition, team) == None: + + elo = {"score": 1500} + gl2 = {"score": 1500, "rd": 250, "vol": 0.06} + ts = {"mu": 25, "sigma": 25/3} + + d.push_team_metrics_data(apikey, competition, team, {"elo":elo, "gliko2":gl2,"trueskill":ts}) + + group[team] = {"elo": elo, "gl2": gl2, "ts": ts} + + else: + + metrics = db_data["metrics"] + elo = metrics["elo"] + gl2 = metrics["gliko2"] + ts = metrics["trueskill"] + + group[team] = {"elo": elo, "gl2": gl2, "ts": ts} return group