diff --git a/config.json b/config.json index f143132..68d73d1 100644 --- a/config.json +++ b/config.json @@ -1,46 +1,101 @@ { "max-threads": 0.5, "team": "", - "competition": "", - "key":{ - "database":"", - "tba":"" + "competition": "2020ilch", + "key": { + "database": "mongodb+srv://analysis:MU2gPeEjEurRt2n@2022-scouting-4vfuu.mongodb.net/?retryWrites=true&w=majority", + "tba": "UDvKmPjPRfwwUdDX1JxbmkyecYBJhCtXeyVk9vmO2i7K0Zn4wqQPMfzuEINXJ7e5" }, - "statistics":{ - "match":{ - "balls-blocked":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-collected":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-lower-teleop":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-lower-auto":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-started":["basic_stats","historical_analyss","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-upper-teleop":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-upper-auto":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"] - + "statistics": { + "match": { + "balls-blocked": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-collected": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-lower-teleop": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-lower-auto": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-started": [ + "basic_stats", + "historical_analyss", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-upper-teleop": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-upper-auto": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ] }, - "metric":{ - "elo":{ - "score":1500, - "N":400, - "K":24 + "metric": { + "elo": { + "score": 1500, + "N": 400, + "K": 24 }, - "gl2":{ - "score":1500, - "rd":250, - "vol":0.06 + "gl2": { + "score": 1500, + "rd": 250, + "vol": 0.06 }, - "ts":{ - "mu":25, - "sigma":8.33 + "ts": { + "mu": 25, + "sigma": 8.33 } }, - "pit":{ - "wheel-mechanism":true, - "low-balls":true, - "high-balls":true, - "wheel-success":true, - "strategic-focus":true, - "climb-mechanism":true, - "attitude":true + "pit": { + "wheel-mechanism": true, + "low-balls": true, + "high-balls": true, + "wheel-success": true, + "strategic-focus": true, + "climb-mechanism": true, + "attitude": true } } } \ No newline at end of file diff --git a/design.kv b/design.kv new file mode 100644 index 0000000..177a926 --- /dev/null +++ b/design.kv @@ -0,0 +1,151 @@ +: + orientation: "vertical" + + NavigationLayout: + ScreenManager: + id: screen_manager + HomeScreen: + name: "Home" + BoxLayout: + orientation: "vertical" + MDToolbar: + title: screen_manager.current + elevation: 10 + left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]] + + GridLayout: + cols: 1 + padding: 15, 15 + spacing: 20, 20 + MDTextFieldRect: + hint_text: "Console Log" + # size_hint: .8, None + # align: 'center' + # Widget: + SettingsScreen: + name: "Settings" + BoxLayout: + orientation: 'vertical' + MDToolbar: + title: screen_manager.current + elevation: 10 + left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]] + Widget: + InfoScreen: + name: "Info" + BoxLayout: + orientation: 'vertical' + MDToolbar: + title: screen_manager.current + elevation: 10 + left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]] + # GridLayout: + # cols: 2 + # padding: 15, 15 + # spacing: 20, 20 + BoxLayout: + orientation: "horizontal" + MDLabel: + text: "DB Key:" + halign: 'center' + MDTextField: + hint_text: "placeholder" + pos_hint: {"center_y": .5} + + BoxLayout: + orientation: "horizontal" + MDLabel: + text: "TBA Key:" + halign: 'center' + MDTextField: + hint_text: "placeholder" + pos_hint: {"center_y": .5} + BoxLayout: + orientation: "horizontal" + MDLabel: + text: "CPU Use:" + halign: 'center' + MDLabel: + text: "placeholder" + halign: 'center' + BoxLayout: + orientation: "horizontal" + MDLabel: + text: "Network:" + halign: 'center' + MDLabel: + text: "placeholder" + halign: 'center' + Widget: + BoxLayout: + orientation: "horizontal" + MDLabel: + text: "Progress" + halign: 'center' + MDProgressBar: + id: progress + value: 50 + StatsScreen: + name: "Stats" + MDCheckbox: + size_hint: None, None + size: "48dp", "48dp" + pos_hint: {'center_x': .5, 'center_y': .5} + on_active: Screen.test() + +#Navigation Drawer ------------------------- + MDNavigationDrawer: + id: nav_drawer + BoxLayout: + orientation: "vertical" + padding: "8dp" + spacing: "8dp" + MDLabel: + text: "Titan Scouting" + font_style: "Button" + size_hint_y: None + height: self.texture_size[1] + + MDLabel: + text: "Data Analysis" + font_style: "Caption" + size_hint_y: None + height: self.texture_size[1] + ScrollView: + MDList: + OneLineAvatarListItem: + text: "Home" + on_press: + # nav_drawer.set_state("close") + # screen_manager.transition.direction = "left" + screen_manager.current = "Home" + IconLeftWidget: + icon: "home" + + OneLineAvatarListItem: + text: "Settings" + on_press: + # nav_drawer.set_state("close") + # screen_manager.transition.direction = "right" + # screen_manager.fade + screen_manager.current = "Settings" + IconLeftWidget: + icon: "cog" + OneLineAvatarListItem: + text: "Info" + on_press: + # nav_drawer.set_state("close") + # screen_manager.transition.direction = "right" + # screen_manager.fade + screen_manager.current = "Info" + IconLeftWidget: + icon: "cog" + OneLineAvatarListItem: + text: "Stats" + on_press: + # nav_drawer.set_state("close") + # screen_manager.transition.direction = "right" + # screen_manager.fade + screen_manager.current = "Stats" + IconLeftWidget: + icon: "cog" \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..a57421e --- /dev/null +++ b/main.py @@ -0,0 +1,58 @@ +from kivy.lang import Builder + +from kivymd.uix.screen import Screen +from kivymd.uix.list import OneLineListItem, MDList, TwoLineListItem, ThreeLineListItem +from kivymd.uix.list import OneLineIconListItem, IconLeftWidget +from kivy.uix.scrollview import ScrollView + + +from kivy.uix.boxlayout import BoxLayout +from kivy.uix.screenmanager import ScreenManager, Screen +from kivy.uix.dropdown import DropDown +from kivy.uix.button import Button +from kivy.base import runTouchApp +from kivymd.uix.menu import MDDropdownMenu, MDMenuItem + +from kivymd.app import MDApp +# import superscript as ss + +# from tra_analysis import analysis as an +import data as d +from collections import defaultdict +import json +import math +import numpy as np +import os +from os import system, name +from pathlib import Path +from multiprocessing import Pool +import matplotlib.pyplot as plt +from concurrent.futures import ThreadPoolExecutor +import time +import warnings + +# global exec_threads + + +# Screens +class HomeScreen(Screen): + pass +class SettingsScreen(Screen): + pass +class InfoScreen(Screen): + pass + +class StatsScreen(Screen): + pass + + +class MyApp(MDApp): + def build(self): + self.theme_cls.primary_palette = "Red" + return Builder.load_file("design.kv") + def test(): + print("test") + + +if __name__ == "__main__": + MyApp().run() \ No newline at end of file diff --git a/superscript.py b/superscript.py index a3f0409..4c147de 100644 --- a/superscript.py +++ b/superscript.py @@ -135,75 +135,75 @@ from concurrent.futures import ThreadPoolExecutor import time import warnings -global exec_threads +# global exec_threads def main(): - global exec_threads + # global exec_threads warnings.filterwarnings("ignore") - while (True): +# while (True): - current_time = time.time() - print("[OK] time: " + str(current_time)) + current_time = time.time() + print("[OK] time: " + str(current_time)) - config = load_config("config.json") - competition = config["competition"] - match_tests = config["statistics"]["match"] - pit_tests = config["statistics"]["pit"] - metrics_tests = config["statistics"]["metric"] - print("[OK] configs loaded") + config = load_config("red-alliance-analysis\data-analysis\config.json") + competition = config["competition"] + match_tests = config["statistics"]["match"] + pit_tests = config["statistics"]["pit"] + metrics_tests = config["statistics"]["metric"] + print("[OK] configs loaded") - print("[OK] starting threads") - cfg_max_threads = config["max-threads"] - sys_max_threads = os.cpu_count() - if cfg_max_threads > -sys_max_threads and cfg_max_threads < 0 : - alloc_processes = sys_max_threads + cfg_max_threads - elif cfg_max_threads > 0 and cfg_max_threads < 1: - alloc_processes = math.floor(cfg_max_threads * sys_max_threads) - elif cfg_max_threads > 1 and cfg_max_threads <= sys_max_threads: - alloc_processes = cfg_max_threads - elif cfg_max_threads == 0: - alloc_processes = sys_max_threads - else: - print("[Err] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) - exit() - exec_threads = Pool(processes = alloc_processes) - print("[OK] " + str(alloc_processes) + " threads started") + print("[OK] starting threads") + cfg_max_threads = config["max-threads"] + sys_max_threads = os.cpu_count() + if cfg_max_threads > -sys_max_threads and cfg_max_threads < 0 : + alloc_processes = sys_max_threads + cfg_max_threads + elif cfg_max_threads > 0 and cfg_max_threads < 1: + alloc_processes = math.floor(cfg_max_threads * sys_max_threads) + elif cfg_max_threads > 1 and cfg_max_threads <= sys_max_threads: + alloc_processes = cfg_max_threads + elif cfg_max_threads == 0: + alloc_processes = sys_max_threads + else: + print("[Err] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) + exit() + # exec_threads = Pool(processes = alloc_processes) + # print("[OK] " + str(alloc_processes) + " threads started") - apikey = config["key"]["database"] - tbakey = config["key"]["tba"] - print("[OK] loaded keys") + apikey = config["key"]["database"] + tbakey = config["key"]["tba"] + print("[OK] loaded keys") - previous_time = get_previous_time(apikey) - print("[OK] analysis backtimed to: " + str(previous_time)) + previous_time = get_previous_time(apikey) + print("[OK] analysis backtimed to: " + str(previous_time)) - print("[OK] loading data") - start = time.time() - match_data = load_match(apikey, competition) - pit_data = load_pit(apikey, competition) - print("[OK] loaded data in " + str(time.time() - start) + " seconds") + print("[OK] loading data") + start = time.time() + match_data = load_match(apikey, competition) + pit_data = load_pit(apikey, competition) + print("[OK] loaded data in " + str(time.time() - start) + " seconds") - print("[OK] running match stats") - start = time.time() - matchloop(apikey, competition, match_data, match_tests) - print("[OK] finished match stats in " + str(time.time() - start) + " seconds") + print("[OK] running match stats") + start = time.time() + matchloop(apikey, competition, match_data, match_tests) + print("[OK] finished match stats in " + str(time.time() - start) + " seconds") - print("[OK] running team metrics") - start = time.time() - metricloop(tbakey, apikey, competition, previous_time, metrics_tests) - print("[OK] finished team metrics in " + str(time.time() - start) + " seconds") + print("[OK] running team metrics") + start = time.time() + metricloop(tbakey, apikey, competition, previous_time, metrics_tests) + print("[OK] finished team metrics in " + str(time.time() - start) + " seconds") - print("[OK] running pit analysis") - start = time.time() - pitloop(apikey, competition, pit_data, pit_tests) - print("[OK] finished pit analysis in " + str(time.time() - start) + " seconds") - - set_current_time(apikey, current_time) - print("[OK] finished all tests, looping") + print("[OK] running pit analysis") + start = time.time() + pitloop(apikey, competition, pit_data, pit_tests) + print("[OK] finished pit analysis in " + str(time.time() - start) + " seconds") + + set_current_time(apikey, current_time) + print("[OK] finished all tests, looping") - clear() + # clear() def clear(): @@ -314,7 +314,7 @@ def matchloop(apikey, competition, data, tests): # expects 3D array with [Team][ variable_data.append((data[team][variable], test)) test_filtered.append(test) - result_filtered = exec_threads.map(simplestats, variable_data) + result_filtered = map(simplestats, variable_data) i = 0 result_filtered = list(result_filtered)