2019-02-27 05:18:26 +00:00
|
|
|
#Titan Robotics Team 2022: Super Script
|
2019-02-05 15:50:10 +00:00
|
|
|
#Written by Arthur Lu & Jacob Levine
|
|
|
|
#Notes:
|
|
|
|
#setup:
|
|
|
|
|
2019-02-27 20:01:25 +00:00
|
|
|
__version__ = "1.0.5.002"
|
2019-02-05 15:50:10 +00:00
|
|
|
|
|
|
|
__changelog__ = """changelog:
|
2019-02-27 20:01:25 +00:00
|
|
|
1.0.5.002:
|
|
|
|
- more information given
|
|
|
|
- performance improvements
|
2019-02-27 20:00:29 +00:00
|
|
|
1.0.5.001:
|
|
|
|
- grammar
|
2019-02-27 19:38:24 +00:00
|
|
|
1.0.5.000:
|
|
|
|
- service now iterates forever
|
|
|
|
- ready for production other than pulling json data
|
2019-02-27 05:18:26 +00:00
|
|
|
1.0.4.001:
|
|
|
|
- grammar fixes
|
2019-02-27 01:39:56 +00:00
|
|
|
1.0.4.000:
|
|
|
|
- actually pushes to firebase
|
2019-02-21 04:59:17 +00:00
|
|
|
1.0.3.001:
|
2019-02-27 01:39:56 +00:00
|
|
|
- processes data more efficiently
|
2019-02-20 17:44:11 +00:00
|
|
|
1.0.3.000:
|
2019-02-27 01:39:56 +00:00
|
|
|
- actually processes data
|
2019-02-19 15:44:51 +00:00
|
|
|
1.0.2.000:
|
2019-02-27 01:39:56 +00:00
|
|
|
- added data reading from folder
|
|
|
|
- nearly crashed computer reading from 20 GiB of data
|
2019-02-05 15:50:10 +00:00
|
|
|
1.0.1.000:
|
2019-02-27 01:39:56 +00:00
|
|
|
- added data reading from file
|
|
|
|
- added superstructure to code
|
2019-02-05 15:50:10 +00:00
|
|
|
1.0.0.000:
|
2019-02-27 01:39:56 +00:00
|
|
|
- added import statements (revolutionary)
|
2019-02-05 15:50:10 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
__author__ = (
|
|
|
|
"Arthur Lu <arthurlu@ttic.edu>, "
|
|
|
|
"Jacob Levine <jlevine@ttic.edu>,"
|
|
|
|
)
|
|
|
|
|
2019-02-21 04:59:17 +00:00
|
|
|
import firebase_admin
|
|
|
|
from firebase_admin import credentials
|
|
|
|
from firebase_admin import firestore
|
2019-02-05 15:42:00 +00:00
|
|
|
import analysis
|
|
|
|
import titanlearn
|
2019-02-05 15:50:10 +00:00
|
|
|
import visualization
|
2019-02-19 15:44:51 +00:00
|
|
|
import os
|
2019-02-27 19:38:24 +00:00
|
|
|
import sys
|
|
|
|
import warnings
|
2019-02-19 15:44:51 +00:00
|
|
|
import glob
|
2019-02-21 04:59:17 +00:00
|
|
|
import numpy as np
|
2019-02-27 19:38:24 +00:00
|
|
|
import time
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
def titanservice():
|
2019-02-27 20:00:29 +00:00
|
|
|
|
|
|
|
print("[OK] loading data")
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 20:00:29 +00:00
|
|
|
start = time.time()
|
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
source_dir = 'data'
|
|
|
|
file_list = glob.glob(source_dir + '/*.csv') #supposedly sorts by alphabetical order, skips reading teams.csv because of redundancy
|
|
|
|
data = []
|
|
|
|
files = [fn for fn in glob.glob('data/*.csv')
|
|
|
|
if not os.path.basename(fn).startswith('teams')]
|
2019-02-20 17:44:11 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
for i in files:
|
|
|
|
data.append(analysis.load_csv(i))
|
2019-02-19 15:44:51 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
stats = []
|
|
|
|
measure_stats = []
|
|
|
|
teams = analysis.load_csv("data/teams.csv")
|
2019-02-20 17:44:11 +00:00
|
|
|
|
2019-02-27 20:00:29 +00:00
|
|
|
end = time.time()
|
|
|
|
|
|
|
|
print("[OK] loaded data in " + str(end - start) + "seconds")
|
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
#assumes that team number is in the first column, and that the order of teams is the same across all files
|
|
|
|
#unhelpful comment
|
|
|
|
for measure in data: #unpacks 3d array into 2ds
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
measure_stats = []
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
for i in range(len(measure)): #unpacks into specific teams
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
ofbest_curve = [None]
|
|
|
|
r2best_curve = [None]
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
line = measure[i]
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
#print(line)
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
x = list(range(len(line)))
|
|
|
|
eqs, rmss, r2s, overfit = analysis.optimize_regression(x, line, 10, 1)
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
beqs, brmss, br2s, boverfit = analysis.select_best_regression(eqs, rmss, r2s, overfit, "min_overfit")
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
#print(eqs, rmss, r2s, overfit)
|
|
|
|
|
|
|
|
ofbest_curve.append(beqs)
|
|
|
|
ofbest_curve.append(brmss)
|
|
|
|
ofbest_curve.append(br2s)
|
|
|
|
ofbest_curve.append(boverfit)
|
|
|
|
ofbest_curve.pop(0)
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
#print(ofbest_curve)
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
beqs, brmss, br2s, boverfit = analysis.select_best_regression(eqs, rmss, r2s, overfit, "max_r2s")
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
r2best_curve.append(beqs)
|
|
|
|
r2best_curve.append(brmss)
|
|
|
|
r2best_curve.append(br2s)
|
|
|
|
r2best_curve.append(boverfit)
|
|
|
|
r2best_curve.pop(0)
|
2019-02-21 04:59:17 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
#print(r2best_curve)
|
|
|
|
|
|
|
|
measure_stats.append(teams[i] + ["|"] + list(analysis.basic_stats(line, 0, 0)) + ["|"] + list(analysis.histo_analysis(line, 1, -3, 3)) + ["|"] + ofbest_curve + ["|"] + r2best_curve)
|
2019-02-20 17:44:11 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
stats.append(list(measure_stats))
|
|
|
|
|
|
|
|
json_out = {}
|
|
|
|
|
|
|
|
for i in range(len(stats)):
|
|
|
|
json_out[files[i]]=str(stats[i])
|
2019-02-27 01:39:56 +00:00
|
|
|
|
2019-02-27 19:38:24 +00:00
|
|
|
#print(json_out)
|
2019-02-20 17:44:11 +00:00
|
|
|
|
2019-02-27 05:18:26 +00:00
|
|
|
db.collection(u'stats').document(u'stats-noNN').set(json_out)
|
2019-02-27 19:38:24 +00:00
|
|
|
|
2019-02-28 15:04:37 +00:00
|
|
|
def pulldata():
|
|
|
|
#TODO
|
|
|
|
pass
|
|
|
|
|
2019-02-27 19:38:24 +00:00
|
|
|
def service():
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
2019-03-01 18:18:38 +00:00
|
|
|
pulldata()
|
|
|
|
|
2019-02-27 19:38:24 +00:00
|
|
|
start = time.time()
|
|
|
|
|
|
|
|
print("[OK] starting calculations")
|
|
|
|
|
|
|
|
fucked = False
|
|
|
|
|
|
|
|
for i in range(0, 5):
|
|
|
|
try:
|
|
|
|
titanservice()
|
|
|
|
break
|
|
|
|
except:
|
|
|
|
if (i != 4):
|
2019-02-28 19:39:35 +00:00
|
|
|
print("[WARNING] failed, trying " + str(5 - i - 1) + " more times")
|
2019-02-27 19:38:24 +00:00
|
|
|
else:
|
2019-02-28 19:39:35 +00:00
|
|
|
print("[ERROR] failed to compute data, skipping")
|
2019-02-27 19:38:24 +00:00
|
|
|
fucked = True
|
|
|
|
|
|
|
|
end = time.time()
|
|
|
|
if (fucked == True):
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
print("[OK] finished calculations")
|
|
|
|
|
2019-02-27 19:43:33 +00:00
|
|
|
print("[OK] waiting: " + str(300 - (end - start)) + " seconds" + "\n")
|
2019-02-27 19:38:24 +00:00
|
|
|
|
|
|
|
time.sleep(300 - (end - start)) #executes once every 5 minutes
|
|
|
|
|
|
|
|
warnings.simplefilter("ignore")
|
|
|
|
# Use a service account
|
|
|
|
cred = credentials.Certificate('keys/firebasekey.json')
|
|
|
|
firebase_admin.initialize_app(cred)
|
|
|
|
|
|
|
|
db = firestore.client()
|
|
|
|
|
|
|
|
service() #finally we write something that isn't a function definition
|