From 7ab83b474c90ca628287b9c6ffb678a4893fea74 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Tue, 17 Jan 2023 11:50:16 -0600 Subject: [PATCH 01/24] started stats --- src/analysis/autoPickList/autoPick.js | 80 +++++++++++++++++++ .../transformers/standardDeviation.js | 33 ++++++++ 2 files changed, 113 insertions(+) create mode 100644 src/analysis/autoPickList/autoPick.js create mode 100644 src/analysis/transformers/standardDeviation.js diff --git a/src/analysis/autoPickList/autoPick.js b/src/analysis/autoPickList/autoPick.js new file mode 100644 index 00000000..92284de4 --- /dev/null +++ b/src/analysis/autoPickList/autoPick.js @@ -0,0 +1,80 @@ +function swap(arr, i, j) { + let temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; +} + + +function partition(arr, low, high) { + // pivot + let pivot = arr[high.averageScore()]; + + // Index of smaller element and + // indicates the right position + // of pivot found so far + let i = (low - 1); + + for (let j = low; j <= high - 1; j++) { + + // If current element is smaller + // than the pivot + if (arr[j.averageScore()] < pivot) { // FIXME j.average score is a temporary + + // Increment index of + // smaller element + i++; + swap(arr, i, j); + } + } + swap(arr, i + 1, high); + return (i + 1); +} + +/* The main function that implements QuickSort + arr[] --> Array to be sorted, + low --> Starting index, + high --> Ending index +*/ +function quickSort(arr, low, high) { + if (low < high) { + + // pi is partitioning index, arr[p] + // is now at right place + let pi = partition(arr, low, high); + + // Separately sort elements before + // partition and after partition + quickSort(arr, low, pi - 1); + quickSort(arr, pi + 1, high); + } +} + +// Driver Code +// reorders a list of teams based on average score +function sortTeams(teams) { + quickSort(teams, 0, teams - 1) + return teams +} +//-------------------------------------------------------------------------------------------------------------------------------------// + +// an alliance is made up of three teams +let alliance = { + a : Team a, + b : Team b, + c : Team c +} + +function possibleAliiances(teams) { + const possibleAlliiances = [] // an array of all possible alliances + for(x in teams) { + for(y in teams) { + for(z in teams) { + possibleAliiances.push(new alliance[x, y, z]) //FIXME alliances of the same team exist + } + } + } +} + +function compareAlliances(alliance1, alliance2) { + return 1 // % chance alliance 1 wins +} \ No newline at end of file diff --git a/src/analysis/transformers/standardDeviation.js b/src/analysis/transformers/standardDeviation.js new file mode 100644 index 00000000..45750f93 --- /dev/null +++ b/src/analysis/transformers/standardDeviation.js @@ -0,0 +1,33 @@ +const{ getPath, setPath } = require("../../lib/util"); +const{ DataTransformer } = require("../DataTransformer"); + +module.exports = { + /** + find standard deviation + @type { DataTransformer } + @param options.path {String} + */ + /* + const n = array.length + const mean = array.reduce((a, b) => a + b) / n + return Math.sqrt(array.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n) + */ + team: new DataTransformer("standardDeviation", (dataset, outputPath, options) => { + for (let [teamNumber,team] of Object.entries(dataset.teams)) { + let teamTmps = dataset.tmps.filter(x=>x.robotNumber == teamNumber); //only the tmps that are this team's + let scores = [] + for (let tmp of teamTmps) { + scores.push(getPath(tmp,options.path)) + } + let n = scores.length + let mean = scores.reduce((a, b) => a + b) / n + let sd = Math.sqrt(scores.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n) + console.log(scores) + console.log(mean) + console.log(sd) + setPath(team,outputPath,sd) + } + + return dataset; + }) +} \ No newline at end of file From 660fbb44b72fbd2b56a84c1589b598c731b62161 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly Date: Wed, 18 Jan 2023 12:03:11 -0600 Subject: [PATCH 02/24] implementing statistics --- package-lock.json | 14 ++++++ package.json | 1 + .../{autoPickList => public/js}/autoPick.js | 50 ++++++++++++++++--- src/analysis/views/index.ejs | 2 + 4 files changed, 59 insertions(+), 8 deletions(-) rename src/analysis/{autoPickList => public/js}/autoPick.js (53%) diff --git a/package-lock.json b/package-lock.json index cdd35d35..9255703a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "mongoose": "^6.0.6", "nodemon": "^2.0.15", "qrcode": "^1.4.4", + "simple-statistics": "^7.8.2", "socket.io": "^4.4.1" }, "engines": { @@ -2420,6 +2421,14 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, + "node_modules/simple-statistics": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.2.tgz", + "integrity": "sha512-evB7wiL4DSz6T9TdCTfRRqNcmnp0bllcUfZ4NBwtkdGMbXrYsZbrGxfunLPqdqCyT2Yz1NvLrKS7LVOoFBCxbA==", + "engines": { + "node": "*" + } + }, "node_modules/sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", @@ -4686,6 +4695,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, + "simple-statistics": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.2.tgz", + "integrity": "sha512-evB7wiL4DSz6T9TdCTfRRqNcmnp0bllcUfZ4NBwtkdGMbXrYsZbrGxfunLPqdqCyT2Yz1NvLrKS7LVOoFBCxbA==" + }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", diff --git a/package.json b/package.json index 8372b399..293c2c99 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "mongoose": "^6.0.6", "nodemon": "^2.0.15", "qrcode": "^1.4.4", + "simple-statistics": "^7.8.2", "socket.io": "^4.4.1" } } diff --git a/src/analysis/autoPickList/autoPick.js b/src/analysis/public/js/autoPick.js similarity index 53% rename from src/analysis/autoPickList/autoPick.js rename to src/analysis/public/js/autoPick.js index 92284de4..00a66641 100644 --- a/src/analysis/autoPickList/autoPick.js +++ b/src/analysis/public/js/autoPick.js @@ -1,3 +1,6 @@ +const { zScore } = require("simple-statistics"); +const { Dataset } = require("../../DataTransformer"); + function swap(arr, i, j) { let temp = arr[i]; arr[i] = arr[j]; @@ -57,11 +60,16 @@ function sortTeams(teams) { } //-------------------------------------------------------------------------------------------------------------------------------------// -// an alliance is made up of three teams -let alliance = { - a : Team a, - b : Team b, - c : Team c +async function fetchDataset() { + return await fetch("./api/dataset").then(res => res.json()) +} + +async function fetchTeams() { + const teams = await fetch(`/analysis/api/teams`).then(res => res.json()) + return teams.reduce((acc, t) => { + acc[t.team_number] = t.nickname + return acc + }, {}) } function possibleAliiances(teams) { @@ -75,6 +83,32 @@ function possibleAliiances(teams) { } } -function compareAlliances(alliance1, alliance2) { - return 1 // % chance alliance 1 wins -} \ No newline at end of file +function allianceAverage(alliance) { + return alliance[0].averageScore + alliance[1].averageScore + alliance[2].averageScore; +} + +function allianceStandardDeviation(alliance) { + let i = Math.pow(alliance[0].standardDeviation, 2) + Math.pow(alliance[1].standardDeviation, 2) + Math.pow(alliance[2].standardDeviation, 2) + return staMath.sqrt(i); +} + +function matchAverage(alliance1, alliance2) { + return allianceAverage(alliance1) - allianceAverage(alliance2); +} + +function matchStandardDeviation(alliance1, alliance2) { + let i = Math.pow(allianceStandardDeviation(alliance), 2) + Math.pow(allianceStandardDeviation(alliance), 2); + return Math.sqrt(i); +} + +function compareAlliances { + zscore = zScore() +} + +//----------------------------------------------------------------------------------------------------------------------------------// +const dataset = fetchDataset(); +const teams = fetchTeams(); +const possibleAliiances = possibleAliiances(teams); +console.log(teams); +console.log(possibleAliiances); + diff --git a/src/analysis/views/index.ejs b/src/analysis/views/index.ejs index 2925d406..abf00fe2 100644 --- a/src/analysis/views/index.ejs +++ b/src/analysis/views/index.ejs @@ -133,6 +133,8 @@ + + \ No newline at end of file From 8cc0d31d01077157d25576884d7a2792dd37fcaf Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Thu, 19 Jan 2023 11:35:27 -0600 Subject: [PATCH 03/24] finished compareAlliances; added documentation --- src/analysis/public/js/autoPick.js | 53 ++++++++++++++++++++++++------ src/analysis/views/index.ejs | 1 + 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/analysis/public/js/autoPick.js b/src/analysis/public/js/autoPick.js index 00a66641..df1099c8 100644 --- a/src/analysis/public/js/autoPick.js +++ b/src/analysis/public/js/autoPick.js @@ -1,4 +1,4 @@ -const { zScore } = require("simple-statistics"); +const { zScore, cumulativeStdNormalProbability } = require("simple-statistics"); const { Dataset } = require("../../DataTransformer"); function swap(arr, i, j) { @@ -71,41 +71,74 @@ async function fetchTeams() { return acc }, {}) } - +/** + * + * @param {A list of all teams} teams + * @returns A list of all possible alliances, including impossible allaicnes(duplicate teams on an alliance) + */ function possibleAliiances(teams) { - const possibleAlliiances = [] // an array of all possible alliances + let possibleAlliiances = [] // an array of all possible alliances for(x in teams) { for(y in teams) { for(z in teams) { - possibleAliiances.push(new alliance[x, y, z]) //FIXME alliances of the same team exist + possibleAliiances.push(new alliance[x, y, z]) } } } + return possibleAliiances } - +/** + * + * @param {An alliance of three teams} alliance + * @returns the average score for an alliance + */ function allianceAverage(alliance) { return alliance[0].averageScore + alliance[1].averageScore + alliance[2].averageScore; } +/** + * + * @param {An alliance of three teams} alliance + * @returns the standard deveiation of an alliances score + */ function allianceStandardDeviation(alliance) { let i = Math.pow(alliance[0].standardDeviation, 2) + Math.pow(alliance[1].standardDeviation, 2) + Math.pow(alliance[2].standardDeviation, 2) - return staMath.sqrt(i); + return Math.sqrt(i); } - +/** + * + * @param {An alliance of three teams} alliance1 + * @param {An alliance of three teams} alliance2 + * @returns the average difference in score between two alliances, a postive number means on average alliance 1 wins + */ function matchAverage(alliance1, alliance2) { return allianceAverage(alliance1) - allianceAverage(alliance2); } +/** + * + * @param {An alliance of three} alliance + * @returns the the standard deveation in the difference of the score between two alliances + */ function matchStandardDeviation(alliance1, alliance2) { let i = Math.pow(allianceStandardDeviation(alliance), 2) + Math.pow(allianceStandardDeviation(alliance), 2); return Math.sqrt(i); } - -function compareAlliances { - zscore = zScore() +/** + * + * @param {*} alliance1 + * @param {*} alliance2 + * @returns the probiblity that alliance 1 wins a random match between the two alliances + */ + +function compareAlliances(alliance1, alliance2) { + zscore = zScore(0, matchAverage(alliance1, alliance2), matchStandardDeviation(alliance1, alliance2)) + probAlliance2Wins = cumulativeStdNormalProbability(zscore) + return 1 - probAlliance2Wins; } //----------------------------------------------------------------------------------------------------------------------------------// + const dataset = fetchDataset(); const teams = fetchTeams(); const possibleAliiances = possibleAliiances(teams); diff --git a/src/analysis/views/index.ejs b/src/analysis/views/index.ejs index abf00fe2..6e74d70d 100644 --- a/src/analysis/views/index.ejs +++ b/src/analysis/views/index.ejs @@ -134,6 +134,7 @@ + From f12f09561074321175f1ccc4c61e910ebf654b82 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Thu, 19 Jan 2023 11:50:41 -0600 Subject: [PATCH 04/24] started comparing all Alliances --- src/analysis/public/js/autoPick.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/analysis/public/js/autoPick.js b/src/analysis/public/js/autoPick.js index df1099c8..87004ee0 100644 --- a/src/analysis/public/js/autoPick.js +++ b/src/analysis/public/js/autoPick.js @@ -136,6 +136,23 @@ function compareAlliances(alliance1, alliance2) { probAlliance2Wins = cumulativeStdNormalProbability(zscore) return 1 - probAlliance2Wins; } +/** + * + * @param {a list of alliances} alliances + * @returns a list of alliances prioritized, by winning probability + * + * If we compare to every alliances to every other alliances we can make a (key, value) map with a key of the alliance number and a value of their winning prob + * Then it can be passed into another (key, value) map with the key being a team number and a value of their average chance of winning + */ +function compareAllTeams(alliances) { + let allianceProb = new Map(); + for (a in alliances) { + for (b in alliances){ + allianceProb.set(alliances.indexOf(a), allianceProb.get(alliances.indexOf(a)) + compareAlliances(a, b)) + } + } + +} //----------------------------------------------------------------------------------------------------------------------------------// From 52d6d0889c048722239b655ed0937c19f607c66a Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Fri, 20 Jan 2023 11:26:18 -0600 Subject: [PATCH 05/24] Trying to add to simulate match --- config/analysis-modules.json | 10 ++++++++++ src/analysis/public/js/autoPick.js | 15 ++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/config/analysis-modules.json b/config/analysis-modules.json index 2dddec53..8c2170d6 100644 --- a/config/analysis-modules.json +++ b/config/analysis-modules.json @@ -223,6 +223,16 @@ "decimals": 2 } }, + { + "view": "match", + "module": "SingleDisplay", + "name": "Percent Chance of Winning", + "position": "main", + "options": { + "path": "", + "decimals": 2 + } + }, { "view": "match", "module": "ColumnDisplay", diff --git a/src/analysis/public/js/autoPick.js b/src/analysis/public/js/autoPick.js index 87004ee0..371e1d58 100644 --- a/src/analysis/public/js/autoPick.js +++ b/src/analysis/public/js/autoPick.js @@ -151,14 +151,23 @@ function compareAllTeams(alliances) { allianceProb.set(alliances.indexOf(a), allianceProb.get(alliances.indexOf(a)) + compareAlliances(a, b)) } } + //The map now contains a map of all possible alliances and a sum of their change of winning + for(a in allianceProb){ + allianceProb.set(a, allianceProb.get(a) / Math.pow(alliances.length(), 2)) + } + //Now each alliances value should be their average chance of winning + let teamProb = new Map(); + for(a in allianceProb){ + + } } //----------------------------------------------------------------------------------------------------------------------------------// -const dataset = fetchDataset(); -const teams = fetchTeams(); -const possibleAliiances = possibleAliiances(teams); +let dataset = fetchDataset(); +let teams = fetchTeams(); console.log(teams); +let possibleAliiances = possibleAliiances(teams); console.log(possibleAliiances); From e9f85525f42f13d20587b386dac14f77704f3a39 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:03:31 -0600 Subject: [PATCH 06/24] Confirmed Math Works by logging --- src/analysis/public/js/autoPick.js | 77 +++++++++++++++++++++++++----- src/analysis/views/index.ejs | 3 +- 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/analysis/public/js/autoPick.js b/src/analysis/public/js/autoPick.js index 371e1d58..c59677a7 100644 --- a/src/analysis/public/js/autoPick.js +++ b/src/analysis/public/js/autoPick.js @@ -1,5 +1,5 @@ -const { zScore, cumulativeStdNormalProbability } = require("simple-statistics"); -const { Dataset } = require("../../DataTransformer"); +// const { Dataset } = require("../../DataTransformer"); +// const { zScore, cumulativeStdNormalProbability } = require("simple-statistics"); function swap(arr, i, j) { let temp = arr[i]; @@ -93,7 +93,7 @@ function possibleAliiances(teams) { * @returns the average score for an alliance */ function allianceAverage(alliance) { - return alliance[0].averageScore + alliance[1].averageScore + alliance[2].averageScore; + return alliance[0].avg + alliance[1].avg + alliance[2].avg; } /** @@ -102,7 +102,7 @@ function allianceAverage(alliance) { * @returns the standard deveiation of an alliances score */ function allianceStandardDeviation(alliance) { - let i = Math.pow(alliance[0].standardDeviation, 2) + Math.pow(alliance[1].standardDeviation, 2) + Math.pow(alliance[2].standardDeviation, 2) + let i = Math.pow(alliance[0].sd, 2) + Math.pow(alliance[1].sd, 2) + Math.pow(alliance[2].sd, 2) return Math.sqrt(i); } /** @@ -121,7 +121,7 @@ function matchAverage(alliance1, alliance2) { * @returns the the standard deveation in the difference of the score between two alliances */ function matchStandardDeviation(alliance1, alliance2) { - let i = Math.pow(allianceStandardDeviation(alliance), 2) + Math.pow(allianceStandardDeviation(alliance), 2); + let i = Math.pow(allianceStandardDeviation(alliance1), 2) + Math.pow(allianceStandardDeviation(alliance2), 2); return Math.sqrt(i); } /** @@ -132,8 +132,8 @@ function matchStandardDeviation(alliance1, alliance2) { */ function compareAlliances(alliance1, alliance2) { - zscore = zScore(0, matchAverage(alliance1, alliance2), matchStandardDeviation(alliance1, alliance2)) - probAlliance2Wins = cumulativeStdNormalProbability(zscore) + zscore = ss.zScore(0, matchAverage(alliance1, alliance2), matchStandardDeviation(alliance1, alliance2)) + probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) return 1 - probAlliance2Wins; } /** @@ -165,9 +165,62 @@ function compareAllTeams(alliances) { //----------------------------------------------------------------------------------------------------------------------------------// -let dataset = fetchDataset(); -let teams = fetchTeams(); -console.log(teams); -let possibleAliiances = possibleAliiances(teams); -console.log(possibleAliiances); +// let dataset = fetchDataset(); +// let teams = fetchTeams(); +// console.log(teams); +// let pAliiances = possibleAliiances(teams); +// console.log(pAliiances); +let teamB1 = { + sd : 20, + avg: 80 +} + +let teamB2 = { + sd : 20, + avg: 70 +} + +let teamB3 = { + sd : 20, + avg: 20 +} + +let teamR1 = { + sd : 20, + avg: 60 +} + +let teamR2 = { + sd : 20, + avg: 70 +} + +let teamR3 = { + sd : 20, + avg: 30 +} + +console.log("Blue 1" + teamB1) +console.log("Blue 2" + teamB2) +console.log("Blue 3" + teamB3) + +console.log("Red 1" + teamR1) +console.log("Red 2" + teamR2) +console.log("Red 3" + teamR3) + + +let allianceBlue = [teamB1, teamB2, teamB3] +let allianceRed =[teamR1, teamR2, teamR3] + +console.log(allianceBlue) +console.log(allianceRed) + + + +console.log(allianceAverage(allianceBlue)) +console.log(allianceAverage(allianceRed)) +console.log(allianceStandardDeviation(allianceBlue)) +console.log(allianceStandardDeviation(allianceRed)) + +console.log(compareAlliances(allianceBlue, allianceRed)); \ No newline at end of file diff --git a/src/analysis/views/index.ejs b/src/analysis/views/index.ejs index 6e74d70d..8ea5d3f6 100644 --- a/src/analysis/views/index.ejs +++ b/src/analysis/views/index.ejs @@ -126,6 +126,7 @@ + @@ -134,7 +135,7 @@ - + From 283c09ac48c8876259f1a3615b86e7b1740b3fb9 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Mon, 30 Jan 2023 11:26:37 -0600 Subject: [PATCH 07/24] trying to create new module for sim match --- src/analysis/public/js/autoPick.js | 1 + src/analysis/public/js/elements.js | 3 ++- src/analysis/public/js/script.js | 33 +++++++++++++++++++++++++++--- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/analysis/public/js/autoPick.js b/src/analysis/public/js/autoPick.js index c59677a7..e8fffb4a 100644 --- a/src/analysis/public/js/autoPick.js +++ b/src/analysis/public/js/autoPick.js @@ -170,6 +170,7 @@ function compareAllTeams(alliances) { // console.log(teams); // let pAliiances = possibleAliiances(teams); // console.log(pAliiances); +console.log("test") let teamB1 = { sd : 20, diff --git a/src/analysis/public/js/elements.js b/src/analysis/public/js/elements.js index ffa6570d..857b1602 100644 --- a/src/analysis/public/js/elements.js +++ b/src/analysis/public/js/elements.js @@ -12,4 +12,5 @@ const sideList = document.getElementById("side-list") const searchInput = document.getElementById("search-input") const matchViewSwitch = document.getElementById("match-view-switch") const leftAllianceModules = document.getElementById("left-alliance-modules") -const rightAllianceModules = document.getElementById("right-alliance-modules") \ No newline at end of file +const rightAllianceModules = document.getElementById("right-alliance-modules") +// const bothAllianceModules = document.getElementById("both-alliance-modules") \ No newline at end of file diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index 5e0310f2..7aa68ba5 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -17,7 +17,8 @@ if ('serviceWorker' in navigator) { team: [], match: { left: [], - right: [] + right: [], + both: [] } } @@ -225,20 +226,46 @@ if ('serviceWorker' in navigator) { const rightModuleObject = new moduleClasses[module.module](module) rightAllianceModules.appendChild(rightModuleObject.container) modules.match.right.push(rightModuleObject) + + if(m.wholeMatch) { + const bothModuleObjectLeft = new moduleClasses[module.module](module) + leftAllianceModules.appendChild(bothModuleObjectLeft.container) + const bothModuleObjectRight = new moduleClasses[module.module](module) + leftAllianceModules.appendChild(bothModuleObjectRight.container) + // modules.match.both.push(bothModuleObject) + } + } } //call setData on every module in matches async function setMatchModules(alliances) { for (const module of modules.match.left) { - const displayedAlliances = alliances[0].filter(teamNumber => { + var displayedAlliances = alliances[0].filter(teamNumber => { if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } return true }) - + if(module.wholeMatch) { + let allTeams = alliances[0] + allTeams.push('|') + allTeams = allTEams.concat(alliance) + displayedAlliances = allTeams.filter(teamNumber => { + if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { + return false + } + + return true + }) + if (displayedAlliances.length !== 0) { + module.container.classList.remove("hidden") + await module.setData(await module.formatData(displayedAlliances, dataset)) + } else { + module.container.classList.add("hidden") + } + } if (displayedAlliances.length !== 0) { module.container.classList.remove("hidden") await module.setData(await module.formatData(displayedAlliances, dataset)) From a7b199eab5f55497da4c26e0148d9caeb28f26d4 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:26:43 -0600 Subject: [PATCH 08/24] all alliances are collected; working on aggr method --- config/analysis-modules.json | 1 + src/analysis/modules/SingleDisplay/index.js | 40 +++++++++++++++------ src/analysis/public/js/script.js | 21 +++++++++-- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/config/analysis-modules.json b/config/analysis-modules.json index 8c2170d6..a1058af8 100644 --- a/config/analysis-modules.json +++ b/config/analysis-modules.json @@ -228,6 +228,7 @@ "module": "SingleDisplay", "name": "Percent Chance of Winning", "position": "main", + "wholeMatch": true, "options": { "path": "", "decimals": 2 diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 886881ee..d3c047a7 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -15,19 +15,39 @@ class SingleDisplay { formatData(teams, dataset) { let summed - if (teams.length > 1) { - summed = teams.map(team => getPath(dataset.teams[team], this.moduleConfig.options.path, 0)).flat().reduce((acc, i) => acc + i, 0) - } else { - summed = getPath(dataset.teams[teams[0]], this.moduleConfig.options.path, 0) + if(this.moduleConfig.wholeMatch) { + // teams = [b1,b2,b3,|,r1,r3] + // 1 split list of teams + let indexOfPipe = teams.idexOF("|") + let alliance1 = teams.slice(0, indexOfPipe) + let alliance2 = teams.slice(indexOfPipe-1, teams.length) + // 3 identify which calculation to perform + // 4 send output to formattedDiplay + if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot + if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { //optionally summed + } else { //default is undefined + formattedDisplay = 0 + } + + } + else { + + } } + else { + if (teams.length > 1) { + summed = teams.map(team => getPath(dataset.teams[team], this.moduleConfig.options.path, 0)).flat().reduce((acc, i) => acc + i, 0) + } else { + summed = getPath(dataset.teams[teams[0]], this.moduleConfig.options.path, 0) + } - let formattedDisplay - if (this.moduleConfig.options.aggrMethod == "sum") { //optionally summed - formattedDisplay = summed - } else { //default is average - formattedDisplay = summed / teams.length + let formattedDisplay + if (this.moduleConfig.options.aggrMethod == "sum") { //optionally summed + formattedDisplay = summed + } else { //default is average + formattedDisplay = summed / teams.length + } } - formattedDisplay = this.applyModifiers(formattedDisplay) if (isNaN(formattedDisplay) || formattedDisplay == this.moduleConfig.options.hideIfValue) { diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index 7aa68ba5..3d9b502d 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -251,7 +251,7 @@ if ('serviceWorker' in navigator) { if(module.wholeMatch) { let allTeams = alliances[0] allTeams.push('|') - allTeams = allTEams.concat(alliance) + allTeams = allTEams.concat(alliances[1]) displayedAlliances = allTeams.filter(teamNumber => { if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false @@ -282,7 +282,24 @@ if ('serviceWorker' in navigator) { return true }) - + if(module.wholeMatch) { + let allTeams = alliances[1] + allTeams.push('|') + allTeams = allTEams.concat(alliances[0]) + displayedAlliances = allTeams.filter(teamNumber => { + if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { + return false + } + + return true + }) + if (displayedAlliances.length !== 0) { + module.container.classList.remove("hidden") + await module.setData(await module.formatData(displayedAlliances, dataset)) + } else { + module.container.classList.add("hidden") + } + } if (displayedAlliances.length !== 0) { module.container.classList.remove("hidden") await module.setData(await module.formatData(displayedAlliances, dataset)) From d7695a3549dc6e1978749d3086fd55f2d8026971 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Sat, 4 Feb 2023 10:28:59 -0600 Subject: [PATCH 09/24] Ready compute for formattedDisplay --- src/analysis/modules/SingleDisplay/index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index d3c047a7..388578be 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -21,11 +21,12 @@ class SingleDisplay { let indexOfPipe = teams.idexOF("|") let alliance1 = teams.slice(0, indexOfPipe) let alliance2 = teams.slice(indexOfPipe-1, teams.length) - // 3 identify which calculation to perform - // 4 send output to formattedDiplay if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot - if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { //optionally summed - } else { //default is undefined + if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform + // 4 send output to formattedDisplay + formattedDisplay = this.percentChanceOfWinning(alliance1, alliance2) + } + else { //default is undefined formattedDisplay = 0 } From ec7476d27dd29ca98b9cb4edf6fa6c78333efb52 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Sat, 4 Feb 2023 11:04:12 -0600 Subject: [PATCH 10/24] formattedData; Updated Display module --- config/analysis-modules.json | 2 +- config/analysis-pipeline.json | 9 +++++ package.json | 2 +- src/analysis/modules/SingleDisplay/index.js | 42 ++++++++++++++++++++- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/config/analysis-modules.json b/config/analysis-modules.json index a1058af8..1e837bb9 100644 --- a/config/analysis-modules.json +++ b/config/analysis-modules.json @@ -230,7 +230,7 @@ "position": "main", "wholeMatch": true, "options": { - "path": "", + "aggrMethod" : "percentChanceOfWinning", "decimals": 2 } }, diff --git a/config/analysis-pipeline.json b/config/analysis-pipeline.json index d0b67b74..bb0d5896 100644 --- a/config/analysis-pipeline.json +++ b/config/analysis-pipeline.json @@ -449,5 +449,14 @@ "averages.lowerHub": "L" } } + }, + { + "type": "team", + "name": "standardDeviation", + "outputPath": "standardDeviation", + "options": { + "path" : "scores.all" + } } + ] \ No newline at end of file diff --git a/package.json b/package.json index 293c2c99..ec98bd69 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "spot", "version": "1.0.0", - "description": "", + "description": "SPOT is an open-source modular scouting app framework for FRC developed by Team 3061 Huskie Robotics. SPOT provides a simple platform upon which a team can build a scouting app with little to no prior experience.", "main": "./src/app.js", "scripts": { "start": "node src/app.js", diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 388578be..7c1c2d5d 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -24,7 +24,7 @@ class SingleDisplay { if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform // 4 send output to formattedDisplay - formattedDisplay = this.percentChanceOfWinning(alliance1, alliance2) + formattedDisplay = this.compareAlliances(alliance1, alliance2) } else { //default is undefined formattedDisplay = 0 @@ -32,7 +32,7 @@ class SingleDisplay { } else { - + formattedDisplay = 0 } } else { @@ -82,4 +82,42 @@ class SingleDisplay { this.header.innerText = this.moduleConfig.name this.display.innerText = data } + + matchAverage(alliance1, alliance2) { + alliance1Avg = 0 + for (a in alliance1) { + data = getPath(dataset.teams[a],"averageScores",0) + alliance1Avg += data + } + alliance2Avg = 0 + for (a in alliance2) { + data = getPath(dataset.teams[a],"averageScores",0) + alliance1Avg += data + } + return alliance1Avg - alliance2Avg + } + + matchStandardDeviation(alliance1, alliance2) { + alliance1SD = 0 + for (a in alliance1) { + data = getPath(dataset.teams[a],"standardDeviation",0) + alliance1SD += Math.pow(data, 2) + } + alliance1SD = Math.sqrt(alliance1SD) + alliance2SD = 0 + for (a in alliance2) { + data = getPath(dataset.teams[a],"standardDeviation",0) + alliance1SD += Math.pow(data, 2) + } + alliance2SD = Math.sqrt(alliance2SD) + return Math.sqrt(Math.pow(alliance1SD, 2) + Math.pow(alliance2SD, 2)) + } + + compareAlliances(alliance1, alliance2) { + zscore = ss.zScore(0, matchAverage(alliance1, alliance2), matchStandardDeviation(alliance1, alliance2)) + probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) + return 1 - probAlliance2Wins; + } + + } \ No newline at end of file From 54ac7508210bafa79f78f2aa343e611a5345dd52 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Sat, 4 Feb 2023 15:06:19 -0600 Subject: [PATCH 11/24] debugging autopick --- config/analysis-modules.json | 2 +- config/analysis-pipeline.json | 2 +- src/analysis/modules/Grid/index.js | 2 +- src/analysis/modules/Pie/index.js | 4 ++-- src/analysis/modules/SingleDisplay/index.js | 25 ++++++++++++--------- src/analysis/public/js/script.js | 22 ++++++++++-------- src/analysis/public/js/util.js | 2 +- 7 files changed, 33 insertions(+), 26 deletions(-) diff --git a/config/analysis-modules.json b/config/analysis-modules.json index e436371d..bf44c8da 100644 --- a/config/analysis-modules.json +++ b/config/analysis-modules.json @@ -526,7 +526,7 @@ "module": "SingleDisplay", "name": "Percent Chance of Winning", "position": "main", - "wholeMatch": true, + "wholeMatch": true, "options": { "aggrMethod" : "percentChanceOfWinning", "decimals": 2 diff --git a/config/analysis-pipeline.json b/config/analysis-pipeline.json index b4dfd48a..3357b97e 100644 --- a/config/analysis-pipeline.json +++ b/config/analysis-pipeline.json @@ -498,7 +498,7 @@ "name": "standardDeviation", "outputPath": "standardDeviation", "options": { - "path" : "scores.all" + "path" : "scores.total" } } diff --git a/src/analysis/modules/Grid/index.js b/src/analysis/modules/Grid/index.js index 89a1f912..8f71d044 100644 --- a/src/analysis/modules/Grid/index.js +++ b/src/analysis/modules/Grid/index.js @@ -16,7 +16,7 @@ class Grid { let newObj = { x:cell.x, y:cell.y, - data:teams.map((team)=>{let data = getPath(dataset.teams[team],cell.path,0).toFixed(this.moduleConfig.options.decimals);console.log(data);return data }).reduce((acc, i) => acc + parseFloat(i), 0).toFixed(this.moduleConfig.options.decimals), + data:teams.map((team)=>{let data = getPath(dataset.teams[team],cell.path,0).toFixed(this.moduleConfig.options.decimals);return data }).reduce((acc, i) => acc + parseFloat(i), 0).toFixed(this.moduleConfig.options.decimals), hex:cell.hex, } return newObj diff --git a/src/analysis/modules/Pie/index.js b/src/analysis/modules/Pie/index.js index 2fc433c9..d720aba8 100644 --- a/src/analysis/modules/Pie/index.js +++ b/src/analysis/modules/Pie/index.js @@ -9,7 +9,8 @@ class Pie { formatData(teams, dataset) { const values = this.moduleConfig.options.slices.map((slice) => { - const summed = teams.map(team => {console.log(team);return getPath(dataset.teams[team], slice.path)}).flat().reduce((acc, i) => acc + i, 0) + + const summed = teams.map(team => {let data = getPath(dataset.teams[team], slice.path); console.log(`${slice.path}: ${data}`);return data}).flat().reduce((acc, i) => acc + i, 0) if (slice.aggrMethod == "sum") { //optionally summed return summed } else { //default is average @@ -32,7 +33,6 @@ class Pie { } ] - console.log(data) return data } diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 7c1c2d5d..635c549f 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -15,34 +15,34 @@ class SingleDisplay { formatData(teams, dataset) { let summed + let formattedDisplay if(this.moduleConfig.wholeMatch) { // teams = [b1,b2,b3,|,r1,r3] // 1 split list of teams - let indexOfPipe = teams.idexOF("|") + let indexOfPipe = teams.indexOf("|") let alliance1 = teams.slice(0, indexOfPipe) - let alliance2 = teams.slice(indexOfPipe-1, teams.length) + let alliance2 = teams.slice(indexOfPipe+1, teams.length) + console.log(`alliances: ${alliance1} and ${alliance2}`) if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform // 4 send output to formattedDisplay + + console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2)) formattedDisplay = this.compareAlliances(alliance1, alliance2) - } - else { //default is undefined + } else { //default is undefined formattedDisplay = 0 } - } - else { + } else { formattedDisplay = 0 } - } - else { + } else { if (teams.length > 1) { summed = teams.map(team => getPath(dataset.teams[team], this.moduleConfig.options.path, 0)).flat().reduce((acc, i) => acc + i, 0) } else { summed = getPath(dataset.teams[teams[0]], this.moduleConfig.options.path, 0) } - let formattedDisplay if (this.moduleConfig.options.aggrMethod == "sum") { //optionally summed formattedDisplay = summed } else { //default is average @@ -62,7 +62,6 @@ class SingleDisplay { formattedDisplay += this.moduleConfig.options.unit } } - return formattedDisplay } @@ -86,11 +85,13 @@ class SingleDisplay { matchAverage(alliance1, alliance2) { alliance1Avg = 0 for (a in alliance1) { + console.log("a AVG" + getPath(dataset.teams[a],"averageScores",0)) data = getPath(dataset.teams[a],"averageScores",0) alliance1Avg += data } alliance2Avg = 0 for (a in alliance2) { + console.log("a AVG" + getPath(dataset.teams[a],"averageScores",0)) data = getPath(dataset.teams[a],"averageScores",0) alliance1Avg += data } @@ -100,12 +101,14 @@ class SingleDisplay { matchStandardDeviation(alliance1, alliance2) { alliance1SD = 0 for (a in alliance1) { + console.log("a SD" + getPath(dataset.teams[a],"standardDeviation",0)) data = getPath(dataset.teams[a],"standardDeviation",0) alliance1SD += Math.pow(data, 2) } alliance1SD = Math.sqrt(alliance1SD) alliance2SD = 0 for (a in alliance2) { + console.log("a SD" + getPath(dataset.teams[a],"standardDeviation",0)) data = getPath(dataset.teams[a],"standardDeviation",0) alliance1SD += Math.pow(data, 2) } @@ -114,7 +117,7 @@ class SingleDisplay { } compareAlliances(alliance1, alliance2) { - zscore = ss.zScore(0, matchAverage(alliance1, alliance2), matchStandardDeviation(alliance1, alliance2)) + zscore = ss.zScore(0, this.matchAverage(alliance1, alliance2), this.matchStandardDeviation(alliance1, alliance2)) probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) return 1 - probAlliance2Wins; } diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index 4254ad2b..356683d1 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -233,7 +233,7 @@ if ('serviceWorker' in navigator) { rightAllianceModules.appendChild(rightModuleObject.container) modules.match.right.push(rightModuleObject) - if(m.wholeMatch) { + if(module.wholeMatch) { const bothModuleObjectLeft = new moduleClasses[module.module](module) leftAllianceModules.appendChild(bothModuleObjectLeft.container) const bothModuleObjectRight = new moduleClasses[module.module](module) @@ -247,19 +247,21 @@ if ('serviceWorker' in navigator) { //call setData on every module in matches async function setMatchModules(alliances) { for (const module of modules.match.left) { + console.log(module.moduleConfig.name) var displayedAlliances = alliances[0].filter(teamNumber => { - if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { + if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } return true }) - if(module.wholeMatch) { + if(module.moduleConfig.wholeMatch) { + console.log(module.moduleConfig.wholeMatch) let allTeams = alliances[0] allTeams.push('|') - allTeams = allTEams.concat(alliances[1]) + allTeams = allTeams.concat(alliances[1]) displayedAlliances = allTeams.filter(teamNumber => { - if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { + if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } @@ -281,19 +283,21 @@ if ('serviceWorker' in navigator) { } for (const module of modules.match.right) { + console.log(module.moduleConfig.name) const displayedAlliances = alliances[1].filter(teamNumber => { - if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { + if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } return true }) - if(module.wholeMatch) { + if(module.moduleConfig.wholeMatch) { let allTeams = alliances[1] allTeams.push('|') - allTeams = allTEams.concat(alliances[0]) + allTeams = allTeams.concat(alliances[0]) + console.log(`whole match right side ${allTeams}`) displayedAlliances = allTeams.filter(teamNumber => { - if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { + if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } diff --git a/src/analysis/public/js/util.js b/src/analysis/public/js/util.js index fa696819..35795abc 100644 --- a/src/analysis/public/js/util.js +++ b/src/analysis/public/js/util.js @@ -22,7 +22,7 @@ function clearDiv(div) { function getPath(obj,path,ifnone=ThrowError) { if (typeof obj === "undefined") { if (ifnone == ThrowError) { - throw new Error("path not traversable!"); + throw new Error(`path ${path} not traversable!`); } else { return ifnone; } From 5635b91002561d0f04d16c81c272cb515ddc287f Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Tue, 7 Feb 2023 11:50:20 -0600 Subject: [PATCH 12/24] broke n --- src/analysis/modules/Pie/index.js | 1 - src/analysis/public/js/script.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/analysis/modules/Pie/index.js b/src/analysis/modules/Pie/index.js index d720aba8..c6beefaf 100644 --- a/src/analysis/modules/Pie/index.js +++ b/src/analysis/modules/Pie/index.js @@ -9,7 +9,6 @@ class Pie { formatData(teams, dataset) { const values = this.moduleConfig.options.slices.map((slice) => { - const summed = teams.map(team => {let data = getPath(dataset.teams[team], slice.path); console.log(`${slice.path}: ${data}`);return data}).flat().reduce((acc, i) => acc + i, 0) if (slice.aggrMethod == "sum") { //optionally summed return summed diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index 356683d1..87a894cc 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -223,7 +223,7 @@ if ('serviceWorker' in navigator) { } }) - //create match module objects and append placeholders to module list elements + //create match module objects and append placeholders to module list elements for (const module of modulesConfig.filter(m => m.view == "match")) { const leftModuleObject = new moduleClasses[module.module](module) leftAllianceModules.appendChild(leftModuleObject.container) From 707891157db051a0e8e19b11bcee3a324f56081a Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Wed, 8 Feb 2023 12:03:51 -0600 Subject: [PATCH 13/24] teams array is wrong --- config/analysis-modules.json | 3 +++ src/analysis/modules/Pie/index.js | 4 +++- src/analysis/modules/SingleDisplay/index.js | 12 ++++++++---- src/analysis/public/js/script.js | 9 ++++----- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/config/analysis-modules.json b/config/analysis-modules.json index bf44c8da..5bc2eaca 100644 --- a/config/analysis-modules.json +++ b/config/analysis-modules.json @@ -85,6 +85,7 @@ "module": "Pie", "position":"main", "name":"Avg Cone Pickups", + "wholeMatch": false, "options":{ "slices":[ { @@ -115,6 +116,7 @@ "module": "Pie", "position":"main", "name":"Avg Cube Pickups", + "wholeMatch": false, "options":{ "slices":[ { @@ -560,6 +562,7 @@ "module": "Pie", "position":"main", "name":"Avg Cone Pickups", + "wholeMatch": false, "options":{ "slices":[ { diff --git a/src/analysis/modules/Pie/index.js b/src/analysis/modules/Pie/index.js index c6beefaf..76361e7f 100644 --- a/src/analysis/modules/Pie/index.js +++ b/src/analysis/modules/Pie/index.js @@ -8,8 +8,10 @@ class Pie { } formatData(teams, dataset) { + console.log(`pie teams recieved: ${teams}`); + let filteredTeams = teams.filter(team=>team!="|"); const values = this.moduleConfig.options.slices.map((slice) => { - const summed = teams.map(team => {let data = getPath(dataset.teams[team], slice.path); console.log(`${slice.path}: ${data}`);return data}).flat().reduce((acc, i) => acc + i, 0) + const summed = filteredTeams.map(team => {let data = getPath(dataset.teams[team], slice.path); console.log(`${slice.path}: ${data}`);return data}).flat().reduce((acc, i) => acc + i, 0) if (slice.aggrMethod == "sum") { //optionally summed return summed } else { //default is average diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 635c549f..f1047a1f 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -17,23 +17,27 @@ class SingleDisplay { let summed let formattedDisplay if(this.moduleConfig.wholeMatch) { + console.log("this happened") // teams = [b1,b2,b3,|,r1,r3] // 1 split list of teams + console.log(`teams: ${teams}`) let indexOfPipe = teams.indexOf("|") - let alliance1 = teams.slice(0, indexOfPipe) - let alliance2 = teams.slice(indexOfPipe+1, teams.length) + let alliance1 = [3061] //teams.slice(0, indexOfPipe) + let alliance2 = [3061] //teams.slice(indexOfPipe+1, teams.length) console.log(`alliances: ${alliance1} and ${alliance2}`) if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform // 4 send output to formattedDisplay - - console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2)) + console.log("this is good") + ocnsole.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2)) formattedDisplay = this.compareAlliances(alliance1, alliance2) } else { //default is undefined + console.log("bad") formattedDisplay = 0 } } else { + console.log("also bad") formattedDisplay = 0 } } else { diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index 87a894cc..f252cbd2 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -255,8 +255,7 @@ if ('serviceWorker' in navigator) { return true }) - if(module.moduleConfig.wholeMatch) { - console.log(module.moduleConfig.wholeMatch) + if(module.wholeMatch) { let allTeams = alliances[0] allTeams.push('|') allTeams = allTeams.concat(alliances[1]) @@ -284,19 +283,19 @@ if ('serviceWorker' in navigator) { for (const module of modules.match.right) { console.log(module.moduleConfig.name) - const displayedAlliances = alliances[1].filter(teamNumber => { + var displayedAlliances = alliances[1].filter(teamNumber => { if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } return true }) - if(module.moduleConfig.wholeMatch) { + if(module.wholeMatch) { let allTeams = alliances[1] allTeams.push('|') allTeams = allTeams.concat(alliances[0]) console.log(`whole match right side ${allTeams}`) - displayedAlliances = allTeams.filter(teamNumber => { + var displayedAlliances = allTeams.filter(teamNumber => { if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } From 0c9140e14043564c7d676280f53fc68af05071d6 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Thu, 9 Feb 2023 11:50:35 -0600 Subject: [PATCH 14/24] hard coded team; resolved some errors --- src/analysis/modules/SingleDisplay/index.js | 47 +++++++++++---------- src/analysis/public/js/script.js | 1 + 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index f1047a1f..83d1d668 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -18,6 +18,7 @@ class SingleDisplay { let formattedDisplay if(this.moduleConfig.wholeMatch) { console.log("this happened") + console.log(`dataset ${dataset}`) // teams = [b1,b2,b3,|,r1,r3] // 1 split list of teams console.log(`teams: ${teams}`) @@ -29,11 +30,13 @@ class SingleDisplay { if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform // 4 send output to formattedDisplay console.log("this is good") - ocnsole.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2)) + console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) formattedDisplay = this.compareAlliances(alliance1, alliance2) } else { //default is undefined console.log("bad") formattedDisplay = 0 + console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) + formattedDisplay = this.compareAlliances(alliance1, alliance2) } } else { @@ -86,42 +89,40 @@ class SingleDisplay { this.display.innerText = data } - matchAverage(alliance1, alliance2) { - alliance1Avg = 0 - for (a in alliance1) { - console.log("a AVG" + getPath(dataset.teams[a],"averageScores",0)) - data = getPath(dataset.teams[a],"averageScores",0) - alliance1Avg += data + matchAverage(alliance1, alliance2, dataset){ + let alliance1Avg = 0 + for (const a of alliance1) { + console.log("a AVG" + getPath(Object.entries(dataset.teams)[a],"averageScores",0)) + alliance1Avg += getPath(Object.entries(dataset.teams)[a],"averageScores",0) } - alliance2Avg = 0 - for (a in alliance2) { - console.log("a AVG" + getPath(dataset.teams[a],"averageScores",0)) - data = getPath(dataset.teams[a],"averageScores",0) - alliance1Avg += data + let alliance2Avg = 0 + for (const a of alliance2) { + console.log("a AVG" + getPath(Object.entries(dataset.teams)[a],"averageScores",0)) + alliance1Avg += getPath(Object.entries(dataset.teams)[a],"averageScores",0) } return alliance1Avg - alliance2Avg } - matchStandardDeviation(alliance1, alliance2) { - alliance1SD = 0 - for (a in alliance1) { - console.log("a SD" + getPath(dataset.teams[a],"standardDeviation",0)) - data = getPath(dataset.teams[a],"standardDeviation",0) + matchStandardDeviation(alliance1, alliance2, dataset) { + let alliance1SD = 0 + for (const a of alliance1) { + console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) + let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) alliance1SD += Math.pow(data, 2) } alliance1SD = Math.sqrt(alliance1SD) - alliance2SD = 0 - for (a in alliance2) { - console.log("a SD" + getPath(dataset.teams[a],"standardDeviation",0)) - data = getPath(dataset.teams[a],"standardDeviation",0) + let alliance2SD = 0 + for (const a of alliance2) { + console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) + let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) alliance1SD += Math.pow(data, 2) } alliance2SD = Math.sqrt(alliance2SD) return Math.sqrt(Math.pow(alliance1SD, 2) + Math.pow(alliance2SD, 2)) } - compareAlliances(alliance1, alliance2) { - zscore = ss.zScore(0, this.matchAverage(alliance1, alliance2), this.matchStandardDeviation(alliance1, alliance2)) + compareAlliances(alliance1, alliance2, dataset) { + zscore = ss.zScore(0, this.matchAverage(alliance1, alliance2, dataset), this.matchStandardDeviation(alliance1, alliance2, dataset)) probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) return 1 - probAlliance2Wins; } diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index f252cbd2..31d37507 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -257,6 +257,7 @@ if ('serviceWorker' in navigator) { }) if(module.wholeMatch) { let allTeams = alliances[0] + console.log(`alliances script.js ${alliances}`) allTeams.push('|') allTeams = allTeams.concat(alliances[1]) displayedAlliances = allTeams.filter(teamNumber => { From 9b4a11b7ed84743a87c8dc7d3e523285d598bdf0 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Fri, 10 Feb 2023 11:26:36 -0600 Subject: [PATCH 15/24] Trying to comment out and work backwards --- src/analysis/modules/SingleDisplay/index.js | 79 +++++++++++---------- src/analysis/public/js/autoPick.js | 1 - 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 83d1d668..7b982ce1 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -14,35 +14,36 @@ class SingleDisplay { } formatData(teams, dataset) { - let summed + let teamsArray = [3061, "|", 3061] + let summed let formattedDisplay if(this.moduleConfig.wholeMatch) { console.log("this happened") console.log(`dataset ${dataset}`) // teams = [b1,b2,b3,|,r1,r3] // 1 split list of teams - console.log(`teams: ${teams}`) - let indexOfPipe = teams.indexOf("|") - let alliance1 = [3061] //teams.slice(0, indexOfPipe) - let alliance2 = [3061] //teams.slice(indexOfPipe+1, teams.length) + console.log(`teams: ${teamsArray}`) + let indexOfPipe = teamsArray.indexOf("|") + let alliance1 = teamsArray.slice(0, indexOfPipe) + let alliance2 = teamsArray.slice(indexOfPipe+1, teamsArray.length) console.log(`alliances: ${alliance1} and ${alliance2}`) - if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot - if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform - // 4 send output to formattedDisplay - console.log("this is good") - console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) - formattedDisplay = this.compareAlliances(alliance1, alliance2) - } else { //default is undefined - console.log("bad") - formattedDisplay = 0 - console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) - formattedDisplay = this.compareAlliances(alliance1, alliance2) - } + // if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot + // if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform + // // 4 send output to formattedDisplay + // console.log("this is good") + console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) + formattedDisplay = this.compareAlliances(alliance1, alliance2, dataset) + // } else { //default is undefined + // console.log("bad") + // formattedDisplay = 0 + // console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) + // formattedDisplay = this.compareAlliances(alliance1, alliance2) + // } - } else { - console.log("also bad") - formattedDisplay = 0 - } + // } else { + // console.log("also bad") + // formattedDisplay = 0 + // } } else { if (teams.length > 1) { summed = teams.map(team => getPath(dataset.teams[team], this.moduleConfig.options.path, 0)).flat().reduce((acc, i) => acc + i, 0) @@ -91,32 +92,32 @@ class SingleDisplay { matchAverage(alliance1, alliance2, dataset){ let alliance1Avg = 0 - for (const a of alliance1) { - console.log("a AVG" + getPath(Object.entries(dataset.teams)[a],"averageScores",0)) - alliance1Avg += getPath(Object.entries(dataset.teams)[a],"averageScores",0) - } + // for (const a of alliance1) { + // console.log("a AVG" + getPath(Object.entries(dataset.teams)[a],"averageScores",0)) + // alliance1Avg += getPath(Object.entries(dataset.teams)[a],"averageScores",0) + // } let alliance2Avg = 0 - for (const a of alliance2) { - console.log("a AVG" + getPath(Object.entries(dataset.teams)[a],"averageScores",0)) - alliance1Avg += getPath(Object.entries(dataset.teams)[a],"averageScores",0) - } + // for (const a of alliance2) { + // console.log("a AVG" + getPath(Object.entries(dataset.teams)[a],"averageScores",0)) + // alliance1Avg += getPath(Object.entries(dataset.teams)[a],"averageScores",0) + // } return alliance1Avg - alliance2Avg } matchStandardDeviation(alliance1, alliance2, dataset) { let alliance1SD = 0 - for (const a of alliance1) { - console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) - let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) - alliance1SD += Math.pow(data, 2) - } + // for (const a of alliance1) { + // console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) + // let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) + // alliance1SD += Math.pow(data, 2) + // } alliance1SD = Math.sqrt(alliance1SD) let alliance2SD = 0 - for (const a of alliance2) { - console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) - let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) - alliance1SD += Math.pow(data, 2) - } + // for (const a of alliance2) { + // console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) + // let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) + // alliance1SD += Math.pow(data, 2) + // } alliance2SD = Math.sqrt(alliance2SD) return Math.sqrt(Math.pow(alliance1SD, 2) + Math.pow(alliance2SD, 2)) } diff --git a/src/analysis/public/js/autoPick.js b/src/analysis/public/js/autoPick.js index e8fffb4a..f8291257 100644 --- a/src/analysis/public/js/autoPick.js +++ b/src/analysis/public/js/autoPick.js @@ -160,7 +160,6 @@ function compareAllTeams(alliances) { for(a in allianceProb){ } - } //----------------------------------------------------------------------------------------------------------------------------------// From 3cbd7890219291fdb090847ba777cd828cda6436 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Tue, 14 Feb 2023 11:50:35 -0600 Subject: [PATCH 16/24] able to predict with hardcoded alliances; --- src/analysis/modules/SingleDisplay/index.js | 24 +++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 7b982ce1..f29a057c 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -14,7 +14,7 @@ class SingleDisplay { } formatData(teams, dataset) { - let teamsArray = [3061, "|", 3061] + let teamsArray = [3734, "|", 3734] let summed let formattedDisplay if(this.moduleConfig.wholeMatch) { @@ -92,27 +92,26 @@ class SingleDisplay { matchAverage(alliance1, alliance2, dataset){ let alliance1Avg = 0 - // for (const a of alliance1) { - // console.log("a AVG" + getPath(Object.entries(dataset.teams)[a],"averageScores",0)) - // alliance1Avg += getPath(Object.entries(dataset.teams)[a],"averageScores",0) - // } + for (const a of alliance1) { + console.log() + alliance1Avg += getPath(dataset.teams[a],"averageScores.total",0) + } let alliance2Avg = 0 - // for (const a of alliance2) { - // console.log("a AVG" + getPath(Object.entries(dataset.teams)[a],"averageScores",0)) - // alliance1Avg += getPath(Object.entries(dataset.teams)[a],"averageScores",0) - // } + for (const a of alliance2) { + alliance2Avg += getPath(dataset.teams[a],"averageScores.total",0) + } return alliance1Avg - alliance2Avg } matchStandardDeviation(alliance1, alliance2, dataset) { - let alliance1SD = 0 + let alliance1SD = 10 // for (const a of alliance1) { // console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) // let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) // alliance1SD += Math.pow(data, 2) // } alliance1SD = Math.sqrt(alliance1SD) - let alliance2SD = 0 + let alliance2SD = 10 // for (const a of alliance2) { // console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) // let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) @@ -123,7 +122,10 @@ class SingleDisplay { } compareAlliances(alliance1, alliance2, dataset) { + console.log("matchAverage: " + this.matchAverage(alliance1, alliance2, dataset)) + console.log("matchStandardDeviation: " + this.matchStandardDeviation(alliance1, alliance2, dataset)) zscore = ss.zScore(0, this.matchAverage(alliance1, alliance2, dataset), this.matchStandardDeviation(alliance1, alliance2, dataset)) + console.log("zscore: " + zscore) probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) return 1 - probAlliance2Wins; } From 73581c3d8dd37b79b23cfc04d4f84058a328f741 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Wed, 15 Feb 2023 12:03:14 -0600 Subject: [PATCH 17/24] teams being passed into method aren't as expected --- src/analysis/modules/SingleDisplay/index.js | 43 +++++++++++---------- src/analysis/public/js/script.js | 15 +++++-- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index f29a057c..07716867 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -14,23 +14,23 @@ class SingleDisplay { } formatData(teams, dataset) { - let teamsArray = [3734, "|", 3734] + console.log("teams: " + teams) + let teamsArray = teams let summed let formattedDisplay if(this.moduleConfig.wholeMatch) { - console.log("this happened") - console.log(`dataset ${dataset}`) // teams = [b1,b2,b3,|,r1,r3] // 1 split list of teams - console.log(`teams: ${teamsArray}`) + console.log(`teams filtered: ${teamsArray}`) let indexOfPipe = teamsArray.indexOf("|") let alliance1 = teamsArray.slice(0, indexOfPipe) let alliance2 = teamsArray.slice(indexOfPipe+1, teamsArray.length) + alliance2.filter(team => team != "|") console.log(`alliances: ${alliance1} and ${alliance2}`) - // if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot - // if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform - // // 4 send output to formattedDisplay - // console.log("this is good") + //if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot + //if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform + // 4 send output to formattedDisplay + console.log("this is good") console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) formattedDisplay = this.compareAlliances(alliance1, alliance2, dataset) // } else { //default is undefined @@ -93,7 +93,6 @@ class SingleDisplay { matchAverage(alliance1, alliance2, dataset){ let alliance1Avg = 0 for (const a of alliance1) { - console.log() alliance1Avg += getPath(dataset.teams[a],"averageScores.total",0) } let alliance2Avg = 0 @@ -104,20 +103,22 @@ class SingleDisplay { } matchStandardDeviation(alliance1, alliance2, dataset) { - let alliance1SD = 10 - // for (const a of alliance1) { - // console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) - // let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) - // alliance1SD += Math.pow(data, 2) - // } + let alliance1SD = 0 + for (const a of alliance1) { + console.log(a + " SD1: " + getPath(dataset.teams[a],"standardDeviation",0)) + let data = getPath(dataset.teams[a],"standardDeviation",0) + alliance1SD += Math.pow(data, 2) + } alliance1SD = Math.sqrt(alliance1SD) - let alliance2SD = 10 - // for (const a of alliance2) { - // console.log("a SD" + getPath(Object.entries(dataset.teams)[a],"standardDeviation",0)) - // let data = getPath(Object.entries(dataset.teams)[a],"standardDeviation",0) - // alliance1SD += Math.pow(data, 2) - // } + console.log("alliance1SD: " + alliance1SD) + let alliance2SD = 0 + for (const a of alliance2) { + console.log(a + " SD2: " + getPath(dataset.teams[a],"standardDeviation",0)) + let data = getPath(dataset.teams[a],"standardDeviation",0) + alliance2SD += Math.pow(data, 2) + } alliance2SD = Math.sqrt(alliance2SD) + console.log("alliance2SD: " + alliance2SD) return Math.sqrt(Math.pow(alliance1SD, 2) + Math.pow(alliance2SD, 2)) } diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index 31d37507..a0b49152 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -255,11 +255,12 @@ if ('serviceWorker' in navigator) { return true }) - if(module.wholeMatch) { + if(module.moduleConfig.wholeMatch) { let allTeams = alliances[0] console.log(`alliances script.js ${alliances}`) allTeams.push('|') allTeams = allTeams.concat(alliances[1]) + console.log(`all teams: ${allTeams}`) displayedAlliances = allTeams.filter(teamNumber => { if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false @@ -267,9 +268,14 @@ if ('serviceWorker' in navigator) { return true }) + console.log(`displayed alliances: ${displayedAlliances}`) if (displayedAlliances.length !== 0) { module.container.classList.remove("hidden") - await module.setData(await module.formatData(displayedAlliances, dataset)) + await module.setData(await module.formatData(allTeams, dataset)) + /** + * TODO: fix the filtering + * allTeams on line 274 should be displayedAlliances + */ } else { module.container.classList.add("hidden") } @@ -291,11 +297,11 @@ if ('serviceWorker' in navigator) { return true }) - if(module.wholeMatch) { + if(module.moduleConfig.wholeMatch) { let allTeams = alliances[1] allTeams.push('|') allTeams = allTeams.concat(alliances[0]) - console.log(`whole match right side ${allTeams}`) + console.log(`all teams: ${allTeams}`) var displayedAlliances = allTeams.filter(teamNumber => { if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false @@ -303,6 +309,7 @@ if ('serviceWorker' in navigator) { return true }) + console.log(`displayed alliances: ${displayedAlliances}`) if (displayedAlliances.length !== 0) { module.container.classList.remove("hidden") await module.setData(await module.formatData(displayedAlliances, dataset)) From 1cb82cc01f490932fc3d54a67755f2035c7ffee9 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Wed, 15 Feb 2023 19:15:13 -0600 Subject: [PATCH 18/24] Computes chance of winning; sometimes it seems buggy, but need more testing; two divs randomly appear on left --- src/analysis/modules/SingleDisplay/index.js | 8 +++++--- src/analysis/public/js/script.js | 13 +++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 07716867..c721f202 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -21,12 +21,14 @@ class SingleDisplay { if(this.moduleConfig.wholeMatch) { // teams = [b1,b2,b3,|,r1,r3] // 1 split list of teams - console.log(`teams filtered: ${teamsArray}`) let indexOfPipe = teamsArray.indexOf("|") let alliance1 = teamsArray.slice(0, indexOfPipe) let alliance2 = teamsArray.slice(indexOfPipe+1, teamsArray.length) - alliance2.filter(team => team != "|") - console.log(`alliances: ${alliance1} and ${alliance2}`) + alliance2 = alliance2.filter(team => team != "|") + console.log(`alliance 1: ${alliance1}`) + console.log(`alliance 2: ${alliance2}`) + + // alliance2.splice(alliance2.indexOf("|"), alliance2.indexOf("|"+1)) //if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot //if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform // 4 send output to formattedDisplay diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index a0b49152..eee174f5 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -249,10 +249,11 @@ if ('serviceWorker' in navigator) { for (const module of modules.match.left) { console.log(module.moduleConfig.name) var displayedAlliances = alliances[0].filter(teamNumber => { - if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { + if(teamNumber == "|"){return false} + if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } - + return true }) if(module.moduleConfig.wholeMatch) { @@ -265,7 +266,6 @@ if ('serviceWorker' in navigator) { if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } - return true }) console.log(`displayed alliances: ${displayedAlliances}`) @@ -274,7 +274,7 @@ if ('serviceWorker' in navigator) { await module.setData(await module.formatData(allTeams, dataset)) /** * TODO: fix the filtering - * allTeams on line 274 should be displayedAlliances + * allTeams on line 274 should be maybe displayedAlliances */ } else { module.container.classList.add("hidden") @@ -291,10 +291,11 @@ if ('serviceWorker' in navigator) { for (const module of modules.match.right) { console.log(module.moduleConfig.name) var displayedAlliances = alliances[1].filter(teamNumber => { - if (!module.moduleConfig.separate && teamNumber != "|" && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { + if(teamNumber == "|"){return false} + if (!module.moduleConfig.separate && Object.keys(dataset.teams[teamNumber]).filter(prop => prop !== "manual").length == 0) { return false } - + return true }) if(module.moduleConfig.wholeMatch) { From a5178783f62bf1dd634658ab5a1401b84c1d5928 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Thu, 16 Feb 2023 11:16:02 -0600 Subject: [PATCH 19/24] Got rid of random boxes --- src/analysis/modules/SingleDisplay/index.js | 1 + src/analysis/public/js/script.js | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index c721f202..31dedec4 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -11,6 +11,7 @@ class SingleDisplay { this.display = createDOMElement("div", "display") this.container.appendChild(this.header) this.container.appendChild(this.display) + this.header.innerHTML = "No Data" } formatData(teams, dataset) { diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index eee174f5..fa6450e4 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -233,13 +233,13 @@ if ('serviceWorker' in navigator) { rightAllianceModules.appendChild(rightModuleObject.container) modules.match.right.push(rightModuleObject) - if(module.wholeMatch) { - const bothModuleObjectLeft = new moduleClasses[module.module](module) - leftAllianceModules.appendChild(bothModuleObjectLeft.container) - const bothModuleObjectRight = new moduleClasses[module.module](module) - leftAllianceModules.appendChild(bothModuleObjectRight.container) - // modules.match.both.push(bothModuleObject) - } + // if(module.wholeMatch) { + // const bothModuleObjectLeft = new moduleClasses[module.module](module) + // leftAllianceModules.appendChild(bothModuleObjectLeft.container) + // const bothModuleObjectRight = new moduleClasses[module.module](module) + // rightAllianceModules.appendChild(bothModuleObjectRight.container) + // // modules.match.both.push(bothModuleObject) + // } } } From 660ea4b43a045c5056fa2ab9173404309286f96c Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Fri, 17 Feb 2023 10:57:18 -0600 Subject: [PATCH 20/24] cleaned up comments and console.logs; updated to use aggr method --- src/analysis/modules/SingleDisplay/index.js | 27 ++++++--------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 31dedec4..b641c634 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -26,27 +26,14 @@ class SingleDisplay { let alliance1 = teamsArray.slice(0, indexOfPipe) let alliance2 = teamsArray.slice(indexOfPipe+1, teamsArray.length) alliance2 = alliance2.filter(team => team != "|") - console.log(`alliance 1: ${alliance1}`) - console.log(`alliance 2: ${alliance2}`) - - // alliance2.splice(alliance2.indexOf("|"), alliance2.indexOf("|"+1)) - //if(alliance1.length > 0){ // 2 validate alliances have at least 1 robot - //if (this.moduleConfig.options.aggrMethod == "percentChanceOfWin") { // 3 identify which calculation to perform - // 4 send output to formattedDisplay - console.log("this is good") - console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) - formattedDisplay = this.compareAlliances(alliance1, alliance2, dataset) - // } else { //default is undefined - // console.log("bad") - // formattedDisplay = 0 - // console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) - // formattedDisplay = this.compareAlliances(alliance1, alliance2) - // } - // } else { - // console.log("also bad") - // formattedDisplay = 0 - // } + if (this.moduleConfig.options.aggrMethod == "percentChanceOfWinning") { // 3 identify which calculation to perform + console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) + formattedDisplay = this.compareAlliances(alliance1, alliance2, dataset) + } else { //default is undefined + formattedDisplay = 0 + } + } else { if (teams.length > 1) { summed = teams.map(team => getPath(dataset.teams[team], this.moduleConfig.options.path, 0)).flat().reduce((acc, i) => acc + i, 0) From de570d3352c02cc9b703f142b10059a49b9cf075 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Fri, 17 Feb 2023 11:02:37 -0600 Subject: [PATCH 21/24] Documented my fucntions --- src/analysis/modules/SingleDisplay/index.js | 37 ++++++++++++++------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index b641c634..9d660719 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -15,20 +15,18 @@ class SingleDisplay { } formatData(teams, dataset) { - console.log("teams: " + teams) + // teams = [b1,b2,b3,|,r1,r3,r3,|] let teamsArray = teams let summed let formattedDisplay if(this.moduleConfig.wholeMatch) { - // teams = [b1,b2,b3,|,r1,r3] - // 1 split list of teams let indexOfPipe = teamsArray.indexOf("|") let alliance1 = teamsArray.slice(0, indexOfPipe) + // alliance 1 = [b1,b2,b3] let alliance2 = teamsArray.slice(indexOfPipe+1, teamsArray.length) alliance2 = alliance2.filter(team => team != "|") - - if (this.moduleConfig.options.aggrMethod == "percentChanceOfWinning") { // 3 identify which calculation to perform - console.log("Compared Alliances" + this.compareAlliances(alliance1,alliance2, dataset)) + // alliance 2 = [r1,r2,r3] + if (this.moduleConfig.options.aggrMethod == "percentChanceOfWinning") { //optionally percent chance of winning formattedDisplay = this.compareAlliances(alliance1, alliance2, dataset) } else { //default is undefined formattedDisplay = 0 @@ -80,6 +78,13 @@ class SingleDisplay { this.display.innerText = data } + /** + * + * @param {*an allaicne of any length*} alliance1 + * @param {*an alliance to compare to of any length*} alliance2 + * @param {*the data set that holds the infomation of the teams*} dataset + * @returns {*the avg difference in score between allaicne 1 and allaicne 2*} + */ matchAverage(alliance1, alliance2, dataset){ let alliance1Avg = 0 for (const a of alliance1) { @@ -92,29 +97,37 @@ class SingleDisplay { return alliance1Avg - alliance2Avg } + /** + * + * @param {*an allaicne of any length*} alliance1 + * @param {*an alliance to compare to of any length*} alliance2 + * @param {*the data set that holds the infomation of the teams*} dataset + * @returns {*the standard deveation of the given match*} + */ matchStandardDeviation(alliance1, alliance2, dataset) { let alliance1SD = 0 for (const a of alliance1) { - console.log(a + " SD1: " + getPath(dataset.teams[a],"standardDeviation",0)) let data = getPath(dataset.teams[a],"standardDeviation",0) alliance1SD += Math.pow(data, 2) } alliance1SD = Math.sqrt(alliance1SD) - console.log("alliance1SD: " + alliance1SD) let alliance2SD = 0 for (const a of alliance2) { - console.log(a + " SD2: " + getPath(dataset.teams[a],"standardDeviation",0)) let data = getPath(dataset.teams[a],"standardDeviation",0) alliance2SD += Math.pow(data, 2) } alliance2SD = Math.sqrt(alliance2SD) - console.log("alliance2SD: " + alliance2SD) return Math.sqrt(Math.pow(alliance1SD, 2) + Math.pow(alliance2SD, 2)) } + /** + * + * @param {*an allaicne of any length*} alliance1 + * @param {*an alliance to compare to of any length*} alliance2 + * @param {*the data set that holds the infomation of the teams*} dataset + * @returns {*the percent chance that alliance1 will win this match*} + */ compareAlliances(alliance1, alliance2, dataset) { - console.log("matchAverage: " + this.matchAverage(alliance1, alliance2, dataset)) - console.log("matchStandardDeviation: " + this.matchStandardDeviation(alliance1, alliance2, dataset)) zscore = ss.zScore(0, this.matchAverage(alliance1, alliance2, dataset), this.matchStandardDeviation(alliance1, alliance2, dataset)) console.log("zscore: " + zscore) probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) From f29b23d8a35bba2a7c6c83c6d587e89b389079f2 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Fri, 17 Feb 2023 11:05:19 -0600 Subject: [PATCH 22/24] documented funtions; cleaned up comments; removed autopick.js for later merge and resolved resulting bugs --- src/analysis/modules/SingleDisplay/index.js | 5 +- src/analysis/public/js/autoPick.js | 226 -------------------- src/analysis/views/index.ejs | 4 +- 3 files changed, 3 insertions(+), 232 deletions(-) delete mode 100644 src/analysis/public/js/autoPick.js diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 9d660719..656edc4d 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -128,9 +128,8 @@ class SingleDisplay { * @returns {*the percent chance that alliance1 will win this match*} */ compareAlliances(alliance1, alliance2, dataset) { - zscore = ss.zScore(0, this.matchAverage(alliance1, alliance2, dataset), this.matchStandardDeviation(alliance1, alliance2, dataset)) - console.log("zscore: " + zscore) - probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) + let zscore = ss.zScore(0, this.matchAverage(alliance1, alliance2, dataset), this.matchStandardDeviation(alliance1, alliance2, dataset)) + let probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) return 1 - probAlliance2Wins; } diff --git a/src/analysis/public/js/autoPick.js b/src/analysis/public/js/autoPick.js deleted file mode 100644 index f8291257..00000000 --- a/src/analysis/public/js/autoPick.js +++ /dev/null @@ -1,226 +0,0 @@ -// const { Dataset } = require("../../DataTransformer"); -// const { zScore, cumulativeStdNormalProbability } = require("simple-statistics"); - -function swap(arr, i, j) { - let temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; -} - - -function partition(arr, low, high) { - // pivot - let pivot = arr[high.averageScore()]; - - // Index of smaller element and - // indicates the right position - // of pivot found so far - let i = (low - 1); - - for (let j = low; j <= high - 1; j++) { - - // If current element is smaller - // than the pivot - if (arr[j.averageScore()] < pivot) { // FIXME j.average score is a temporary - - // Increment index of - // smaller element - i++; - swap(arr, i, j); - } - } - swap(arr, i + 1, high); - return (i + 1); -} - -/* The main function that implements QuickSort - arr[] --> Array to be sorted, - low --> Starting index, - high --> Ending index -*/ -function quickSort(arr, low, high) { - if (low < high) { - - // pi is partitioning index, arr[p] - // is now at right place - let pi = partition(arr, low, high); - - // Separately sort elements before - // partition and after partition - quickSort(arr, low, pi - 1); - quickSort(arr, pi + 1, high); - } -} - -// Driver Code -// reorders a list of teams based on average score -function sortTeams(teams) { - quickSort(teams, 0, teams - 1) - return teams -} -//-------------------------------------------------------------------------------------------------------------------------------------// - -async function fetchDataset() { - return await fetch("./api/dataset").then(res => res.json()) -} - -async function fetchTeams() { - const teams = await fetch(`/analysis/api/teams`).then(res => res.json()) - return teams.reduce((acc, t) => { - acc[t.team_number] = t.nickname - return acc - }, {}) -} -/** - * - * @param {A list of all teams} teams - * @returns A list of all possible alliances, including impossible allaicnes(duplicate teams on an alliance) - */ -function possibleAliiances(teams) { - let possibleAlliiances = [] // an array of all possible alliances - for(x in teams) { - for(y in teams) { - for(z in teams) { - possibleAliiances.push(new alliance[x, y, z]) - } - } - } - return possibleAliiances -} -/** - * - * @param {An alliance of three teams} alliance - * @returns the average score for an alliance - */ -function allianceAverage(alliance) { - return alliance[0].avg + alliance[1].avg + alliance[2].avg; -} - -/** - * - * @param {An alliance of three teams} alliance - * @returns the standard deveiation of an alliances score - */ -function allianceStandardDeviation(alliance) { - let i = Math.pow(alliance[0].sd, 2) + Math.pow(alliance[1].sd, 2) + Math.pow(alliance[2].sd, 2) - return Math.sqrt(i); -} -/** - * - * @param {An alliance of three teams} alliance1 - * @param {An alliance of three teams} alliance2 - * @returns the average difference in score between two alliances, a postive number means on average alliance 1 wins - */ -function matchAverage(alliance1, alliance2) { - return allianceAverage(alliance1) - allianceAverage(alliance2); -} - -/** - * - * @param {An alliance of three} alliance - * @returns the the standard deveation in the difference of the score between two alliances - */ -function matchStandardDeviation(alliance1, alliance2) { - let i = Math.pow(allianceStandardDeviation(alliance1), 2) + Math.pow(allianceStandardDeviation(alliance2), 2); - return Math.sqrt(i); -} -/** - * - * @param {*} alliance1 - * @param {*} alliance2 - * @returns the probiblity that alliance 1 wins a random match between the two alliances - */ - -function compareAlliances(alliance1, alliance2) { - zscore = ss.zScore(0, matchAverage(alliance1, alliance2), matchStandardDeviation(alliance1, alliance2)) - probAlliance2Wins = ss.cumulativeStdNormalProbability(zscore) - return 1 - probAlliance2Wins; -} -/** - * - * @param {a list of alliances} alliances - * @returns a list of alliances prioritized, by winning probability - * - * If we compare to every alliances to every other alliances we can make a (key, value) map with a key of the alliance number and a value of their winning prob - * Then it can be passed into another (key, value) map with the key being a team number and a value of their average chance of winning - */ -function compareAllTeams(alliances) { - let allianceProb = new Map(); - for (a in alliances) { - for (b in alliances){ - allianceProb.set(alliances.indexOf(a), allianceProb.get(alliances.indexOf(a)) + compareAlliances(a, b)) - } - } - //The map now contains a map of all possible alliances and a sum of their change of winning - for(a in allianceProb){ - allianceProb.set(a, allianceProb.get(a) / Math.pow(alliances.length(), 2)) - } - //Now each alliances value should be their average chance of winning - let teamProb = new Map(); - for(a in allianceProb){ - - } -} - -//----------------------------------------------------------------------------------------------------------------------------------// - -// let dataset = fetchDataset(); -// let teams = fetchTeams(); -// console.log(teams); -// let pAliiances = possibleAliiances(teams); -// console.log(pAliiances); -console.log("test") - -let teamB1 = { - sd : 20, - avg: 80 -} - -let teamB2 = { - sd : 20, - avg: 70 -} - -let teamB3 = { - sd : 20, - avg: 20 -} - -let teamR1 = { - sd : 20, - avg: 60 -} - -let teamR2 = { - sd : 20, - avg: 70 -} - -let teamR3 = { - sd : 20, - avg: 30 -} - -console.log("Blue 1" + teamB1) -console.log("Blue 2" + teamB2) -console.log("Blue 3" + teamB3) - -console.log("Red 1" + teamR1) -console.log("Red 2" + teamR2) -console.log("Red 3" + teamR3) - - -let allianceBlue = [teamB1, teamB2, teamB3] -let allianceRed =[teamR1, teamR2, teamR3] - -console.log(allianceBlue) -console.log(allianceRed) - - - -console.log(allianceAverage(allianceBlue)) -console.log(allianceAverage(allianceRed)) -console.log(allianceStandardDeviation(allianceBlue)) -console.log(allianceStandardDeviation(allianceRed)) - -console.log(compareAlliances(allianceBlue, allianceRed)); \ No newline at end of file diff --git a/src/analysis/views/index.ejs b/src/analysis/views/index.ejs index 6f01aafb..a33b0865 100644 --- a/src/analysis/views/index.ejs +++ b/src/analysis/views/index.ejs @@ -131,9 +131,7 @@ - - - + From 2f1100e8598a740f79a9eeaabfb315208472ac55 Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Fri, 17 Feb 2023 11:07:24 -0600 Subject: [PATCH 23/24] removed comment about potential bug after testing --- src/analysis/public/js/script.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index fa6450e4..e6553e70 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -271,11 +271,7 @@ if ('serviceWorker' in navigator) { console.log(`displayed alliances: ${displayedAlliances}`) if (displayedAlliances.length !== 0) { module.container.classList.remove("hidden") - await module.setData(await module.formatData(allTeams, dataset)) - /** - * TODO: fix the filtering - * allTeams on line 274 should be maybe displayedAlliances - */ + await module.setData(await module.formatData(allTeams, dataset)) } else { module.container.classList.add("hidden") } From 4e9c52983c481f2513ae38558e457ed97c66137f Mon Sep 17 00:00:00 2001 From: Aidan Donnelly <73967906+AidanDonnelly1@users.noreply.github.com> Date: Fri, 17 Feb 2023 11:23:08 -0600 Subject: [PATCH 24/24] removed a commented out potential bug and documented in trello; converted proportions to percentages --- src/analysis/modules/SingleDisplay/index.js | 9 ++++++--- src/analysis/public/js/script.js | 9 --------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/analysis/modules/SingleDisplay/index.js b/src/analysis/modules/SingleDisplay/index.js index 656edc4d..b817578c 100644 --- a/src/analysis/modules/SingleDisplay/index.js +++ b/src/analysis/modules/SingleDisplay/index.js @@ -11,7 +11,6 @@ class SingleDisplay { this.display = createDOMElement("div", "display") this.container.appendChild(this.header) this.container.appendChild(this.display) - this.header.innerHTML = "No Data" } formatData(teams, dataset) { @@ -28,8 +27,9 @@ class SingleDisplay { // alliance 2 = [r1,r2,r3] if (this.moduleConfig.options.aggrMethod == "percentChanceOfWinning") { //optionally percent chance of winning formattedDisplay = this.compareAlliances(alliance1, alliance2, dataset) + formattedDisplay = (formattedDisplay * 100).toFixed(2).toString()+"%"; } else { //default is undefined - formattedDisplay = 0 + formattedDisplay = "0%" } } else { @@ -48,7 +48,10 @@ class SingleDisplay { formattedDisplay = this.applyModifiers(formattedDisplay) if (isNaN(formattedDisplay) || formattedDisplay == this.moduleConfig.options.hideIfValue) { - formattedDisplay = "—" + if(!this.moduleConfig.wholeMatch){ + formattedDisplay = "—" + } + } else { if (this.moduleConfig.options.decimals !== undefined) { formattedDisplay = formattedDisplay.toFixed(this.moduleConfig.options.decimals) diff --git a/src/analysis/public/js/script.js b/src/analysis/public/js/script.js index e6553e70..cc48d6e0 100644 --- a/src/analysis/public/js/script.js +++ b/src/analysis/public/js/script.js @@ -232,15 +232,6 @@ if ('serviceWorker' in navigator) { const rightModuleObject = new moduleClasses[module.module](module) rightAllianceModules.appendChild(rightModuleObject.container) modules.match.right.push(rightModuleObject) - - // if(module.wholeMatch) { - // const bothModuleObjectLeft = new moduleClasses[module.module](module) - // leftAllianceModules.appendChild(bothModuleObjectLeft.container) - // const bothModuleObjectRight = new moduleClasses[module.module](module) - // rightAllianceModules.appendChild(bothModuleObjectRight.container) - // // modules.match.both.push(bothModuleObject) - // } - } }