835 Commits

Author SHA1 Message Date
Arthur Lu
07c1ea0c40 fix version numbers 2022-03-14 04:35:04 +00:00
Arthur Lu
12e0a263bd Merge pull request #85 from titanscouting/analysis-v4
Analysis v4
2022-03-13 21:15:40 -07:00
Arthur Lu
8e51e37a9c fixed unit-test action
(added symbolic link to requirements.txt)
2022-02-08 09:50:04 +00:00
Arthur Lu
d2bd5d58ab removed unessasary comments in unit tests 2022-02-08 07:39:51 +00:00
Arthur Lu
6830cd2ac3 Merge pull request #86 from titanscouting/improve-devdocker
Improve devdocker
2022-02-07 23:34:04 -08:00
Arthur Lu
44569c9fcf generalized keyword argument handling for:
Clustering.py, CorrelationTest.py, KNN.py, NaiveBayes.py
2022-02-08 07:29:47 +00:00
Arthur Lu
da74e45c9f add pylint pytest to requirements.txt 2022-02-08 07:20:31 +00:00
Arthur Lu
f74b3ccd86 switch docker image to python:slim,
move requirements.txt to .devcontainer/
2022-02-04 09:19:39 +00:00
Arthur Lu
237e69b732 fix minor bugs in RandomForest.py 2022-02-04 08:50:56 +00:00
Arthur Lu
30a2334d54 fixed import error in Analysis,
updated unit tests
2021-11-18 09:51:39 +00:00
Arthur Lu
a50be44c18 Merge pull request #84 from titanscouting/typehinting-docstrings
Grab docstrings for Analysis to analysis-v4
2021-11-18 01:30:51 -08:00
Arthur Lu
3dabe87ead removed unessasary comments,
updated version and changelog
2021-11-18 09:24:52 +00:00
Arthur Lu
3c868672c9 finished Analysis docstrings,
removed typehinting to rework
2021-11-18 09:23:19 +00:00
Arthur Lu
27a77c3edb added type hinting for a few functions,
added typedef module to hold custom typings

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2021-11-16 20:17:46 +00:00
Arthur Lu
a34a36bdd8 populated __init__.py for metrics submodule 2021-11-12 07:42:20 +00:00
Arthur Lu
dad195a00f fixed/optimized imports,
fixed headers

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2021-11-09 22:52:04 +00:00
Arthur Lu
d57745547f Merge pull request #82 from titanscouting/improve-clustering
Added new clustering tools and reorganize existing ones
2021-09-27 15:32:12 -07:00
Arthur Lu
3606a072c4 added normalization preprocessing to Clustering
added unit tests for normalized clustering
2021-07-26 18:17:42 +00:00
Arthur Lu
3e99869d5d added dbscan and spectral to Clustering.py 2021-07-15 23:11:42 +00:00
Arthur Lu
9414cc948e removed matplotlib from requirements 2021-05-27 21:39:50 +00:00
Arthur Lu
4923881829 Added Clustering.py
moved kmeans from Analysis to Clustering
2021-05-26 07:41:32 +00:00
Arthur Lu
924b48fe63 Analysis v 3.0.4 2021-05-26 07:35:53 +00:00
Arthur Lu
23329da2b5 started branch for analysis v4 dev
deprecated old modules
2021-05-26 07:27:09 +00:00
Arthur Lu
8a365b784e Merge pull request #81 from titanscouting/fix-publish
removed problematic classifier
2021-04-30 20:54:16 -07:00
Arthur Lu
6905b39839 removed problematic classifier 2021-05-01 03:47:10 +00:00
Arthur Lu
c280b8fe3b Merge pull request #79 from titanscouting/fix-publish
attempt 2 to fix publish-analysis
2021-04-30 20:36:20 -07:00
Arthur Lu
1da6e87253 attempt 2 to fix publish-analysis 2021-04-30 22:59:34 +00:00
Dev Singh
7ce072b132 Merge pull request #78 from titanscouting/fix-publish
Install deps on publish-analysis
2021-04-30 17:43:20 -05:00
Arthur Lu
019da9df22 install deps on publish-analysis 2021-04-30 22:40:49 +00:00
Arthur Lu
60beaa4563 tra-analysis v 3.0.0 aggregate PR (#73)
* reflected doc changes to README.md

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* tra_analysis v 2.1.0-alpha.1

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* changed setup.py to use __version__ from source
added Topic and keywords

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* updated Supported Platforms in README.md

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* moved required files back to parent

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* moved security back to parent

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* moved security back to parent
moved contributing back to parent

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* add PR template

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* moved to parent folder

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* moved meta files to .github folder

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* Analysis.py v 3.0.1

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* updated test_analysis for submodules, and added missing numpy import in Sort.py

* fixed item one of Issue #58

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* readded cache searching in postCreateCommand

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* added myself as an author

* feat: created kivy gui boilerplate

* added Kivy to requirements.txt

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* feat: gui with placeholders

* fix: changed config.json path

* migrated docker base image to debian

Signed-off-by: ltcptgeneral <learthurgo@gmail.com>

* style: spaces to tabs

* migrated to ubuntu

Signed-off-by: ltcptgeneral <learthurgo@gmail.com>

* fixed issues

Signed-off-by: ltcptgeneral <learthurgo@gmail.com>

* fix: docker build?

* fix: use ubuntu bionic

* fix: get kivy installed

* @ltcptgeneral can't spell

* optim dockerfile for not installing unused packages

* install basic stuff while building the container

* use prebuilt image for development

* install pylint on base image

* rename and use new kivy

* tests: added tests for Array and CorrelationTest

Both are not working due to errors

* use new thing

* use 20.04 base

* symlink pip3 to pip

* use pip instead of pip3

* equation.Expression.py v 0.0.1-alpha
added corresponding .pyc to .gitignore

* parser.py v 0.0.2-alpha

* added pyparsing to requirements.txt

* parser v 0.0.4-alpha

* Equation v 0.0.1-alpha

* added Equation to tra_analysis imports

* tests: New unit tests for submoduling (#66)

* feat: created kivy gui boilerplate

* migrated docker base image to debian

Signed-off-by: ltcptgeneral <learthurgo@gmail.com>

* migrated to ubuntu

Signed-off-by: ltcptgeneral <learthurgo@gmail.com>

* fixed issues

Signed-off-by: ltcptgeneral <learthurgo@gmail.com>

* fix: docker build?

* fix: use ubuntu bionic

* fix: get kivy installed

* @ltcptgeneral can't spell

* optim dockerfile for not installing unused packages

* install basic stuff while building the container

* use prebuilt image for development

* install pylint on base image

* rename and use new kivy

* tests: added tests for Array and CorrelationTest

Both are not working due to errors

* fix: Array no longer has *args and CorrelationTest functions no longer have self in the arguments

* use new thing

* use 20.04 base

* symlink pip3 to pip

* use pip instead of pip3

* tra_analysis v 2.1.0-alpha.2
SVM v 1.0.1
added unvalidated SVM unit tests

Signed-off-by: ltcptgeneral <learthurgo@gmail.com>

* fixed version number

Signed-off-by: ltcptgeneral <learthurgo@gmail.com>

* tests: added tests for ClassificationMetric

* partially fixed and commented out svm unit tests

* fixed some SVM unit tests

* added installing pytest to devcontainer.json

* fix: small fixes to KNN

Namely, removing self from parameters and passing correct arguments to KNeighborsClassifier constructor

* fix, test: Added tests for KNN and NaiveBayes.

Also made some small fixes in KNN, NaiveBayes, and RegressionMetric

* test: finished unit tests except for StatisticalTest

Also made various small fixes and style changes

* StatisticalTest v 1.0.1

* fixed RegressionMetric unit test
temporarily disabled CorrelationTest unit tests

* tra_analysis v 2.1.0-alpha.3

* readded __all__

* fix: floating point issues in unit tests for CorrelationTest

Co-authored-by: AGawde05 <agawde05@gmail.com>
Co-authored-by: ltcptgeneral <learthurgo@gmail.com>
Co-authored-by: Dev Singh <dev@devksingh.com>
Co-authored-by: jzpan1 <panzhenyu2014@gmail.com>

* fixed depreciated escape sequences

* ficed tests, indent, import in test_analysis

* changed version to 3.0.0
added backwards compatibility

* ficed pytest install in container

* removed GUI changes

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* incremented version to rc.1 (release candidate 1)

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* fixed NaiveBayes __changelog__

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* fix: __setitem__  == to single =

* Array v 1.0.1

* Revert "Array v 1.0.1"

This reverts commit 59783b79f7.

* Array v 1.0.1

* Array.py v 1.0.2
added more Array unit tests

* cleaned .gitignore
tra_analysis v 3.0.0-rc2

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* added *.pyc to gitignore
finished subdividing test_analysis

* feat: gui layout + basic func

* Froze and removed superscript (data-analysis)

* remove data-analysis deps install for devcontainer

* tukey pairwise comparison and multicomparison but no critical q-values

* quick patch for devcontainer.json

* better fix for devcontainer.json

* fixed some styling in StatisticalTest
removed print statement in StatisticalTest unit tests

* update analysis tests to be more effecient

* don't use loop for test_nativebayes

* removed useless secondary docker files

* tra-analysis v 3.0.0

Co-authored-by: James Pan <panzhenyu2014@gmail.com>
Co-authored-by: AGawde05 <agawde05@gmail.com>
Co-authored-by: zpan1 <72054510+zpan1@users.noreply.github.com>
Co-authored-by: Dev Singh <dev@devksingh.com>
Co-authored-by: = <=>
Co-authored-by: Dev Singh <dsingh@imsa.edu>
Co-authored-by: zpan1 <zpan@imsa.edu>
2021-04-28 19:33:50 -05:00
Arthur Lu
f5a5da1ee1 reflected doc changes to README.md (#48)
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-10-05 09:49:39 -05:00
Dev Singh
360b763330 deps: remove dnspython (#47)
Signed-off-by: Dev Singh <dev@devksingh.com>

Co-authored-by: Arthur Lu <learthurgo@gmail.com>
2020-09-28 18:53:32 -05:00
Arthur Lu
30f5687622 Merge pull request #46 from titanscouting/multithread-testing
Implement Multithreading in Superscript
2020-09-28 17:46:29 -05:00
Dev Singh
88f68782f7 Implement fitting to circle using LSC and HyperFit (#45)
* chore: add pylint to devcontainer

Signed-off-by: Dev Singh <dev@devksingh.com>

* feat: init LSC fitting

cuda and cpu-based LSC fitting using cupy and numpy

Signed-off-by: Dev Singh <dev@devksingh.com>

* docs: add changelog entry and module to class list

Signed-off-by: Dev Singh <dev@devksingh.com>

* docs: fix typo in comment

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix: only import cupy if cuda available

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix: move to own file, abandon cupy

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix: remove numba dep

Signed-off-by: Dev Singh <dev@devksingh.com>

* deps: remove cupy dep

Signed-off-by: Dev Singh <dev@devksingh.com>

* feat: add tests

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix: correct indentation

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix: variable names

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix: add self when refering to coords

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix: numpy ordering

Signed-off-by: Dev Singh <dev@devksingh.com>

* docs: remove version bump, nomaintain

add notice that module is not actively maintained, may be removed in future release

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix: remove hyperfit as not being impled

Signed-off-by: Dev Singh <dev@devksingh.com>
2020-09-24 21:06:30 -05:00
Dev Singh
fe4372bd3b docs: create security reporting guidelines (#44)
Signed-off-by: Dev Singh <dev@devksingh.com>
2020-09-24 13:09:34 -05:00
Arthur Lu
b9ffac5b20 added tra-analysis to data-analysis requirements
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-24 13:14:13 +00:00
Arthur Lu
13aa125e4d Merge branch 'multithread-testing' of https://github.com/titanscouting/red-alliance-analysis into multithread-testing 2020-09-26 20:57:55 +00:00
Arthur Lu
d97976da12 superscript.py v 0.8.2
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-26 20:57:39 +00:00
Dev Singh
f80c1c04a5 Merge branch 'master' into multithread-testing 2020-09-26 15:28:14 -05:00
Arthur Lu
f9fd61e8a5 superscript.py v 0.8.1
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-21 07:38:18 +00:00
Arthur Lu
c048f850c0 added max-threads key in config
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-21 07:21:59 +00:00
Arthur Lu
911423f879 superscript.py v 0.8.0
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-21 05:59:15 +00:00
Arthur Lu
8326ed8118 Merge pull request #43 from titanscouting/master-staged
Pull changes from master staged to master for release
2020-09-19 21:06:42 -05:00
Arthur Lu
99f48330df Merge branch 'master' into master-staged 2020-09-19 20:05:33 -05:00
Arthur Lu
ab8bd91433 modified setup.py for analysis package v 2.1.0
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-20 00:50:14 +00:00
Arthur Lu
e13f2a239b depreciated nonfunctional scripts in data-analysis
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-20 00:47:33 +00:00
Arthur Lu
bc3889c4e0 superscript.py v 0.7.0
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-20 00:45:38 +00:00
Arthur Lu
6b5de9706e analysis.py v 2.3.1
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-19 23:14:46 +00:00
Arthur Lu
110b82e1dc edited README.md
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-19 22:40:20 +00:00
Arthur Lu
cfba10bebc Merge pull request #42 from titanscouting/devksingh4-patch-1
docs: add documentation links
2020-09-19 17:07:57 -05:00
Arthur Lu
f03101e09c analysis.py v 2.3.0
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-19 22:04:24 +00:00
Arthur Lu
9a9a27cf44 analysis.py v 2.2.3
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-18 21:55:59 +00:00
Arthur Lu
00605afcd7 analysis.py v 2.2.2
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-17 02:11:44 +00:00
Dev Singh
d833d6d2b4 docs: add documentation links 2020-09-16 16:54:49 -05:00
Arthur Lu
819245dfe2 added depreciated config files to gitignore
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-16 21:24:50 +00:00
Arthur Lu
7ef43b5008 changed && to ; in devcontainer.json
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-09-15 23:24:50 +00:00
Arthur Lu
8b6fad418c Merge pull request #41 from titanscouting/master-staged
merge eol fix in master-staged to master
2020-08-13 12:04:54 -05:00
Arthur Lu
a500ce76d2 fixed eol issue with docker in gitattributes
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-08-13 17:01:08 +00:00
Arthur Lu
67969188cc Merge commit '4b664acffb5777614043a83ef8e08368e21303ce' into master-staged 2020-08-13 17:00:31 +00:00
Dev Singh
a4179d7dd1 Modernize VSCode extensions in dev env, set correct copyright assignment (#40)
* modernize extensions

Signed-off-by: Dev Singh <dev@devksingh.com>

* copyright assigment should be to titan scouting

Signed-off-by: Dev Singh <dev@devksingh.com>
2020-08-12 21:59:04 -05:00
Arthur Lu
c75fd8921e Merge pull request #39 from titanscouting/master-staged
merge README changes from master-staged to master
2020-08-10 20:49:01 -05:00
Arthur Lu
e7349962f5 fixed readme with proper pip installation
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-08-11 01:36:30 +00:00
Arthur Lu
64cf52d749 Merge pull request #38 from titanscouting/master
pull master into master-staged
2020-08-10 20:33:28 -05:00
Arthur Lu
f5c5667e2b Merge pull request #36 from titanscouting/tra-service
merge changes from tra-service to master
2020-08-10 19:40:28 -05:00
Arthur Lu
290b7506e3 modified README
simplified devcontainer.json

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-08-11 00:29:23 +00:00
Arthur Lu
273af3395f readded old config files
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-08-10 23:32:50 +00:00
Arthur Lu
8fdd575863 fixed analysis reference in superscript_old
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-08-10 23:20:43 +00:00
Arthur Lu
faaee5bedd removed old bins under analysis-master/dist/
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-08-10 21:37:41 +00:00
Arthur Lu
245a47bdd2 analysis.py v 2.2.1
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-08-10 21:25:25 +00:00
Arthur Lu
3e335756e1 Merge branch 'master' into tra-service 2020-08-10 16:11:38 -05:00
Arthur Lu
8cea479880 renamed analysis folder to tra_analysis
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-08-10 21:01:50 +00:00
Dev Singh
38ab14bd03 docs
Signed-off-by: Dev Singh <dev@devksingh.com>
2020-08-10 14:53:22 -05:00
Dev Singh
73196c6619 build v2.0.3
Signed-off-by: Dev Singh <dev@devksingh.com>
2020-08-10 14:52:49 -05:00
Dev Singh
8d046b3d2f run on publish
Signed-off-by: Dev Singh <dev@devksingh.com>
2020-08-10 14:46:07 -05:00
Dev Singh
91d2d0e160 remove bad if statement
Signed-off-by: Dev Singh <dev@devksingh.com>
2020-08-10 14:43:16 -05:00
Dev Singh
11b6b71daa Merge branch 'master' of https://github.com/titanscout2022/red-alliance-analysis 2020-08-10 14:42:58 -05:00
Dev Singh
e747e9d85a build on release only (#35)
Signed-off-by: Dev Singh <dev@devksingh.com>
2020-08-10 14:40:22 -05:00
Dev Singh
b6039c666f build on release only
Signed-off-by: Dev Singh <dev@devksingh.com>
2020-08-10 14:35:38 -05:00
Dev Singh
23b3966c54 Implement CD with building on tags to PyPI (#34)
* Create python-publish.yml

* populated publish-analysis.yml
moved legacy versions of analysis to seperate subfolder

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* attempt to fix issue with publish action

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* another attempt o fix publish-analysis.yml

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* this should work now

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* pypa can't take just one package so i'm trying all

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* this should totally work now

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* trying removing custom dir

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* rename analysis to tra_analysis, bump version to 2.0.0

* remove old packages which are already on github releases

* remove pycache

* removed ipynb_checkpoints

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* build

* do the dir thing

* trying removing custom dir

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
Signed-off-by: Dev Singh <dev@devksingh.com>

* rename analysis to tra_analysis, bump version to 2.0.0

Signed-off-by: Dev Singh <dev@devksingh.com>

* remove old packages which are already on github releases

Signed-off-by: Dev Singh <dev@devksingh.com>

* remove pycache

Signed-off-by: Dev Singh <dev@devksingh.com>

* build

Signed-off-by: Dev Singh <dev@devksingh.com>

* removed ipynb_checkpoints

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
Signed-off-by: Dev Singh <dev@devksingh.com>

* do the dir thing

Signed-off-by: Dev Singh <dev@devksingh.com>

* Revert "do the dir thing"

This reverts commit 2eb7ffca8d.

* correct dir

* set correct yaml positions

Signed-off-by: Dev Singh <dev@devksingh.com>

* attempt to set correct dir

Signed-off-by: Dev Singh <dev@devksingh.com>

* run on tags only

Signed-off-by: Dev Singh <dev@devksingh.com>

* remove all caches from vcs

Signed-off-by: Dev Singh <dev@devksingh.com>

* bump version for testing

Signed-off-by: Dev Singh <dev@devksingh.com>

* remove broke build

Signed-off-by: Dev Singh <dev@devksingh.com>

* dont upload dists to github

Signed-off-by: Dev Singh <dev@devksingh.com>

* bump to 2.0.2 for testing

Signed-off-by: Dev Singh <dev@devksingh.com>

* fix yaml

Signed-off-by: Dev Singh <dev@devksingh.com>

* update docs

Signed-off-by: Dev Singh <dev@devksingh.com>

* add to readme

Signed-off-by: Dev Singh <dev@devksingh.com>

* run only on master

Signed-off-by: Dev Singh <dev@devksingh.com>

Co-authored-by: Arthur Lu <learthurgo@gmail.com>
Co-authored-by: Dev Singh <dsingh@CentaurusRidge.localdomain>
2020-08-10 14:29:51 -05:00
Arthur Lu
e4c912f4b6 Merge pull request #33 from titanscout2022/Demo-for-Issue#32
Merge Changes Proposed in Issue#32
2020-08-02 17:27:26 -05:00
Arthur Lu
b3153d830a made changes described in Issue#32
changed setup.py to also reflect versioning changes

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-07-30 19:05:07 +00:00
Arthur Lu
bc716ada14 filled out Contributing section in README.md
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-07-20 19:07:32 -05:00
Dev Singh
35487199c4 Update MAINTAINERS (#29)
Signed-off-by: Dev Singh <dev@devksingh.com>
2020-07-19 11:52:11 -05:00
Arthur Lu
bde9837167 Merge pull request #31 from titanscout2022/master
merge changes from master into tra-service
2020-07-18 23:25:55 -05:00
Arthur Lu
f062c038ec Merge pull request #28 from titanscout2022/master-staged
Merge analysis.py updates to master
2020-07-12 18:26:03 -05:00
Arthur Lu
0e71ef4dd8 added negatives to analysis unit tests
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-07-12 13:57:24 -05:00
Arthur Lu
d690868011 Merge branch 'master' into master-staged 2020-07-11 17:03:50 -05:00
Arthur Lu
ea7d853acf added unit tests for analysis.Sort algorithms
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-07-11 21:53:16 +00:00
Arthur Lu
65f642f0d2 readded old superscript.py (v 0.0.5.002)
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-07-11 21:21:56 +00:00
Arthur Lu
a6ab20a224 analysis v 1.2.2.000
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-07-05 05:30:48 +00:00
Arthur Lu
c9eebdf2f0 readded tra.py as a fallback option
made changes to tra-cli.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-06-10 23:15:34 +00:00
Arthur Lu
bb8253df39 fixed more bugs with tra-cli.py
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-06-10 21:47:54 +00:00
Arthur Lu
30c5d6aecf fixed bugs with tra-cli.py
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-06-10 21:32:43 +00:00
Arthur Lu
fdbb196493 fixed latest.whl to follow format for wheel files
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-06-10 20:56:13 +00:00
Arthur Lu
de994f812b started on tra-cli.py
modified tasks.py to work properly

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-06-10 20:23:53 +00:00
Arthur Lu
87c2caa135 added data-analysis requirements to devcontainer build
added auto pip intsall latest analysis.py whl

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-06-10 18:25:41 +00:00
Arthur Lu
37adab1d2e moved core functions in tasks.py to class Tasker
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-06-10 18:19:58 +00:00
Arthur Lu
507d6f6d95 renamed tra;py to tasks.py
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-06-10 17:46:40 +00:00
Arthur Lu
4fbf02c60c added help message to status command
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-26 01:34:47 +00:00
Arthur Lu
13f453320e populated tra.py to be a CLI application
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-25 22:17:08 +00:00
Arthur Lu
f70092c3c0 removed extra words
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-24 17:56:00 +00:00
Arthur Lu
fda64c801c removed more extra lines
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-24 17:54:48 +00:00
Arthur Lu
71d00162e8 fixed extra hline
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-24 17:52:25 +00:00
Arthur Lu
3858c69ef0 fixed line breaks
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-24 17:51:57 +00:00
Arthur Lu
22ae438a10 fixed Prerequisites in README.md
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-24 17:35:02 +00:00
Arthur Lu
0191809a90 added OS and python versions supproted
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-24 17:30:01 +00:00
Arthur Lu
64874167a6 analysis.py v 1.2.1.004 (#27)
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-24 11:49:04 -05:00
Arthur Lu
b292469934 revamped README.md
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-24 16:42:58 +00:00
Arthur Lu
b1e2ab34b2 fixed naming in tra.py
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-23 22:51:58 -05:00
Arthur Lu
5538f428d6 another bug fix
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-23 22:49:38 -05:00
Arthur Lu
9a7e0bc74c quick bug fix to tra.py
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-23 22:48:50 -05:00
Arthur Lu
dfc439ed4d added test.py to .gitignore
prepared tra.py for threading implement

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-23 19:43:59 -05:00
Arthur Lu
37c03f0a77 analysis.py v 1.2.1.004
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-22 00:37:39 +00:00
Arthur Lu
6020eac66e Merge pull request #26 from titanscout2022/master
Merge master into master-staged
2020-05-21 19:36:56 -05:00
Arthur Lu
2730e4fc91 Merge service-dev changes with master (#24)
* added config.json
removed old config files

Signed-off-by: Arthur <learthurgo@gmail.com>

* superscript.py v 0.0.6.000

Signed-off-by: Arthur <learthurgo@gmail.com>

* changed data.py

Signed-off-by: Arthur <learthurgo@gmail.com>

* changes to config.json

Signed-off-by: Arthur <learthurgo@gmail.com>

* removed cells from visualize_pit.py

Signed-off-by: Arthur <learthurgo@gmail.com>

* more changes to visualize_pit.py

Signed-off-by: Arthur <learthurgo@gmail.com>

* added analysis-master/metrics/__pycache__ to git ignore
moved pit configs in config.json to the borrom
superscript.py v 0.0.6.001

Signed-off-by: Arthur <learthurgo@gmail.com>

* removed old database key

Signed-off-by: Arthur <learthurgo@gmail.com>

* adjusted config files

Signed-off-by: Arthur <learthurgo@gmail.com>

* Delete config-pop.json

* fixed .gitignore

Signed-off-by: Arthur <learthurgo@gmail.com>

* analysis.py 1.2.1.003
added team kv pair to config.json

Signed-off-by: Arthur <learthurgo@gmail.com>

* superscript.py v 0.0.6.002

Signed-off-by: Arthur <learthurgo@gmail.com>

* finished app.py API
made minute changes to parentheses use in various packages

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* bug fixes in app.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* bug fixes in app.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* made changes to .gitignore

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* made changes to .gitignore

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* deleted a __pycache__ folder from metrics

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* more changes to .gitignore

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* additions to app.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* renamed app.py to api.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* removed extranneous files

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* renamed api.py to tra.py
removed rest api calls from tra.py

* renamed api.py to tra.py
removed rest api calls from tra.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* removed flask import from tra.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* changes to devcontainer.json

Signed-off-by: Arthur Lu <learthurgo@gmail.com>

* fixed unit tests to be correct
removed some tests regressions because of potential function overflow
removed trueskill unit test because of slight deviation chance

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-20 08:52:38 -05:00
Arthur Lu
f80886935d Merge pull request #25 from titanscout2022/master-staged
fixed bug in analysis unit tests
2020-05-19 13:19:47 -05:00
Arthur Lu
e542d4c414 Merge branch 'master' into master-staged 2020-05-19 13:19:40 -05:00
Arthur Lu
71752c7088 fixed bug in analysis unit tests
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-19 18:19:02 +00:00
Arthur Lu
844daa67a9 Merge pull request #23 from titanscout2022/master-staged
Merge minor .gitignore changes
2020-05-18 16:31:50 -05:00
Arthur Lu
cdb79d2b02 added data-analysis/.pytest_cache/ to .gitignore
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 16:28:42 -05:00
Arthur Lu
daaa1f38d3 Merge pull request #22 from titanscout2022/master
Reflect master to master-staged
2020-05-18 16:28:05 -05:00
Arthur Lu
6c7e19b2a5 Merge pull request #21 from titanscout2022/CI-tools
CI tools
2020-05-18 16:18:48 -05:00
Arthur Lu
7af341a649 i swear its working now
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 16:14:16 -05:00
Arthur Lu
da8f6331eb finally fixed issues
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 16:12:22 -05:00
Arthur Lu
2cbdd29ae5 changes
superscript testing still refuses to collect any tests

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 16:07:02 -05:00
Arthur Lu
74d42b48d1 still not working
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 16:01:02 -05:00
Arthur Lu
e9a12337d4 readded pytest install
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:59:34 -05:00
Arthur Lu
52fae5f2bf removed flake8 import from unit tests
fixed superscript unit tests

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:58:17 -05:00
Arthur Lu
1265eba415 removed lint checks because it was the stupid
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:54:15 -05:00
Arthur Lu
8f35f9e079 lint refused to exclude metrics
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:51:51 -05:00
Arthur Lu
059035e2d6 excluded imports
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:49:52 -05:00
Arthur Lu
7fc02936d3 more fixes
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:44:39 -05:00
Arthur Lu
36c519e8fa Merge branch 'CI-tools' of https://github.com/titanscout2022/red-alliance-analysis into CI-tools
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:44:20 -05:00
Arthur Lu
d0e4ddbfa2 also ignored regression.py
added temporary unit test for superscript.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:43:53 -05:00
Arthur Lu
c35abcb051 also ignored regression.py
added temporary unit test for superscript.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:43:36 -05:00
Arthur Lu
29dd369f02 attempted fixes by excluding titanlearn
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:39:59 -05:00
Arthur Lu
3e7768daca maybe its a versioning issue?
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:32:24 -05:00
Arthur Lu
48f821e88b Revert "trying python3 and pip3"
This reverts commit 7937fb6ee6.
2020-05-18 15:29:51 -05:00
Arthur Lu
8aa3674ee7 trying python3 and pip3
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:27:56 -05:00
Arthur Lu
fb2bd012db attempt to fix working directory issue
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:25:19 -05:00
Arthur Lu
5d5df55ad7 another attempt
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:11:24 -05:00
Arthur Lu
d4fec1e00f attempt to fix working directory issues
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 15:07:42 -05:00
Arthur Lu
369ec9e8f6 populated analysis unit test
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-18 14:59:24 -05:00
Arthur Lu
9f8308e1ee reverted indentation to github default
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-16 20:15:43 -05:00
Arthur Lu
a88b8176fb more indentation fixes
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-16 20:12:15 -05:00
Arthur Lu
3d64b0f8be changed indentation to spaces
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-16 20:09:29 -05:00
Arthur Lu
81225f7caa fixed indents
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-16 20:07:44 -05:00
Arthur Lu
bddbacf7b7 added items to .gitignore
renamed pythonpackage.yml to ut-analysis.yml
populated ut-analysis.yml
fixed spelling
added ut-superscript.py

Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-16 20:04:31 -05:00
Arthur Lu
75c30aa24c moved unit-test.py outside the analysis folder
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-16 19:41:19 -05:00
Arthur Lu
1dcb8a13d6 removed pythonapp because it is redundant
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-16 19:40:35 -05:00
Arthur Lu
740ef22944 created unit-test.py
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-16 19:33:56 -05:00
Arthur Lu
3e008b5364 Merge pull request #19 from titanscout2022/CI-package
merge
2020-05-16 19:31:25 -05:00
Arthur Lu
1b6988101b Create pythonpackage.yml 2020-05-16 19:30:52 -05:00
Arthur Lu
29d1cce5de Create pythonapp.yml 2020-05-16 19:29:14 -05:00
Arthur Lu
68ef16a5f8 Merge pull request #18 from titanscout2022/master-staged
analysis.py v 1.2.1.003
2020-05-15 16:06:02 -05:00
Arthur Lu
b721a2a4ce Merge branch 'master' into master-staged 2020-05-15 16:05:52 -05:00
Arthur Lu
96fb734c79 Merge pull request #17 from titanscout2022/equation.py-testing
merge equation.py-testing with master
2020-05-15 16:01:41 -05:00
Arthur Lu
6c5ce0ffa9 Merge branch 'master' into master-staged 2020-05-15 14:54:24 -05:00
Arthur Lu
28ec5a3471 analysis.py v 1.2.1.003
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-15 14:48:26 -05:00
Arthur Lu
d83d56772d analysis.py v 1.2.2.000
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-14 23:36:28 -05:00
Arthur Lu
4c9e8eddaf Merge pull request #16 from titanscout2022/master
pull recent changes into equation.py-testing
2020-05-14 23:22:03 -05:00
ltcptgeneral
d421b3867c Merge pull request #15 from titanscout2022/master-staged
mirrored .gitignore changes from gui-dev
2020-05-14 19:29:44 -05:00
ltcptgeneral
8dc1089f34 Merge branch 'master' into master-staged 2020-05-14 19:18:34 -05:00
Arthur
04a9d3bc91 mirrored .gitignore changes from gui-dev
Signed-off-by: Arthur <learthurgo@gmail.com>
2020-05-14 19:17:26 -05:00
ltcptgeneral
bc013b6eca Merge pull request #13 from titanscout2022/devksingh4-bsd-license
Switch to BSD License
2020-05-13 13:19:10 -05:00
Dev Singh
83e9bb4119 Update LICENSE 2020-05-13 12:04:59 -05:00
Dev Singh
b6c676281d Contributing guideline changes (#11)
* changes

* more changes

* more changes

* contributing.md: sync with other contributor docs

Signed-off-by: Dev Singh <dev@singhk.dev>

* Create MAINTAINERS

Signed-off-by: Dev Singh <dev@singhk.dev>

* arthur's changes

* changes

Signed-off-by: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com>

* more changes

Signed-off-by: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com>

* more changes

Signed-off-by: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com>

* contributing.md: sync with other contributor docs

Signed-off-by: Dev Singh <dev@singhk.dev>
Signed-off-by: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com>

* Create MAINTAINERS

Signed-off-by: Dev Singh <dev@singhk.dev>
Signed-off-by: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com>

* arthur's changes

Signed-off-by: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com>

Co-authored-by: ltcptgeneral <35508619+ltcptgeneral@users.noreply.github.com>
2020-05-13 11:56:52 -05:00
ltcptgeneral
7bee61659e Merge pull request #12 from titanscout2022/master-staged
analysis.py v 1.2.1.002
2020-05-13 11:44:25 -05:00
ltcptgeneral
192a74fd81 analysis.py v 1.2.1.002
Signed-off-by: Arthur Lu <learthurgo@gmail.com>
2020-05-13 11:35:46 -05:00
ltcptgeneral
7ba19ac627 changed data analysis folder to data-analysis
added egg-info and build folders to git ignore
deleted egg-info and build folders
2020-05-12 20:54:19 -05:00
ltcptgeneral
090396c278 9 2020-05-12 20:48:45 -05:00
ltcptgeneral
69c156bd58 Merge branch 'equation.py-testing' of https://github.com/titanscout2022/tr2022-strategy into equation.py-testing 2020-05-12 20:46:51 -05:00
ltcptgeneral
e2d46ec700 readded equation.ipynb 2020-05-12 20:46:42 -05:00
ltcptgeneral
221ead8880 readded equation.ipynb 2020-05-12 20:43:31 -05:00
ltcptgeneral
9be1168e09 bug fixes 2020-05-12 20:39:23 -05:00
ltcptgeneral
16603392c9 bug fixes 2020-05-12 20:21:11 -05:00
ltcptgeneral
6d80ffca59 analysis.py v 1.2.1.001 2020-05-12 20:19:58 -05:00
ltcptgeneral
55e22df665 visualization.py v 1.0.0.001 2020-05-05 22:37:32 -05:00
ltcptgeneral
f36bc9ac13 analysis.py v 1.2.1.000 2020-05-04 14:50:36 -05:00
ltcptgeneral
f796fb18da analysis.py v 1.2.0.006 2020-05-04 11:59:25 -05:00
ltcptgeneral
cd68bd41c4 fixed indent part 2 2020-05-01 23:16:32 -05:00
ltcptgeneral
80791744c8 fixed indentation 2020-05-01 23:14:19 -05:00
ltcptgeneral
0d17b5e883 moved equation.ipynb to correct folder 2020-05-01 23:06:32 -05:00
ltcptgeneral
4564473264 Merge pull request #10 from titanscout2022/master
merge file changes from master into equation.py-testing
2020-05-01 23:04:33 -05:00
ltcptgeneral
29aa3787d6 analysis.py v 1.2.0.005 2020-05-01 22:59:54 -05:00
ltcptgeneral
98c48897e0 converted space indentation to tab indentation 2020-05-01 16:15:07 -05:00
ltcptgeneral
e3623dec5b fixes 2020-05-01 16:07:57 -05:00
ltcptgeneral
7a95550954 reconsolidated arm64 and amd64 versions 2020-05-01 15:52:27 -05:00
ltcptgeneral
91cbcae3f0 analysis pkg v 1.0.0.12
analysis.py v 1.2.0.004
2020-04-30 16:03:37 -05:00
ltcptgeneral
551e27a4b4 8 2020-04-30 15:22:37 -05:00
ltcptgeneral
5ea3f730e5 7 2020-04-29 23:02:02 -05:00
ltcptgeneral
b566f665ad 6 2020-04-29 22:34:43 -05:00
ltcptgeneral
117b87b52a 5 2020-04-29 19:01:55 -05:00
ltcptgeneral
099c0dac91 4 2020-04-29 17:24:59 -05:00
ltcptgeneral
7134b9f769 3 2020-04-29 12:58:44 -05:00
ltcptgeneral
07cc2998ee 2 2020-04-29 00:35:19 -05:00
ltcptgeneral
354c195e82 1 2020-04-29 00:34:16 -05:00
ltcptgeneral
d76eb5acbb analysis.py v 1.2.0.003 2020-04-28 04:00:19 +00:00
ltcptgeneral
8d387b6bee analysis.py v 1.2.0.002 2020-04-22 03:32:34 +00:00
ltcptgeneral
3a3c37dbcb analysis.py v 1.2.0.001 2020-04-21 04:08:00 +00:00
ltcptgeneral
735ef58823 Merge pull request #9 from titanscout2022/fix
testing release 1.2 of analysis.py
2020-04-20 00:10:24 -05:00
ltcptgeneral
75d689301e Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2020-04-20 05:07:17 +00:00
ltcptgeneral
921f1f15d8 removed depreciated files to seperate repository 2020-04-20 05:07:07 +00:00
ltcptgeneral
033ba0e4d7 Update README.md 2020-04-20 00:02:35 -05:00
ltcptgeneral
1a96ca239e testing release 1.2 of analysis.py 2020-04-13 19:58:04 +00:00
ltcptgeneral
7838a2e905 analysis pkg v 1.0.0.11
analysis.py v 1.1.13.009
superscript.py v 0.0.5.002
2020-04-12 02:51:40 +00:00
ltcptgeneral
d635fed0ae analysis pkg v 1.0.0.10
analysis.py v 1.1.13.008
superscript.py v 0.0.5.001
2020-04-09 22:16:26 -05:00
art
57350f7ad4 removed app from dep 2020-04-05 21:42:12 +00:00
art
7bd945db4d added gitgraph to vscode container 2020-04-05 21:36:12 +00:00
ltcptgeneral
3cc3465d89 Merge pull request #8 from titanscout2022/containerization-testing
Containerization testing
2020-04-05 16:32:40 -05:00
art
7fd0a347b7 finalized changes to docker implements 2020-04-05 21:29:16 +00:00
ltcptgeneral
120774c000 Merge pull request #7 from titanscout2022/master
merge
2020-04-05 14:57:56 -05:00
art
31e475e1d0 verified and tested docker files 2020-04-05 19:53:01 +00:00
art
02516b9ef2 created dockerfiles 2020-04-05 19:04:07 +00:00
ltcptgeneral
d84c89efaf started on dockerfile 2020-04-05 12:46:21 -05:00
ltcptgeneral
6f93430585 removed unessasary comment 2020-04-04 11:59:19 -05:00
ltcptgeneral
193b54df4c created two new analysis variants
the existing amd64
new unpopulated arm64
2020-04-04 00:09:40 -05:00
ltcptgeneral
761a98c2d3 analysis pkg v 1.0.0.9 2020-03-17 20:03:49 -05:00
ltcptgeneral
b2f002af08 analysis.py v 1.1.13.007 2020-03-16 22:05:52 -05:00
ltcptgeneral
f9c8294c3a a 2020-03-10 00:45:42 -05:00
ltcptgeneral
15749d124f worked 2020-03-09 22:58:51 -05:00
ltcptgeneral
43351ab1f2 test1 2020-03-09 22:58:11 -05:00
ltcptgeneral
187c0ed245 Merge pull request #6 from titanscout2022/testing
Testing
2020-03-09 20:42:30 -05:00
ltcptgeneral
6b3ca52651 superscript.py v 0.0.5.000 2020-03-09 20:35:11 -05:00
ltcptgeneral
2faed21147 working 2020-03-09 20:29:44 -05:00
ltcptgeneral
c54702576d working 2020-03-09 20:18:30 -05:00
art
4e116ca713 removed unessasary stuff 2020-03-09 10:29:59 -05:00
ltcptgeneral
f47d7e781a Merge pull request #5 from titanscout2022/comp-edits
Comp edits
2020-03-09 10:28:48 -05:00
ltcptgeneral
767a1197b3 analysis.py v 1.1.13.006
regression.py v 1.0.0.003
analysis pkg v 1.0.0.8
2020-03-08 16:48:19 -05:00
ltcptgeneral
3827bb7d84 added get_team_rakings.py 2020-03-08 14:26:21 -05:00
ltcptgeneral
2c4e331909 a 2020-03-06 21:39:46 -06:00
Dev Singh
d6ed9eb89c hi 2020-03-06 21:21:37 -06:00
ltcptgeneral
afcc522acb superscript.py v 0.0.4.002 2020-03-06 21:09:16 -06:00
Dev Singh
e2be1955f7 add reqs 2020-03-06 20:44:40 -06:00
Dev Singh
d535beca7c add Procfile 2020-03-06 20:41:53 -06:00
ltcptgeneral
f5b2ae0811 analysis pkg v 1.0.0.7 2020-03-06 20:32:41 -06:00
ltcptgeneral
484f266659 Merge pull request #4 from titanscout2022/comp-edits
Comp edits merge
2020-03-06 20:29:50 -06:00
Dev Singh
af7bf43cb2 tiny brain fix 2020-03-06 14:52:41 -06:00
Dev Singh
210d2c92e1 ultimate carl the fat kid brain working 2020-03-06 14:50:54 -06:00
Dev Singh
1ca0726687 ultra galaxybrain working 2020-03-06 14:44:13 -06:00
Dev Singh
267918d67e fix 2020-03-06 13:12:01 -06:00
Dev Singh
33e0cc19a5 super ultra working 2020-03-06 12:43:01 -06:00
Dev Singh
abc1c26cd2 even more working 2020-03-06 12:21:17 -06:00
Dev Singh
b3dba9cc22 more working 2020-03-06 12:18:42 -06:00
Dev Singh
cf06c0f4d8 working 2020-03-06 12:15:35 -06:00
Dev Singh
82567a5f69 working 2020-03-06 11:50:07 -06:00
Dev Singh
548668e2a4 maybe working 2020-03-06 11:27:32 -06:00
Dev Singh
2fa0d75a30 a 2020-03-06 11:18:02 -06:00
Dev Singh
201752a55e testing part 2 better electric boogaloo 2020-03-06 11:16:24 -06:00
Dev Singh
864b27bc0c testing 2020-03-06 11:14:10 -06:00
Dev Singh
37109a4947 10:57 2020-03-06 10:57:39 -06:00
Dev Singh
4b629eeb3b 10:43 2020-03-06 10:43:45 -06:00
Dev Singh
2275fbcfb3 10:25 2020-03-06 10:25:20 -06:00
Dev Singh
9c033eff31 10:21 unverified 2020-03-06 10:21:23 -06:00
art
25a05beca2 superscript.py v 0.0.3.000 2020-03-05 22:52:02 -06:00
art
d0dc9a1047 analysis.py v 1.1.13.001
analysis pkg v 1.0.0.006
2020-03-05 13:18:33 -06:00
art
e488b4a4d1 analysis pkg v 1.0.0.005 2020-03-05 12:44:09 -06:00
art
a0c90bad2c analysis pkg v 1.0.0.004 2020-03-05 12:29:58 -06:00
art
8e0e706fe9 analysis.py v 1.1.13.000 2020-03-05 12:28:16 -06:00
art
d9b26f8ef9 removed unessasaary folders and files 2020-03-05 11:17:49 -06:00
ltcptgeneral
df7cce80d6 superscript.py v 0.0.2.001 2020-03-04 23:59:50 -06:00
ltcptgeneral
db99028661 analysis.py v 1.1.12.006
analysis pkg v 1.0.0.003
2020-03-04 21:20:00 -06:00
ltcptgeneral
0b1dd04216 a 2020-03-04 20:15:03 -06:00
ltcptgeneral
67b382b422 superscript.py v 0.0.1.004 2020-03-04 20:12:09 -06:00
ltcptgeneral
49c8bcafde analysis.py v 1.1.12.005
analysis pkg v 1.0.0.002
2020-03-04 18:55:45 -06:00
ltcptgeneral
0d120e572f analysis pkg 1.0.0.001 2020-03-04 17:54:30 -06:00
ltcptgeneral
dd3d84f46a analysis.py v 1.1.12.004 2020-03-04 17:52:07 -06:00
ltcptgeneral
233b1dcda3 superscript.py v 0.0.1.003 2020-03-04 16:53:25 -06:00
ltcptgeneral
cd44f8a856 superscript.py v 0.0.1.002 2020-03-04 15:57:20 -06:00
ltcptgeneral
a8be0bab6a a 2020-03-04 13:47:56 -06:00
ltcptgeneral
9b1b3b50b3 refactors 2020-03-04 13:42:54 -06:00
ltcptgeneral
758c7d4a92 a 2020-03-04 12:58:57 -06:00
ltcptgeneral
8d83cc6336 d 2020-03-04 12:37:58 -06:00
art
a7f5ec2a15 moved analysis-master out of data analysis 2020-03-03 22:38:34 -06:00
art
23626d8cc7 c 2020-03-03 21:04:47 -06:00
art
4c0ffb433b changed setup.py back 2020-03-03 21:04:17 -06:00
art
868f32ae59 b 2020-03-03 21:00:26 -06:00
art
28a24e1c15 a 2020-03-03 20:59:52 -06:00
art
8a459813ef made license explit in setup.py 2020-03-03 20:55:46 -06:00
art
1b4f879094 recompiled analysis.py 2020-03-03 20:48:50 -06:00
art
6f898d6772 packagefied analysis (finally) 2020-03-03 20:30:54 -06:00
art
218e204281 added setup.py 2020-03-03 20:24:49 -06:00
art
7a030d877b created __init__.py for analysis package 2020-03-03 20:17:05 -06:00
art
db02e04f14 superscript.py v 0.0.1.001 2020-03-03 20:10:29 -06:00
art
8265242e89 superscript.py v 0.0.1.000 2020-03-03 19:39:58 -06:00
art
f45773d470 moved app in dep 2020-03-03 18:48:17 -06:00
art
1d5c26195b superscript.py v 0.0.0.009
changes to config.csv
2020-03-03 18:40:35 -06:00
art
c1d2fab930 changes, testing 2020-03-03 18:13:03 -06:00
art
09e6dc16f3 superscript.pv v 0.0.0.008
data.py created
2020-03-03 18:02:24 -06:00
art
0d5dea9bc9 removed \n s 2020-03-03 16:27:30 -06:00
art
c1cc90a32b superscript.py v 0.0.0.007 2020-03-03 16:01:07 -06:00
art
9c105bc218 superscript.py v 0.0.0.006 2020-03-03 15:42:37 -06:00
ltcptgeneral
a1aa5b3d74 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2020-02-29 01:06:06 -06:00
ltcptgeneral
af010f51fc a 2020-02-29 01:05:58 -06:00
art
2aef94fb71 a 2020-02-26 08:58:27 -06:00
Dev Singh
4b9d5dae8f Create LICENSE 2020-02-23 13:19:40 -06:00
Dev Singh
9c15004925 why are we unlicense? 2020-02-23 13:18:37 -06:00
art
46f625f095 a 2020-02-20 19:29:21 -06:00
art
2aac657f63 something changed 2020-02-20 19:27:09 -06:00
art
9d834a64a6 a 2020-02-20 19:22:06 -06:00
art
6e5b04b1f5 fixed jacob 2020-02-20 19:19:20 -06:00
art
a2df09dec0 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2020-02-20 19:12:48 -06:00
art
7b2a513f28 a 2020-02-20 19:12:33 -06:00
jlevine18
69108dbf4c tba_match_result_request.py v0.0.1 2020-02-19 21:50:56 -06:00
art
0ab99556ab dep 2020-02-19 19:54:59 -06:00
art
9eb738e7e6 fixes 2020-02-19 19:53:23 -06:00
art
3f045ac044 something 2020-02-19 19:52:31 -06:00
art
312bae3248 superscript v 0.0.0.005 2020-02-19 19:51:45 -06:00
art
d80fef1781 superscript.py v 0.0.0.004 2020-02-19 19:21:48 -06:00
art
2486927a53 fix 2020-02-18 20:38:12 -06:00
art
7f975b5e7b analysis.py v 1.1.12.003 2020-02-18 20:32:35 -06:00
art
75409cfe24 analysis.py v 1.1.12.002, superscript.py
v 0.0.0.003
2020-02-18 20:29:22 -06:00
art
260eea1fab superscript.py v 0.0.0.002 2020-02-18 19:54:09 -06:00
art
22c24a1fc2 doc 2020-02-18 16:16:57 -06:00
art
1ae56f8dfd analysis.py v 1.1.12.000 2020-02-18 15:25:23 -06:00
art
a92d28ace7 superscript v 0.0.0.001 2020-02-18 11:31:20 -06:00
art
209f2efe56 fix 2020-01-17 10:21:15 -06:00
art
00a18d461b analysis.py v 1.1.11.010 2020-01-17 10:18:28 -06:00
art
8dec793bdd something changed idk what 2020-01-08 15:01:33 -06:00
art
1fa0fd6d7a analysis.py v 1.1.11.009 2020-01-07 15:55:49 -06:00
ltcptgeneral
2e8ad61224 analysis?py v 1.1.11.008 2020-01-06 23:48:28 -06:00
art
0638033293 created superscript.py 2020-01-06 14:55:36 -06:00
ltcptgeneral
0957df219a Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2020-01-05 19:08:06 -06:00
ltcptgeneral
ac420ad9fa whatever 2020-01-05 19:06:54 -06:00
art
13c536282d regression v 1.0.0.003 2020-01-04 10:19:31 -06:00
art
a20c155cfc analysis.py v 1.1.11.007 2020-01-04 10:13:25 -06:00
art
e5650b1fe4 analysis.py v 1.1.11.006 2020-01-04 10:04:20 -06:00
art
ffde9151a8 quick fix 2020-01-04 09:57:06 -06:00
art
e287aef453 spelling 2019-12-23 12:49:38 -06:00
art
7d76f27eea analysis.py v 1.1.11.005 2019-12-23 12:48:13 -06:00
ltcptgeneral
daecfcc4ee analysis.py v 1.1.11.004 2019-11-16 16:21:06 -06:00
art
0f37b855d1 analysis.py 1.1.11.003 2019-11-11 10:04:12 -06:00
ltcptgeneral
8faea0e56f spelling fix 2019-11-10 13:59:59 -06:00
ltcptgeneral
9e1add79d3 analysis?py v 1.1.11.002 2019-11-10 02:04:48 -06:00
ltcptgeneral
43e3083ac2 analysis.py v 1.1.11.001 2019-11-10 01:38:39 -06:00
art
445ddf4d68 analysis.py v 1.1.11.000 2019-11-08 13:20:38 -06:00
art
345c9ebc0d analysis.py v 1.1.10.00 2019-11-08 12:41:37 -06:00
art
fa6e42e2ee analysis.py v 1.1.9.002 2019-11-08 12:26:42 -06:00
art
93f87dbdc1 test 2019-11-08 09:50:54 -06:00
ltcptgeneral
976c7b2db5 quick fix 2019-11-06 15:33:56 -06:00
ltcptgeneral
4f5fdd89d7 analysis.py 1.1.9.001 2019-11-06 15:32:21 -06:00
ltcptgeneral
b6ecda5174 analysis.py v 1.1.9.000 2019-11-06 15:26:13 -06:00
art
5b12fa4f9d quick fix 2019-11-05 16:25:53 -06:00
art
7d820f0179 fixed indentation 2019-11-05 13:45:35 -06:00
art
e43de9aac1 analysis.py v 1.1.8.000 2019-11-05 13:38:49 -06:00
art
5ecd01279f analysis.py v 1.1.7.000 2019-11-05 13:14:08 -06:00
art
3c21512a46 analysis.py v 1.1.6.002 2019-11-05 12:56:53 -06:00
art
bfa69bf070 analysis.py v 1.1.6.001 2019-11-05 12:53:39 -06:00
art
5b39bb771e analysis.py v 1.1.6.000 2019-11-05 12:47:04 -06:00
art
f133bdcfcf f 2019-11-04 10:14:28 -06:00
art
711518cfdb quick fix 2019-11-04 10:10:29 -06:00
art
1cd059732d __all__ fixes 2019-11-04 10:08:28 -06:00
art
03ea05fa00 something changed, idk 2019-11-01 13:12:01 -05:00
art
a87216b971 visualization v 1.0.0.000, titanlearn v 2.0.1.001 2019-11-01 13:08:32 -05:00
art
1580ca3b3b analysis.py v 1.1.5.001 2019-10-31 11:03:52 -05:00
art
2aa5b376b4 titanlearn v 2.0.1.000 2019-10-29 14:21:53 -05:00
art
1fa47cd1cb quick fix 2019-10-29 12:27:16 -05:00
art
28bc2b2f21 fixes 2019-10-29 12:25:18 -05:00
art
2b42127971 restructured file management part 3 2019-10-29 10:53:11 -05:00
art
41491c5e85 restructured file management part 2 2019-10-29 10:50:10 -05:00
art
a979a413f8 restructured file management 2019-10-29 10:37:23 -05:00
art
85ca327c55 quick fix 2019-10-29 10:07:56 -05:00
art
7fa19c62b8 depreciated files, titanlearn v 2.0.0.001 2019-10-29 10:04:56 -05:00
art
47dbdd2b39 titanlearn.py v 2.0.0.000 2019-10-29 09:41:49 -05:00
art
03431fc5eb depreciated 2019 superscripts and company 2019-10-29 09:23:00 -05:00
art
886735d9c8 analysis.py v 1.1.5.001 2019-10-25 09:50:02 -05:00
art
f70e5f573e analysis.py v 1,1,5,001 2019-10-25 09:19:18 -05:00
ltcptgeneral
d5bfdf5859 analysis.py v 1.1.5.000 2019-10-09 23:58:08 -05:00
jlevine18
e47d2ab142 fix PolyRegKernel 2019-10-09 22:23:56 -05:00
art
6a082825eb ok fixed half of it 2019-10-08 13:49:19 -05:00
art
5bfca06400 jacob fix poly regression! 2019-10-08 13:35:32 -05:00
art
19c5448758 removed extra import 2019-10-08 12:58:04 -05:00
art
d86df50159 added import math 2019-10-08 09:30:07 -05:00
art
2ad6cffe1b removed regression import 2019-10-07 12:58:57 -05:00
ltcptgeneral
94cfa559d7 fix 2019-10-06 19:12:58 -05:00
art
6663eb3d00 refactor 2019-10-05 16:53:03 -05:00
art
92f376e598 quick fixes 2019-10-05 16:51:11 -05:00
art
c31de42a99 analysis.py v 1.1.4.000 2019-10-05 16:18:49 -05:00
art
5eeec6e730 quick change 2019-10-04 10:37:29 -05:00
art
61e2cad206 comments 2019-10-04 10:36:44 -05:00
art
eade12bb71 analysis.py v 1.1.3.002 2019-10-04 10:34:31 -05:00
art
469dcd0ce2 quick fix 2019-10-04 09:28:25 -05:00
art
ab8a796f58 quick refactor of glicko2() 2019-10-04 09:12:12 -05:00
art
5af003b6f5 upload trueskill for testing purposes 2019-10-04 09:02:46 -05:00
art
1019fb72d5 analysis.py v 1.1.3.001 2019-10-04 08:13:28 -05:00
ltcptgeneral
8103b98d1e analysis.py v 1.1.3.000 2019-10-04 00:26:21 -05:00
ltcptgeneral
43ec037e03 Merge pull request #3 from titanscout2022/elo
Elo
2019-10-03 11:22:57 -05:00
art
026bf3467c analysis.py v 1.1.2.003 2019-10-03 10:48:56 -05:00
art
7224c31e6d analysis.py v 1.1.2.002 2019-10-03 10:42:05 -05:00
art
04411327e8 quick tests 2019-10-02 20:57:09 -05:00
art
86c7f33f23 stuff 2019-10-02 20:56:06 -05:00
art
f8267e17a5 analysis.py v 1.1.2.001 2019-10-01 08:59:04 -05:00
ltcptgeneral
71a0227f8a reduced random blank lines 2019-09-30 16:09:31 -05:00
ltcptgeneral
bf1218fdfd analysis.py v 1.1.2.000, quick fixes 2019-09-30 16:02:32 -05:00
ltcptgeneral
7b73972383 fixes 2019-09-30 15:49:15 -05:00
ltcptgeneral
942203032d quick fix 2019-09-30 13:41:15 -05:00
ltcptgeneral
c135ddb856 analysis.py v 1.1.1.001 2019-09-30 13:37:19 -05:00
ltcptgeneral
fd991401c4 analysis.py v 1.1.1.000 2019-09-30 10:11:53 -05:00
ltcptgeneral
92d6538561 jacob forgot self.scal_mult 2019-09-27 10:13:17 -05:00
ltcptgeneral
6ec27343db Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-09-27 09:49:40 -05:00
jlevine18
08232f980d Add files via upload 2019-09-27 09:48:05 -05:00
ltcptgeneral
5971fdc070 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-09-27 09:41:07 -05:00
ltcptgeneral
19a695df28 added testing files to gitignore 2019-09-27 09:40:50 -05:00
ltcptgeneral
b8ad0032fd spelling fix 2019-09-26 19:22:44 -05:00
jlevine18
e47b6efe71 cudaregress v 1.0.0.002 2019-09-26 13:35:37 -05:00
jlevine18
daab3e8c5b wait arthur moved this 2019-09-26 13:34:42 -05:00
jlevine18
a844f703b1 cudaregress 1.0.0.002 2019-09-26 13:31:22 -05:00
ltcptgeneral
fbf5cd7c1c quick fix 2019-09-25 14:14:17 -05:00
ltcptgeneral
1d0dc8e38a analysis.py v 1.1.0.007 2019-09-25 14:11:20 -05:00
ltcptgeneral
9fd5ca249c moved and renamed cudaregress.py to regression.py 2019-09-23 09:58:08 -05:00
jlevine18
3d77fc5290 global vars to bugfix 2019-09-23 09:28:35 -05:00
jlevine18
4522c9561b Set device bc I apparently forgot to do that 2019-09-23 00:01:31 -05:00
jlevine18
d76075fbfa don't need the testing notebook up here anymore 2019-09-22 23:23:29 -05:00
jlevine18
06a07bb983 Add files via upload 2019-09-22 23:22:21 -05:00
jlevine18
3cc4cf2f23 added cudaregress.py package 2019-09-22 23:19:46 -05:00
ltcptgeneral
8dde6aa4ae Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-09-22 23:10:24 -05:00
jlevine18
2df43846c6 added cuda to cudaregress notebook 2019-09-22 23:05:49 -05:00
ltcptgeneral
97d3995b6c quick fix 2019-09-22 21:54:28 -05:00
jlevine18
5aecdb5674 fix cuda regress testing notebook 2019-09-22 21:38:12 -05:00
jlevine18
6341d7f884 added cudaRegress testing notebook 2019-09-21 13:35:51 -05:00
ltcptgeneral
d19746164a analysis.py v 1.1.0.006 2019-09-17 12:21:44 -05:00
ltcptgeneral
c9ab13ec21 analysis.py v 1.1.0.005 2019-09-17 08:46:47 -05:00
ltcptgeneral
d490a8634c analysis.py v 1.1.0.004 2019-09-16 11:11:27 -05:00
ltcptgeneral
deb8061ec5 benchmarked 2019-09-13 15:09:33 -05:00
ltcptgeneral
af627c449c analysis.py v 1.1.0.003 2019-09-13 14:38:24 -05:00
ltcptgeneral
3719df2f47 quick fixes 2019-09-13 14:29:22 -05:00
ltcptgeneral
3fa6af8594 analysis.py v 1.1.0.002 2019-09-13 13:59:13 -05:00
ltcptgeneral
b2ac70a148 moved files to subfolder dep 2019-09-13 13:50:12 -05:00
ltcptgeneral
30ebfeb3a9 analysis.py v 1.1.0.001 2019-09-13 12:33:02 -05:00
ltcptgeneral
fe91baff33 analysis.py v 1.1.0.000 2019-09-13 11:14:13 -05:00
ltcptgeneral
797d1e9ff4 Rename analysis-better.py to analysis.py 2019-09-12 11:05:33 -05:00
ltcptgeneral
63d7f7d116 Rename analysis.py to analysis-dep.py 2019-09-12 11:04:54 -05:00
ltcptgeneral
4bfb4ba238 analysis-better.py v 1.0.9.000
changelog:
    - refactored
    - numpyed everything
    - removed stats in favor of numpy functions
2019-04-09 09:43:42 -05:00
ltcptgeneral
84483d36f2 Create analysis-better.py 2019-04-09 09:30:37 -05:00
ltcptgeneral
9e39b640f1 Delete temp.txt 2019-04-08 09:38:27 -05:00
ltcptgeneral
8bde403923 Update .gitignore 2019-04-08 09:34:49 -05:00
ltcptgeneral
19b02d93c7 quick fixes 2019-04-08 09:26:32 -05:00
ltcptgeneral
979c8f7068 Merge branch 'c' 2019-04-08 09:17:26 -05:00
ltcptgeneral
c5d8a4fdb2 Create analysis.cp37-win_amd64.pyd 2019-04-08 09:17:16 -05:00
ltcptgeneral
6188e1e2cc cython working 2019-04-08 09:16:26 -05:00
ltcptgeneral
899a809ba6 analysis in c working 2019-04-05 21:01:17 -05:00
ltcptgeneral
087e201baa started c-ifying analysis 2019-04-05 17:24:24 -05:00
ltcptgeneral
0d240e3b09 Delete uuh.png 2019-04-03 14:43:59 -05:00
ltcptgeneral
bf5d2585d7 fixed superscript 2019-04-03 14:39:22 -05:00
ltcptgeneral
493b9b19b2 beautified 2019-04-03 13:34:31 -05:00
ltcptgeneral
2802d8572c Delete keytemp.json 2019-04-02 14:07:24 -05:00
ltcptgeneral
b0bc3a444b Update .gitignore 2019-04-02 13:43:08 -05:00
ltcptgeneral
d74a63d4e7 Merge branch 'multithread' 2019-04-02 13:40:02 -05:00
ltcptgeneral
d84fb2adc7 whtever 2019-04-01 13:22:37 -05:00
jlevine18
4c5af71671 teams for wisconsin regional 2019-03-28 07:54:08 -05:00
ltcptgeneral
548a0ca612 teams added 2019-03-27 23:40:05 -05:00
ltcptgeneral
4fc62af36e Update tbarequest.cpython-37.pyc 2019-03-22 19:40:17 -05:00
ltcptgeneral
8037acb531 Update scores.csv 2019-03-22 19:11:11 -05:00
ltcptgeneral
1b19965449 Merge branch 'master' of https://github.com/ltcptgeneral/tr2022-strategy 2019-03-22 15:22:05 -05:00
ltcptgeneral
93b0204344 something changed 2019-03-22 15:21:58 -05:00
jlevine18
b798214367 Update tbarequest.py 2019-03-22 15:09:52 -05:00
jlevine18
c6195a8836 add req_team_info 2019-03-22 14:54:55 -05:00
Jacob Levine
cdeaa7e226 fixed textArea bug 2019-03-22 12:39:16 -05:00
ltcptgeneral
e9a0946734 Merge branch 'master' of https://github.com/ltcptgeneral/tr2022-strategy 2019-03-22 11:54:43 -05:00
ltcptgeneral
d77ac67ef1 created nishant only script 2019-03-22 11:54:40 -05:00
Jacob Levine
81607123e2 fixed another bug 2019-03-22 11:53:15 -05:00
Jacob Levine
a4775730a6 fixed textArea bug 2019-03-22 11:50:03 -05:00
Jacob Levine
7693a9ad8a Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-03-22 11:28:45 -05:00
Jacob Levine
d59e7e3bba added fields that Arthut needed 2019-03-22 11:28:22 -05:00
Archan Das
df2c672175 Update teams.csv 2019-03-22 11:12:51 -05:00
Jacob Levine
361851c31b web3\ 2019-03-22 09:18:59 -05:00
Jacob Levine
46cab420d5 web3\ 2019-03-22 09:16:17 -05:00
Jacob Levine
6eb47702c0 web3 2019-03-22 09:14:41 -05:00
Jacob Levine
6c9d2d4dfc web4 2019-03-22 09:13:44 -05:00
Jacob Levine
c8af6130c0 web3 2019-03-22 09:12:29 -05:00
Jacob Levine
6f2db95b20 web3 2019-03-22 08:51:42 -05:00
Jacob Levine
62dcb6adf3 web2 2019-03-22 08:50:37 -05:00
Jacob Levine
9b41dc056b web 2019-03-22 08:49:50 -05:00
Jacob Levine
680cddd57e archan needs to import! 2019-03-22 08:46:04 -05:00
Jacob Levine
a02ba5d3d4 final fixes 2019-03-22 08:44:42 -05:00
Jacob Levine
6f0ada7025 change letter 2019-03-22 08:39:01 -05:00
Jacob Levine
c7612f389f final fixes 2019-03-22 08:36:33 -05:00
Jacob Levine
b1b9e2e4d3 update archan's script 2019-03-22 08:27:53 -05:00
Jacob Levine
b67b170c6f don't sort matches alphabetically, sort them numerically 2019-03-22 07:48:44 -05:00
Jacob Levine
dd58c68e3b testing mistakes 2019-03-22 07:37:05 -05:00
Jacob Levine
d05d2eaf1f ok seriously what is going on? 2019-03-22 07:34:00 -05:00
Jacob Levine
d286a45c2f testing mistakes 2019-03-22 07:32:05 -05:00
Jacob Levine
6f6259a0f3 testing mistakes 2019-03-22 07:29:47 -05:00
Jacob Levine
dae28cfe8c testing mistakes 2019-03-22 07:28:55 -05:00
Jacob Levine
f058ee15ab ok 2019-03-22 07:28:11 -05:00
Jacob Levine
5ae65a7ee8 testing mistakes 2019-03-22 07:26:08 -05:00
Jacob Levine
27552e2bb5 wtf 2019-03-22 07:24:27 -05:00
Jacob Levine
018c2e6234 testing mistakes 2019-03-22 07:24:15 -05:00
Jacob Levine
6412ab6f29 Revert "ok seriously what is going on?"
This reverts commit 8de7078240.
2019-03-22 07:17:26 -05:00
Jacob Levine
0eecc92830 Revert "testing mistakes"
This reverts commit 1f20ad7f37.
2019-03-22 07:16:36 -05:00
Jacob Levine
8a40dc9386 testing mistakes 2019-03-22 07:15:44 -05:00
Jacob Levine
4393b5e704 ok seriously what is going on? 2019-03-22 07:05:45 -05:00
Jacob Levine
5f17dbfe81 wtf 2019-03-22 07:03:31 -05:00
Jacob Levine
e291ea509f testing mistakes 2019-03-22 07:01:19 -05:00
Jacob Levine
edbc38fcaa wtf 2019-03-22 06:57:27 -05:00
Jacob Levine
d967c612c6 move so it doesnt crash 2019-03-22 06:53:28 -05:00
Jacob Levine
61ce8797d6 fix add script for text areas 2019-03-22 06:48:45 -05:00
Jacob Levine
f85ac154e8 dont be stupid 2019-03-22 01:06:05 -05:00
Jacob Levine
8c8c9f2918 chrome is still horrible 2019-03-22 01:04:18 -05:00
Jacob Levine
99a651bbe0 case sensitive 2019-03-22 00:50:20 -05:00
Jacob Levine
bcafeee178 chrome is still horrible 2019-03-22 00:49:19 -05:00
Jacob Levine
cd608df97a chrome is horrible 2019-03-22 00:46:19 -05:00
Jacob Levine
63822744f7 dont be stupid 2019-03-22 00:40:27 -05:00
Jacob Levine
8eafbc6301 dont be stupid 2019-03-22 00:38:37 -05:00
Jacob Levine
10fc5c27fa dont be stupid 2019-03-22 00:36:12 -05:00
Jacob Levine
ca667991ed bugfix 23 2019-03-22 00:33:50 -05:00
Jacob Levine
79e95bba42 af 2019-03-22 00:31:31 -05:00
Jacob Levine
18595669e0 bugfix 22 2019-03-22 00:30:36 -05:00
Jacob Levine
3735252d8f st 2019-03-22 00:29:34 -05:00
Jacob Levine
1ad1df9362 bugfix 21 2019-03-22 00:27:44 -05:00
Jacob Levine
c46c423ab5 bugfix 20 2019-03-22 00:24:23 -05:00
Jacob Levine
c6f768a096 bugfix 19 2019-03-22 00:21:46 -05:00
Jacob Levine
f0b9a9ef6b bugfix 18 2019-03-22 00:20:01 -05:00
Jacob Levine
6f39cc8ed9 bugfix 16,17 2019-03-22 00:16:32 -05:00
Jacob Levine
245a79171f ian stopped naming his questions 2019-03-22 00:09:24 -05:00
Jacob Levine
f86919db4c bugfix 15 2019-03-22 00:08:00 -05:00
Jacob Levine
dfe0b45be6 bugfix 14 2019-03-22 00:05:35 -05:00
Jacob Levine
ef0837c9b2 ESCAPE STRINGS 2019-03-22 00:03:25 -05:00
Jacob Levine
ef2dede864 minor fixes 2019-03-22 00:01:01 -05:00
Jacob Levine
ff52a5f8db bugfix 10 2019-03-21 23:58:46 -05:00
Jacob Levine
79bb8c5bd2 dont be stupid 2019-03-21 23:53:16 -05:00
Jacob Levine
52c8ef1cf3 minor fixes 2019-03-21 23:45:25 -05:00
Jacob Levine
2e4c178a67 dont be stupid 2019-03-21 23:40:46 -05:00
Jacob Levine
680fe614cf fix fix bugfix 6 2019-03-21 23:36:29 -05:00
Jacob Levine
4a017654d8 fix bugfix 6 2019-03-21 23:35:14 -05:00
Jacob Levine
9a5b78dd2b bugfix 6 2019-03-21 23:33:11 -05:00
Jacob Levine
bc41aaf63a bugfix 5 2019-03-21 23:31:50 -05:00
Jacob Levine
f2fc59c7c5 bugfix 4 2019-03-21 23:30:38 -05:00
Jacob Levine
27f294a37e remove random 'm' 2019-03-21 23:29:01 -05:00
Jacob Levine
b253ebb45f website for peoria 2019-03-21 23:28:18 -05:00
Jacob Levine
cc7e92cb8f typo! 2019-03-21 23:26:45 -05:00
Jacob Levine
cf30ccdfa7 website for peoria 2019-03-21 23:25:24 -05:00
Jacob Levine
b5245e3d57 readded css 2019-03-21 23:17:24 -05:00
Jacob Levine
7d9a84f88b Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-03-21 23:13:12 -05:00
Jacob Levine
3fbd02b8b7 website for peoria 2019-03-21 23:12:49 -05:00
Archan Das
73c57464bd Add files via upload 2019-03-21 22:52:08 -05:00
Archan Das
2d6dbc037c Add files via upload 2019-03-21 22:50:27 -05:00
ltcptgeneral
251ba0b665 Delete test.py 2019-03-21 22:17:33 -05:00
ltcptgeneral
3f6112a8cb superscript v 1.0.6.001
changelog:
- fixed multiple bugs
- works now
2019-03-21 18:02:51 -05:00
ltcptgeneral
686f61e373 WORKING 2019-03-21 17:52:59 -05:00
ltcptgeneral
e4a179925a Revert "beautified"
This reverts commit 0d8780b3c1.
2019-03-21 17:50:52 -05:00
ltcptgeneral
0a7879c32d Revert "yeeted"
This reverts commit 1f2edeba51.
2019-03-21 17:50:46 -05:00
ltcptgeneral
7892f5d367 Revert "stuff"
This reverts commit 268b01fc93.
2019-03-21 17:50:37 -05:00
ltcptgeneral
86f048dcf7 Revert "no"
This reverts commit ac7c169a27.
2019-03-21 17:50:32 -05:00
ltcptgeneral
c7642c3276 no 2019-03-21 17:43:36 -05:00
ltcptgeneral
b0ed636039 stuff 2019-03-21 17:34:27 -05:00
ltcptgeneral
ccdbf1b3e5 Merge branch 'master' of https://github.com/ltcptgeneral/tr2022-strategy 2019-03-21 17:28:23 -05:00
ltcptgeneral
b4175ae1df yeeted 2019-03-21 17:28:16 -05:00
jlevine18
d26d99e345 Delete Untitled.ipynb 2019-03-21 17:28:04 -05:00
Jacob Levine
9dd4483de6 beautified 2019-03-21 17:27:31 -05:00
ltcptgeneral
52c3ddd2d6 WORKING!!!! 2019-03-21 17:25:16 -05:00
ltcptgeneral
4cc1ad28fe Update superscript.py 2019-03-21 17:00:38 -05:00
ltcptgeneral
5a1efdaf3b Update superscript.py 2019-03-21 16:59:29 -05:00
ltcptgeneral
e4c58d817f 1 2019-03-21 16:58:37 -05:00
ltcptgeneral
f8085c7bb2 Merge branch 'master' of https://github.com/ltcptgeneral/tr2022-strategy 2019-03-21 16:57:02 -05:00
jlevine18
bd79ddff6b Update superscript.py 2019-03-21 16:55:04 -05:00
ltcptgeneral
508e0c5234 Create superscript.py 2019-03-21 16:52:37 -05:00
ltcptgeneral
da9d49102d a 2019-03-21 16:52:22 -05:00
ltcptgeneral
a3dda50b8d wtf2 2019-03-21 16:50:32 -05:00
Jacob Levine
75cec13414 fixed null removal script 2019-03-21 16:48:02 -05:00
ltcptgeneral
7642c39197 working 2019-03-21 16:17:45 -05:00
ltcptgeneral
1538da4348 WTF 2019-03-21 15:59:47 -05:00
ltcptgeneral
a20c427e77 Merge branch 'master' of https://github.com/ltcptgeneral/tr2022-strategy 2019-03-21 15:25:46 -05:00
ltcptgeneral
7b81385f58 test 2019-03-21 15:25:36 -05:00
jlevine18
42f9f2ccdd add opr request 2019-03-21 15:23:24 -05:00
ltcptgeneral
8d65590fd4 Update test.py 2019-03-21 15:14:24 -05:00
ltcptgeneral
c336aa5aa9 Update superscript.py 2019-03-21 15:07:24 -05:00
ltcptgeneral
c669bd2007 wtf 2019-03-21 15:06:54 -05:00
ltcptgeneral
a81eb86a17 test 2019-03-21 14:38:53 -05:00
ltcptgeneral
38ccef02ad Update test.py 2019-03-20 22:15:31 -05:00
ltcptgeneral
eac5c8441e Update test.py 2019-03-20 21:36:49 -05:00
ltcptgeneral
c333ba58df too much iteration 2019-03-20 20:18:55 -05:00
ltcptgeneral
2ff6863c9d Update issue templates 2019-03-20 18:14:59 -05:00
ltcptgeneral
fef200cedd Update superscript.py 2019-03-20 18:14:32 -05:00
ltcptgeneral
3df72ad328 Create LICENSE 2019-03-20 17:41:10 -05:00
ltcptgeneral
3d8195f078 Create CONTRIBUTING.md 2019-03-20 17:37:38 -05:00
ltcptgeneral
ea28b99de1 Update README.md 2019-03-20 17:33:47 -05:00
ltcptgeneral
c1c3a026b1 fix 0 2019-03-20 17:23:41 -05:00
ltcptgeneral
d35937aa2a key fix? 2019-03-20 16:53:53 -05:00
ltcptgeneral
ac29227300 Update superscript.py 2019-03-20 16:38:42 -05:00
ltcptgeneral
0c44b419d0 superscript.py - v 1.0.6.000
changelog:
- added pulldata function
- service now pulls in, computes data, and outputs data as planned
2019-03-20 16:16:48 -05:00
ltcptgeneral
f8792858df 1234567890 2019-03-20 14:10:47 -05:00
Jacob Levine
4942532297 bugfix 16 2019-03-18 21:06:13 -05:00
Jacob Levine
9a366e8fb3 bugfix 15 2019-03-18 21:02:23 -05:00
Jacob Levine
1da7c58da2 bugfix 14 2019-03-18 20:47:16 -05:00
Jacob Levine
020a8ed9f0 bugfix 13 2019-03-18 19:20:27 -05:00
Jacob Levine
b41a319dcd bugfix 12 2019-03-18 19:16:17 -05:00
Jacob Levine
b1a063c3f9 bugfix 11 2019-03-18 19:15:17 -05:00
Jacob Levine
735a797bcf bugfix 10, now with template literals 2019-03-18 19:10:18 -05:00
Jacob Levine
02a68729b9 bugfix 9 2019-03-18 18:57:43 -05:00
Jacob Levine
1543269b95 bugfix 8 2019-03-18 18:53:41 -05:00
Jacob Levine
85d54211cb bugfix 7 2019-03-18 18:41:20 -05:00
Jacob Levine
a45ab906ab bugfix 4 2019-03-18 18:38:45 -05:00
Jacob Levine
ae9d7fa8b4 bugfix 5 2019-03-18 18:35:59 -05:00
Jacob Levine
705d347dd1 bugfix 4 2019-03-18 18:28:47 -05:00
Jacob Levine
555ee494af bugfix 3 2019-03-18 18:27:46 -05:00
Jacob Levine
c436123a65 bugfixes 2 2019-03-18 18:06:11 -05:00
Jacob Levine
b3c0ec7f7d Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-03-18 17:55:56 -05:00
Jacob Levine
289ef939e6 bugfix 1 2019-03-18 17:54:34 -05:00
jlevine18
df7420dc0e Merge pull request #1 from titanscout2022/signUps
Sign ups demo
2019-03-18 17:21:40 -05:00
Jacob Levine
859f18eaeb multiform demo mk 1 2019-03-18 17:13:45 -05:00
Jacob Levine
c32b5c097c continue with multi-form 2019-03-17 23:27:46 -05:00
Jacob Levine
fe72107622 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-03-16 15:49:49 -05:00
Jacob Levine
8545a06691 changed to signups. not complete yet 2019-03-16 15:47:56 -05:00
ltcptgeneral
7f312dcba9 Update titanlearn.py 2019-03-16 13:12:59 -05:00
ltcptgeneral
0ae47b072b 1234567890 2019-03-10 11:42:43 -05:00
ltcptgeneral
306f40a0f5 12345678 2019-03-09 16:27:36 -06:00
Jacob Levine
d59720ae33 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-03-09 14:08:38 -06:00
Jacob Levine
07f9f8b2fc added frc elo notebook 2019-03-09 14:05:47 -06:00
jlevine18
a059fc6fa8 Delete pullmatches.py 2019-03-08 22:19:11 -06:00
Jacob Levine
e273ecfc2c added scoreboard 2019-03-08 22:05:35 -06:00
Jacob Levine
c9b37ebd89 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-03-08 21:56:15 -06:00
Jacob Levine
06315e0917 added day 1 processing 2019-03-08 21:55:52 -06:00
ltcptgeneral
d6e4ddc6cb Update superscript.py 2019-03-08 19:00:02 -06:00
ltcptgeneral
81c52a392a superscript v 1.0.5.003
changelog:
- hotfix: actually pushes data correctly now
2019-03-08 17:43:38 -06:00
Jacob Levine
2b7ae4cb3c fix defaults 2019-03-08 12:54:41 -06:00
Jacob Levine
c3a895f6bc reworked questions to comply with Ian's app 2019-03-08 12:48:10 -06:00
Jacob Levine
6aa99a6e53 fix typo 2019-03-08 10:54:14 -06:00
Jacob Levine
ef05727739 added strat options 2019-03-08 10:47:49 -06:00
Jacob Levine
9fe1486c6c sets timeout for reload 2019-03-07 23:37:54 -06:00
Jacob Levine
d702500284 final fix for the night! 2019-03-07 23:33:58 -06:00
Jacob Levine
6f190e5f5b bugfix 2019-03-07 23:30:33 -06:00
Jacob Levine
926150d823 fix typo 2019-03-07 23:29:16 -06:00
Jacob Levine
39890abd71 added full functionality to scout 2019-03-07 23:26:30 -06:00
Jacob Levine
f7f23ba1c0 stylinh 2019-03-07 21:25:32 -06:00
Jacob Levine
8d596fb4eb one of these times im going to actually catch it 2019-03-07 21:22:04 -06:00
Jacob Levine
9d44721ee8 fix typo 2019-03-07 21:21:12 -06:00
Jacob Levine
27c1c1628d fix typo 2019-03-07 21:20:07 -06:00
Jacob Levine
f69886c04c fix typo 2019-03-07 21:18:13 -06:00
Jacob Levine
5a164792e4 sections 2019-03-07 21:16:54 -06:00
Jacob Levine
6e78673657 bugfix 2019-03-07 20:55:49 -06:00
Jacob Levine
d5083864eb start scout 2019-03-07 20:54:55 -06:00
Jacob Levine
d6faab89ba final fixes (hopefully this time) 2019-03-07 20:21:05 -06:00
Jacob Levine
5d9b28f004 fix typo 2019-03-07 20:19:58 -06:00
Jacob Levine
1c689addf0 final page fix 2019-03-07 20:18:54 -06:00
Jacob Levine
d620c36f5b fix typo 2019-03-07 20:17:10 -06:00
Jacob Levine
85c6d037af fix mistake 2019-03-07 20:16:14 -06:00
Jacob Levine
8f54b71d46 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-03-07 20:14:05 -06:00
Jacob Levine
2a2830ee62 now you can leave teams 2019-03-07 20:13:32 -06:00
jlevine18
0b0d62fd1f arthur don't be stupid 2019-03-07 20:03:20 -06:00
Jacob Levine
d766d9a7f1 final profile fix 2019-03-07 19:57:20 -06:00
Jacob Levine
2de1429ea3 fix structure 2019-03-07 19:55:30 -06:00
Jacob Levine
1bbabc0502 fix data structure 2019-03-07 19:48:50 -06:00
Jacob Levine
7040d92c6c test bugfix 2019-03-07 19:47:35 -06:00
Jacob Levine
b27bf18229 testing... 2019-03-07 19:46:01 -06:00
Jacob Levine
776254b3e0 test bugfix 2019-03-07 19:43:50 -06:00
Jacob Levine
c1e2ab1909 fix typo 2019-03-07 19:38:05 -06:00
Jacob Levine
5761aeb8fb test bugfix 2019-03-07 19:37:06 -06:00
Jacob Levine
d8a4805e79 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-03-07 19:32:14 -06:00
Jacob Levine
488b1807a9 fixed teamlogic 2019-03-07 19:31:34 -06:00
ltcptgeneral
8b1837d194 hotfix 2000 2019-03-07 09:14:20 -06:00
ltcptgeneral
f836b59d2e 12 2019-03-06 20:05:50 -06:00
ltcptgeneral
79bb1f27f9 Update superscript.py 2019-03-05 13:36:47 -06:00
ltcptgeneral
98a2519f42 lotta bug fixes 2019-03-04 16:38:40 -06:00
ltcptgeneral
035712c1ea 1 2019-03-03 22:50:29 -06:00
ltcptgeneral
515b92b356 Update analysis.py 2019-03-02 20:18:51 -06:00
ltcptgeneral
93587bf4c7 titanscouting app v 1.0.0.003
simple bug fix
2019-03-02 19:58:00 -06:00
ltcptgeneral
027937876d titanscouting app v 1.0.0.002 2019-03-02 19:47:31 -06:00
ltcptgeneral
a917ed6b37 ryiop 2019-03-02 16:34:48 -06:00
ltcptgeneral
8fecc5b582 Create README.md 2019-03-02 16:34:12 -06:00
jlevine18
d3b8329164 tl.py 2019-03-02 08:18:28 -06:00
ltcptgeneral
a2763d0e07 Merge branch 'master' of https://github.com/ltcptgeneral/tr2022-strategy 2019-03-01 13:49:36 -06:00
ltcptgeneral
852521e09a Update titanlearn.py 2019-03-01 13:49:33 -06:00
jlevine18
145e48fc89 Update titanlearn.py 2019-03-01 12:25:41 -06:00
ltcptgeneral
5889978f1d dumb 2019-03-01 12:18:38 -06:00
ltcptgeneral
605183f3fe Update superscript.py 2019-02-28 13:39:35 -06:00
ltcptgeneral
206ebd1b0c sfasf 2019-02-28 13:28:29 -06:00
ltcptgeneral
b9e89c8c91 bassbsabjasb 2019-02-28 13:13:52 -06:00
ltcptgeneral
c79fb5adb6 Update superscript.py 2019-02-28 09:04:37 -06:00
ltcptgeneral
243bbb48b1 Update superscript.py 2019-02-27 14:01:25 -06:00
ltcptgeneral
0e634ee5e0 superscript.py - v 1.0.5.002
changelog:
- more information given
- performance improvements
2019-02-27 14:00:29 -06:00
ltcptgeneral
109fa745f1 superscript.py - v 1.0.5.001
changelog:
- grammar
2019-02-27 13:43:33 -06:00
ltcptgeneral
61832e9015 superscript.py - v 1.0.5.000
changelog:
- service now iterates forever
- ready for production other than pulling json data
2019-02-27 13:38:24 -06:00
ltcptgeneral
57eda3815b superscript.py - v 1.0.4.001
changelog:
- grammar fixes
2019-02-26 23:18:26 -06:00
ltcptgeneral
a8f3598bbe superscript.py - v 1.0.4.000
changelog:
- actually pushes to firebase
2019-02-26 19:39:56 -06:00
ltcptgeneral
8d92716ef2 Update .gitignore 2019-02-26 19:10:53 -06:00
ltcptgeneral
4a7761947c security patch 2019-02-22 12:23:49 -06:00
ltcptgeneral
d14fa4fa67 Update bdata.csv 2019-02-21 12:33:13 -06:00
ltcptgeneral
6c665b10df superscript.py - v 1.
changelog:
- processes data more efficiently
2019-02-20 22:59:17 -06:00
ltcptgeneral
f40ff03cb2 superscript.py - v 1.0.3.000
changelog:
- actually processes data
2019-02-20 11:44:11 -06:00
ltcptgeneral
7fbc838e84 qwertyuiop 2019-02-19 13:21:06 -06:00
ltcptgeneral
ec24635368 Merge branch 'master' of https://github.com/ltcptgeneral/tr2022-strategy 2019-02-19 09:44:55 -06:00
ltcptgeneral
1e76b650ea superscript.py - v 1.0.2.000
changelog:
- added data reading from folder
- nearly crashed computer reading from 20 GiB of data
2019-02-19 09:44:51 -06:00
Jacob Levine
c7aef4143a fix more typos 2019-02-12 21:00:43 -06:00
Jacob Levine
086c48e251 fix typos 2019-02-12 21:00:00 -06:00
Jacob Levine
8e648a9c0d fix typos 2019-02-12 20:55:56 -06:00
Jacob Levine
f5d2d84006 squash bugh 2019-02-12 20:52:03 -06:00
Jacob Levine
f320c44e83 fix more typos 2019-02-12 20:49:23 -06:00
Jacob Levine
13dc898263 can i set the world record for most typos 2019-02-12 20:48:35 -06:00
Jacob Levine
0bb1a81223 fix even more typos 2019-02-12 20:46:23 -06:00
Jacob Levine
7fcd5eeee5 fix more typos 2019-02-12 20:44:21 -06:00
Jacob Levine
1b2b589421 fix typos 2019-02-12 20:42:49 -06:00
Jacob Levine
503a438686 I apparently don't know how to js 2019-02-12 20:41:43 -06:00
Jacob Levine
0b6e6fa26f fix more typos 2019-02-12 20:37:50 -06:00
Jacob Levine
82c677cf9b fix typos 2019-02-12 20:34:05 -06:00
Jacob Levine
134341a9ac started teams page 2019-02-12 20:20:30 -06:00
Jacob Levine
0249962ac2 last style fixed before i do something else, for real this time 2019-02-09 15:53:39 -06:00
Jacob Levine
f672ef24ba last style fixed before i do something else, for real this time 2019-02-09 15:50:34 -06:00
Jacob Levine
8af18a74bf last style fixed before i do something eks 2019-02-09 15:49:21 -06:00
Jacob Levine
a7442ebfc2 js dom terms aren't very consistent 2019-02-09 15:44:46 -06:00
Jacob Levine
a95afc45da fix style inconsistencies 2019-02-09 15:42:16 -06:00
Jacob Levine
1ada22a55a other style 2019-02-09 15:36:59 -06:00
Jacob Levine
399f75fbbe other style 2019-02-09 15:30:27 -06:00
Jacob Levine
622d03f10c margins aren't for tables 2019-02-09 15:29:21 -06:00
Jacob Levine
8f236b3c62 other style updates 2019-02-09 15:27:17 -06:00
Jacob Levine
c3a7b28a0c no but this ugly html hack should 2019-02-09 15:25:25 -06:00
Jacob Levine
78866b4650 does making everything auto fix it? 2019-02-09 15:19:14 -06:00
Jacob Levine
bac82bd34a maybe we can fix it in js 2019-02-09 15:12:17 -06:00
Jacob Levine
58ab791e4d maybe we can fix it in js 2019-02-09 15:10:24 -06:00
Jacob Levine
34bc246210 overflow-x 2019-02-09 14:57:55 -06:00
Jacob Levine
f48a9da72e time to actually start making this look legit 2019-02-09 14:54:03 -06:00
Jacob Levine
18719aa67c what was i thinking? 2019-02-09 14:46:59 -06:00
Jacob Levine
91b3e05078 even more styling, if you can call it that 2019-02-09 14:43:14 -06:00
Jacob Levine
b70e6d5ee1 more styling, if you can call it that 2019-02-09 14:41:31 -06:00
Jacob Levine
0b0d555275 styling, if you can call it that 2019-02-09 14:39:32 -06:00
Jacob Levine
31011f03ab you can now actually see the profile update page 2019-02-09 14:34:01 -06:00
Jacob Levine
d8f781dd2c typo fix 2019-02-09 14:32:52 -06:00
Jacob Levine
c80ad392d0 revamped profile page 2019-02-09 14:30:58 -06:00
Jacob Levine
f023734b42 even more bugfix 2019-02-09 14:01:32 -06:00
Jacob Levine
976d74ec4e more bugfix 2019-02-09 14:00:50 -06:00
Jacob Levine
528d5ac370 bugfix 2019-02-09 13:59:23 -06:00
Jacob Levine
69e77e9de4 revamped sign-in, now that we have working checks 2019-02-09 13:57:48 -06:00
Jacob Levine
181ba1b9e4 ok this should fix 2019-02-09 13:33:14 -06:00
Jacob Levine
09e0ab0eef even more of a last-ditch effort to make js not multithread everything 2019-02-09 13:32:06 -06:00
Jacob Levine
010587cf7a even more of a last-ditch effort to make js not multithread everything 2019-02-09 13:04:12 -06:00
Jacob Levine
08aef62baf last-ditch effort to make js not multithread everything 2019-02-09 13:01:14 -06:00
Jacob Levine
0025040e92 ok this should fix 2019-02-09 12:46:20 -06:00
Jacob Levine
ff398184b8 ok this should fix 2019-02-09 12:41:52 -06:00
Jacob Levine
d7f57c0747 rephrased check script. are you happy now, JS? 2019-02-09 12:31:25 -06:00
Jacob Levine
efb4d7c39e i apparently can't type 2019-02-09 12:17:47 -06:00
Jacob Levine
71fa707aaa adding standalone profile page 2019-02-09 12:14:55 -06:00
Jacob Levine
00c59ee8ec adding timeout 2019-02-09 11:43:47 -06:00
Jacob Levine
d1f99c6c91 apperently window loads too fast for firebase 2019-02-09 11:38:57 -06:00
Jacob Levine
dad6246cc0 squashing bugs 2019-02-09 11:33:24 -06:00
Jacob Levine
ac3733df9c Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-02-09 11:29:03 -06:00
Jacob Levine
2ad2ce8f78 testing signout logic 2019-02-09 11:27:46 -06:00
ltcptgeneral
778ef47e25 fixed copy paste oppsie 2019-02-08 15:42:33 -06:00
Jacob Levine
b04e3326fd styling fixes 2019-02-06 18:20:31 -06:00
Jacob Levine
870e256159 onload scripts 2019-02-06 18:19:18 -06:00
Jacob Levine
1f6a063bf7 bugfixes 2019-02-06 18:12:39 -06:00
Jacob Levine
8ca9c69160 styling fixes 2019-02-06 18:09:47 -06:00
Jacob Levine
8484a307c4 Merge branch 'master' of https://github.com/titanscout2022/tr2022-strategy 2019-02-06 17:52:37 -06:00
Jacob Levine
c7372d1e3d added 3 other pages 2019-02-06 17:51:58 -06:00
ltcptgeneral
6a7f2e4a59 android app v 1.0.0.001 2019-02-06 17:43:38 -06:00
ltcptgeneral
193279293a android app v 1.0.0.000
finished android app
published source code
2019-02-06 17:06:25 -06:00
Jacob Levine
77bed98239 revert some changes 2019-02-06 16:50:39 -06:00
Jacob Levine
4d9793fb7a more styling 2019-02-06 16:45:56 -06:00
Jacob Levine
9c8ede4412 styling 2019-02-06 16:42:15 -06:00
Jacob Levine
f4c32d13f4 added sidebar 2019-02-06 16:21:41 -06:00
Jacob Levine
8a832b65a2 sizing 2019-02-06 16:17:07 -06:00
Jacob Levine
379c16259e bugfix 2019-02-06 16:14:39 -06:00
Jacob Levine
c3d3c9ede7 added sidebar 2019-02-06 16:08:28 -06:00
Jacob Levine
75e3c7dfa1 bugfix 2019-02-06 15:55:22 -06:00
jlevine18
f35da94c74 more bugfix 2019-02-06 15:37:27 -06:00
Jacob Levine
05bab7e878 added info change functionality 2019-02-06 15:35:51 -06:00
Jacob Levine
edaa7ef2ea bugfix 2019-02-06 15:25:15 -06:00
Jacob Levine
2c0adf1edb reworked fix profile info 2019-02-06 15:22:09 -06:00
Jacob Levine
5349e71b8c testing bugs 2019-02-06 15:04:31 -06:00
Jacob Levine
762c94c23f bugfix 2019-02-06 14:56:17 -06:00
Jacob Levine
7583661801 bugfix 2019-02-06 14:51:31 -06:00
Jacob Levine
a986aa7612 added info change functionality 2019-02-06 14:46:41 -06:00
Jacob Levine
4f869c1c0e layout changes 2019-02-06 14:15:59 -06:00
Jacob Levine
68d380247d new fixes 2019-02-06 13:57:29 -06:00
Jacob Levine
7d8dd20aad added profile change functionality 2019-02-06 13:24:56 -06:00
ltcptgeneral
dd649db243 analysis.py v 1.0.8.005, superscript.py v 1.0.1.000
changelog analysis.py:
- minor fixes
changelog superscript.py:
- added data reading from file
- added superstructure to code
2019-02-05 09:50:10 -06:00
ltcptgeneral
9016bf296a created superscript.py, tbarequest.py v 1.0.1.000, edited repack_json.py
changelog tbarequest.py:
- fixed a simple error
2019-02-05 09:42:00 -06:00
ltcptgeneral
3762ad8d1e Update .gitignore 2019-02-05 09:02:04 -06:00
ltcptgeneral
9b7e5ad503 oof^2 2019-02-04 12:33:25 -06:00
ltcptgeneral
e8b232f611 Delete temp.txt 2019-02-04 10:50:43 -06:00
ltcptgeneral
dd188aadf5 oof 2019-02-04 10:50:07 -06:00
ltcptgeneral
3979194e5b removed app bc jacob did fancy shit 2019-01-26 10:45:19 -06:00
ltcptgeneral
1c83acce7b Update workspace.xml 2019-01-26 10:40:35 -06:00
ltcptgeneral
1fb7cdcf63 initialized app project 2019-01-26 10:32:00 -06:00
ltcptgeneral
53f0229d7d analysis.py - v 1.0.8.004
changelog
- removed a few unused dependencies
2019-01-26 10:11:54 -06:00
ltcptgeneral
e1ed9656ca yeeted histo_analysis_old() due to depreciation 2019-01-23 09:09:14 -06:00
ltcptgeneral
2b9e7976c5 yeeted useless comments 2019-01-22 22:42:37 -06:00
jlevine18
50c858175f ApiKey now changed and hidden-don't be stupid jake 2019-01-06 13:41:15 -06:00
Jacob Levine
92c713b075 folder move fix 2019-01-06 13:18:01 -06:00
Jacob Levine
0a9f515fae push all website files 2019-01-06 13:14:45 -06:00
jlevine18
476d8c19cf Add files via upload 2019-01-06 13:02:35 -06:00
jlevine18
eaf864bfc2 Rename website/functions/acorn to website/functions/node_modules/.bin/acorn 2019-01-06 12:57:46 -06:00
jlevine18
47636195e2 Add files via upload 2019-01-06 12:56:49 -06:00
jlevine18
f331f9a8ff Add files via upload 2019-01-06 12:55:50 -06:00
jlevine18
f4d024e219 Create index.js 2019-01-06 12:55:31 -06:00
jlevine18
c74ad83c9a Delete style.css 2019-01-06 12:54:41 -06:00
jlevine18
244ff9bd8f Delete scripts.js 2019-01-06 12:54:35 -06:00
jlevine18
4c3fe3c18c Delete index.html 2019-01-06 12:54:29 -06:00
jlevine18
0bdffe0ce7 upload website 2019-01-06 12:54:08 -06:00
ltcptgeneral
49ebf012c6 Update analysis.docs 2018-12-30 16:49:44 -06:00
ltcptgeneral
34820387c4 analysis.py - v 1.0.8.003
changelog:
- added p_value function
2018-12-29 16:28:41 -06:00
ltcptgeneral
cdcd8131aa stuff 2018-12-26 17:08:04 -06:00
ltcptgeneral
1868eedbe6 pineapple 2018-12-26 12:37:49 -06:00
ltcptgeneral
8c08e57de0 orange 2018-12-26 12:22:31 -06:00
ltcptgeneral
4a83859310 bannana 2018-12-26 12:22:17 -06:00
ltcptgeneral
f409a6712a apple 2018-12-26 12:21:44 -06:00
bearacuda13
3931f2dda1 Add files via upload 2018-12-26 12:18:40 -06:00
bearacuda13
87c03751c2 Add files via upload 2018-12-26 12:14:05 -06:00
ltcptgeneral
d80d4c9bf2 temp 2018-12-26 12:06:42 -06:00
ltcptgeneral
f4c916b425 analysis.py - v 1.0.8.002
changelog:
- updated __all__ correctly to contain changes made in v 1.0.8.000 and v 1.0.8.001
2018-12-24 16:44:03 -06:00
jlevine18
509816c55d fix other stupid mistakes 2018-12-24 14:50:04 -06:00
jlevine18
70a27817cd fix syntax error 2018-12-24 14:42:54 -06:00
jlevine18
bfeca6b037 started ML module 2018-12-24 09:32:25 -06:00
jlevine18
0757584d7b visualizer.py is now visualization.py 2018-12-21 11:10:18 -06:00
jlevine18
c88d0533fb Update tbarequest.py 2018-12-21 11:07:21 -06:00
jlevine18
cf897c7a8f added TBA requests module 2018-12-21 11:04:46 -06:00
jlevine18
ad8e3cc4e5 Update visualization.py 2018-12-20 22:01:28 -06:00
jlevine18
18fdd6e7c2 started visualization module 2018-12-20 21:45:05 -06:00
ltcptgeneral
02af480f9e analysis.py - v 1.0.8.001
changelog:
- refactors
- bugfixes
2018-12-20 20:49:09 -06:00
ltcptgeneral
cb3b01863d refactor analysis.py 2018-12-20 15:05:43 -06:00
ltcptgeneral
97a6e7c630 Update data.csv 2018-12-20 12:21:26 -06:00
ltcptgeneral
a6f4e24390 analysis.py - v 1.0.8.000
changelog:
- depreciated histo_analysis_old
- depreciated debug
- altered basic_analysis to take array data instead of filepath
- refactor
- optimization
2018-12-20 12:21:22 -06:00
ltcptgeneral
9c9fc386e8 no change 2018-12-13 08:57:19 -06:00
ltcptgeneral
1ba7b4de16 Update analysis.cpython-37.pyc 2018-12-07 16:56:09 -06:00
ltcptgeneral
9dffa23033 added visualizer.py, reorganized folders 2018-12-05 11:31:38 -06:00
ltcptgeneral
a792dc8973 Update analysis.cpython-37.pyc 2018-12-04 19:05:13 -06:00
ltcptgeneral
53a97f344f Update analysis_docs.txt 2018-12-01 22:34:30 -06:00
ltcptgeneral
d724d9a48e Update analysis_docs.txt 2018-12-01 22:13:19 -06:00
ltcptgeneral
5f56301c2f created docs 2018-12-01 21:02:53 -06:00
ltcptgeneral
ca2f7d0d0b a 2018-12-01 14:51:50 -06:00
ltcptgeneral
52150f42e4 Update analysis.cpython-37.pyc 2018-12-01 14:51:38 -06:00
ltcptgeneral
bb934ecb1e analysis.py - v 1.0.7.002
changelog:
	- bug fixes
2018-11-29 12:58:53 -06:00
ltcptgeneral
6802b7aeea analysis.py - v 1.0.7.001
changelog:
	- bug fixes
2018-11-29 12:36:25 -06:00
ltcptgeneral
cffad6514e update analysis.py 2018-11-29 09:33:18 -06:00
ltcptgeneral
3fbd7e3f90 Update analysis.py
a quick update
2018-11-29 09:32:27 -06:00
ltcptgeneral
d394f5df69 Update requirements.txt 2018-11-29 09:31:55 -06:00
ltcptgeneral
b25983f97c updated stuff 2018-11-29 09:27:08 -06:00
ltcptgeneral
f94bf31247 Create analysis.cpython-37.pyc 2018-11-29 09:04:17 -06:00
ltcptgeneral
61b6c6efdd removes stuff 2018-11-29 09:00:47 -06:00
ltcptgeneral
a9bab60595 removed generate_data.py 2018-11-29 08:53:41 -06:00
ltcptgeneral
23f932ecf3 analysis.py - v 1.0.7.000
changelog:
        - added tanh_regression (logistical regression)
	- bug fixes
2018-11-28 16:35:47 -06:00
ltcptgeneral
4c87c425f8 analysis.py - v 1.0.6.005
changelog:
        - added z_normalize function to normalize dataset
	- bug fixes
2018-11-28 14:29:32 -06:00
ltcptgeneral
a8b21f9f0f Update analysis.cpython-37.pyc 2018-11-28 11:35:21 -06:00
ltcptgeneral
5d6410a25a Merge branch 'master' of https://github.com/ltcptgeneral/tr2022-strategy 2018-11-28 11:12:53 -06:00
jlevine18
388222e879 started website 2018-11-28 11:10:38 -06:00
jlevine18
278db6a1fd Create index.html 2018-11-28 11:06:04 -06:00
56 changed files with 5110 additions and 1084 deletions

6
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,6 @@
FROM python:slim
WORKDIR /
RUN apt-get -y update; apt-get -y upgrade
RUN apt-get -y install git
COPY requirements.txt .
RUN pip install -r requirements.txt

View File

@@ -0,0 +1,22 @@
{
"name": "TRA Analysis Development Environment",
"build": {
"dockerfile": "Dockerfile",
},
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"python.pythonPath": "",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.linting.pylintPath": "",
"python.testing.pytestPath": "",
"editor.tabSize": 4,
"editor.insertSpaces": false
},
"extensions": [
"mhutchie.git-graph",
"ms-python.python",
"waderyan.gitblame"
],
"postCreateCommand": ""
}

View File

@@ -0,0 +1,8 @@
numpy
scipy
scikit-learn
six
pyparsing
pylint
pytest

4
.gitattributes vendored
View File

@@ -1,2 +1,4 @@
# Auto detect text files and perform LF normalization
* text=auto
* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

7
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,7 @@
Fixes #
## Proposed Changes
-
-
-

40
.github/workflows/publish-analysis.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
# This workflows will upload a Python Package using Twine when a release is created
# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
name: Upload Analysis Package
on:
release:
types: [published, edited]
jobs:
deploy:
runs-on: ubuntu-latest
env:
working-directory: ./analysis-master/
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dependencies
working-directory: ${{env.working-directory}}
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Install package deps
working-directory: ${{env.working-directory}}
run: |
pip install -r requirements.txt
- name: Build package
working-directory: ${{env.working-directory}}
run: |
python setup.py sdist bdist_wheel
- name: Publish package to PyPI
uses: pypa/gh-action-pypi-publish@master
with:
user: __token__
password: ${{ secrets.PYPI_TOKEN }}
packages_dir: analysis-master/dist/

38
.github/workflows/ut-analysis.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Analysis Unit Tests
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
unittest:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.7", "3.8", "3.9", "3.10"]
env:
working-directory: ./analysis-master/
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
working-directory: ${{ env.working-directory }}
- name: Test with pytest
run: |
pytest
working-directory: ${{ env.working-directory }}

9
.gitignore vendored
View File

@@ -1,2 +1,9 @@
/.vscode/
benchmark_data.csv
**/__pycache__/
**/.pytest_cache/
**/*.pyc
**/build/
**/*.egg-info/
**/dist/

66
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,66 @@
# Contributing Guidelines
This project accept contributions via GitHub pull requests.
This document outlines some of the
conventions on development workflow, commit message formatting, contact points,
and other resources to make it easier to get your contribution accepted.
## Certificate of Origin
By contributing to this project, you agree to the [Developer Certificate of
Origin (DCO)](https://developercertificate.org/). This document was created by the Linux Kernel community and is a
simple statement that you, as a contributor, have the legal right to make the
contribution.
In order to show your agreement with the DCO you should include at the end of the commit message,
the following line: `Signed-off-by: John Doe <john.doe@example.com>`, using your real name.
This can be done easily using the [`-s`](https://github.com/git/git/blob/b2c150d3aa82f6583b9aadfecc5f8fa1c74aca09/Documentation/git-commit.txt#L154-L161) flag on the `git commit`.
Visual Studio code also has a flag to enable signoff on commits
If you find yourself pushed a few commits without `Signed-off-by`, you can still add it afterwards. Read this for help: [fix-DCO.md](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md).
## Support Channels
The official support channel, for both users and contributors, is:
- GitHub issues: each repository has its own list of issues.
*Before opening a new issue or submitting a new pull request, it's helpful to
search the project - it's likely that another user has already reported the
issue you're facing, or it's a known issue that we're already aware of.
## How to Contribute
In general, please use conventional approaches to development and contribution such as:
* Create branches for additions or deletions, and or side projects
* Do not commit to master!
* Use Pull Requests (PRs) to indicate that an addition is ready to merge.
PRs are the main and exclusive way to contribute code to source{d} projects.
In order for a PR to be accepted it needs to pass this list of requirements:
- The contribution must be correctly explained with natural language and providing a minimum working example that reproduces it.
- All PRs must be written idiomaticly:
- for Node: formatted according to [AirBnB standards](https://github.com/airbnb/javascript), and no warnings from `eslint` using the AirBnB style guide
- for other languages, similar constraints apply.
- They should in general include tests, and those shall pass.
- In any case, all the PRs have to pass the personal evaluation of at least one of the [maintainers](MAINTAINERS) of the project.
### Format of the commit message
Every commit message should describe what was changed, under which context and, if applicable, the issue it relates to (mentioning a GitHub issue number when applicable):
For small changes, or changes to a testing or personal branch, the commit message should be a short changelog entry
For larger changes or for changes on branches that are more widely used, the commit message should simply reference an entry to some other changelog system. It is encouraged to use some sort of versioning system to log changes. Example commit messages:
```
superscript.py v 2.0.5.006
```
The format can be described more formally as follows:
```
<package> v <version number>
```

29
LICENSE Normal file
View File

@@ -0,0 +1,29 @@
BSD 3-Clause License
Copyright (c) 2020, Titan Scouting
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

3
MAINTAINERS Normal file
View File

@@ -0,0 +1,3 @@
Arthur Lu <learthurgo@gmail.com>
Jacob Levine <jacoblevine18@gmail.com>
Dev Singh <dev@devksingh.com>

70
README.md Normal file
View File

@@ -0,0 +1,70 @@
# Red Alliance Analysis &middot; ![GitHub release (latest by date)](https://img.shields.io/github/v/release/titanscout2022/red-alliance-analysis)
Titan Robotics 2022 Strategy Team Repository for Data Analysis Tools. Included with these tools are the backend data analysis engine formatted as a python package, associated binaries for the analysis package, and premade scripts that can be pulled directly from this repository and will integrate with other Red Alliance applications to quickly deploy FRC scouting tools.
---
# `tra-analysis`
`tra-analysis` is a higher level package for data processing and analysis. It is a python library that combines popular data science tools like numpy, scipy, and sklearn along with other tools to create an easy-to-use data analysis engine. tra-analysis includes analysis in all ranges of complexity from basic statistics like mean, median, mode to complex kernel based classifiers and allows user to more quickly deploy these algorithms. The package also includes performance metrics for score based applications including elo, glicko2, and trueskill ranking systems.
At the core of the tra-analysis package is the modularity of each analytical tool. The package encapsulates the setup code for the included data science tools. For example, there are many packages that allow users to generate many different types of regressions. With the tra-analysis package, one function can be called to generate many regressions and sort them by accuracy.
## Prerequisites
---
* Python >= 3.6
* Pip which can be installed by running\
`curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py`\
`python get-pip.py`\
after installing python, or with a package manager on linux. Refer to the [pip installation instructions](https://pip.pypa.io/en/stable/installing/) for more information.
## Installing
---
#### Standard Platforms
For the latest version of tra-analysis, run `pip install tra-analysis` or `pip install tra_analysis`. The requirements for tra-analysis should be automatically installed.
#### Exotic Platforms (Android)
[Termux](https://termux.com/) is recommended for a linux environemnt on Android. Consult the [documentation](https://titanscouting.github.io/analysis/general/installation#exotic-platforms-android) for advice on installing the prerequisites. After installing the prerequisites, the package should be installed normally with `pip install tra-analysis` or `pip install tra_analysis`.
## Use
---
tra-analysis operates like any other python package. Consult the [documentation](https://titanscouting.github.io/analysis/tra_analysis/) for more information.
## Supported Platforms
---
Although any modern 64 bit platform should be supported, the following platforms have been tested to be working:
* AMD64 (Tested on Zen, Zen+, and Zen 2)
* Intel 64/x86_64/x64 (Tested on Kaby Lake, Ice Lake)
* ARM64 (Tested on Broadcom BCM2836 SoC, Broadcom BCM2711 SoC)
The following OSes have been tested to be working:
* Linux Kernel 3.16, 4.4, 4.15, 4.19, 5.4
* Ubuntu 16.04, 18.04, 20.04
* Debian (and Debian derivaives) Jessie, Buster
* Windows 7, 10
The following python versions are supported:
* python 3.6 (not tested)
* python 3.7
* python 3.8
---
# `data-analysis`
Data analysis has been separated into its own [repository](https://github.com/titanscouting/tra-data-analysis).
# Contributing
Read our included contributing guidelines (`CONTRIBUTING.md`) for more information and feel free to reach out to any current maintainer for more information.
# Build Statuses
![Analysis Unit Tests](https://github.com/titanscout2022/red-alliance-analysis/workflows/Analysis%20Unit%20Tests/badge.svg)

6
SECURITY.md Normal file
View File

@@ -0,0 +1,6 @@
# Security Policy
## Reporting a Vulnerability
Please email `titanscout2022@gmail.com` to report a vulnerability.

1
analysis-master/build.sh Normal file
View File

@@ -0,0 +1 @@
python setup.py sdist bdist_wheel || python3 setup.py sdist bdist_wheel

View File

@@ -0,0 +1,8 @@
numpy
scipy
scikit-learn
six
pyparsing
pylint
pytest

28
analysis-master/setup.py Normal file
View File

@@ -0,0 +1,28 @@
import setuptools
import tra_analysis
requirements = []
with open("requirements.txt", 'r') as file:
for line in file:
requirements.append(line)
setuptools.setup(
name="tra_analysis",
version=tra_analysis.__version__,
author="The Titan Scouting Team",
author_email="titanscout2022@gmail.com",
description="Analysis package developed by Titan Scouting for The Red Alliance",
long_description="../README.md",
long_description_content_type="text/markdown",
url="https://github.com/titanscout2022/tr2022-strategy",
packages=setuptools.find_packages(),
install_requires=requirements,
license = "BSD 3-Clause License",
classifiers=[
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
keywords="data analysis tools"
)

View File

@@ -0,0 +1,253 @@
import numpy as np
import sklearn
from sklearn import metrics
from tra_analysis import Analysis as an
from tra_analysis import Array
from tra_analysis import ClassificationMetric
from tra_analysis import Clustering
from tra_analysis import CorrelationTest
from tra_analysis import Fit
from tra_analysis import KNN
from tra_analysis import metrics as m
from tra_analysis import NaiveBayes
from tra_analysis import RandomForest
from tra_analysis import RegressionMetric
from tra_analysis import Sort
from tra_analysis import StatisticalTest
from tra_analysis import SVM
from tra_analysis.equation.parser import BNF
test_data_linear = [1, 3, 6, 7, 9]
test_data_linear2 = [2, 2, 5, 7, 13]
test_data_linear3 = [2, 5, 8, 6, 14]
test_data_array = Array(test_data_linear)
x_data_circular = []
y_data_circular = []
y_data_ccu = [1, 3, 7, 14, 21]
y_data_ccd = [8.66, 8.5, 7, 5, 1]
test_data_scrambled = [-32, 34, 19, 72, -65, -11, -43, 6, 85, -17, -98, -26, 12, 20, 9, -92, -40, 98, -78, 17, -20, 49, 93, -27, -24, -66, 40, 84, 1, -64, -68, -25, -42, -46, -76, 43, -3, 30, -14, -34, -55, -13, 41, -30, 0, -61, 48, 23, 60, 87, 80, 77, 53, 73, 79, 24, -52, 82, 8, -44, 65, 47, -77, 94, 7, 37, -79, 36, -94, 91, 59, 10, 97, -38, -67, 83, 54, 31, -95, -63, 16, -45, 21, -12, 66, -48, -18, -96, -90, -21, -83, -74, 39, 64, 69, -97, 13, 55, 27, -39]
test_data_sorted = [-98, -97, -96, -95, -94, -92, -90, -83, -79, -78, -77, -76, -74, -68, -67, -66, -65, -64, -63, -61, -55, -52, -48, -46, -45, -44, -43, -42, -40, -39, -38, -34, -32, -30, -27, -26, -25, -24, -21, -20, -18, -17, -14, -13, -12, -11, -3, 0, 1, 6, 7, 8, 9, 10, 12, 13, 16, 17, 19, 20, 21, 23, 24, 27, 30, 31, 34, 36, 37, 39, 40, 41, 43, 47, 48, 49, 53, 54, 55, 59, 60, 64, 65, 66, 69, 72, 73, 77, 79, 80, 82, 83, 84, 85, 87, 91, 93, 94, 97, 98]
test_data_2D_pairs = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
test_data_2D_positive = np.array([[23, 51], [21, 32], [15, 25], [17, 31]])
test_output = np.array([1, 3, 4, 5])
test_labels_2D_pairs = np.array([1, 1, 2, 2])
validation_data_2D_pairs = np.array([[-0.8, -1], [0.8, 1.2]])
validation_labels_2D_pairs = np.array([1, 2])
def test_basicstats():
assert an.basic_stats(test_data_linear) == {"mean": 5.2, "median": 6.0, "standard-deviation": 2.85657137141714, "variance": 8.16, "minimum": 1.0, "maximum": 9.0}
assert an.z_score(3.2, 6, 1.5) == -1.8666666666666665
assert an.z_normalize([test_data_linear], 1).tolist() == [[0.07537783614444091, 0.22613350843332272, 0.45226701686664544, 0.5276448530110863, 0.6784005252999682]]
def test_regression():
assert all(isinstance(item, str) for item in an.regression(test_data_linear, y_data_ccu, ["lin"])) == True
assert all(isinstance(item, str) for item in an.regression(test_data_linear, y_data_ccd, ["log"])) == True
assert all(isinstance(item, str) for item in an.regression(test_data_linear, y_data_ccu, ["exp"])) == True
assert all(isinstance(item, str) for item in an.regression(test_data_linear, y_data_ccu, ["ply"])) == True
assert all(isinstance(item, str) for item in an.regression(test_data_linear, y_data_ccd, ["sig"])) == True
def test_metrics():
assert an.Metric().elo(1500, 1500, [1, 0], 400, 24) == 1512.0
assert an.Metric().glicko2(1500, 250, 0.06, [1500, 1400], [250, 240], [1, 0]) == (1478.864307445517, 195.99122679202452, 0.05999602937563585)
e = [[(21.346, 7.875), (20.415, 7.808), (29.037, 7.170)], [(28.654, 7.875), (28.654, 7.875), (23.225, 6.287)]]
r = an.Metric().trueskill([[(25, 8.33), (24, 8.25), (32, 7.5)], [(25, 8.33), (25, 8.33), (21, 6.5)]], [1, 0])
i = 0
for group in r:
j = 0
for team in group:
assert abs(team.mu - e[i][j][0]) < 0.001
assert abs(team.sigma - e[i][j][1]) < 0.001
j+=1
i+=1
def test_array():
assert test_data_array.elementwise_mean() == 5.2
assert test_data_array.elementwise_median() == 6.0
assert test_data_array.elementwise_stdev() == 2.85657137141714
assert test_data_array.elementwise_variance() == 8.16
assert test_data_array.elementwise_npmin() == 1
assert test_data_array.elementwise_npmax() == 9
assert test_data_array.elementwise_stats() == (5.2, 6.0, 2.85657137141714, 8.16, 1, 9)
for i in range(len(test_data_array)):
assert test_data_array[i] == test_data_linear[i]
test_data_array[0] = 100
expected = [100, 3, 6, 7, 9]
for i in range(len(test_data_array)):
assert test_data_array[i] == expected[i]
def test_classifmetric():
classif_metric = ClassificationMetric(test_data_linear2, test_data_linear)
assert classif_metric[0].all() == metrics.confusion_matrix(test_data_linear, test_data_linear2).all()
assert classif_metric[1] == metrics.classification_report(test_data_linear, test_data_linear2)
def test_correlationtest():
assert all(np.isclose(list(CorrelationTest.anova_oneway(test_data_linear, test_data_linear2).values()), [0.05825242718446602, 0.8153507906592907], rtol=1e-10))
assert all(np.isclose(list(CorrelationTest.pearson(test_data_linear, test_data_linear2).values()), [0.9153061540753287, 0.02920895440940868], rtol=1e-10))
assert all(np.isclose(list(CorrelationTest.spearman(test_data_linear, test_data_linear2).values()), [0.9746794344808964, 0.004818230468198537], rtol=1e-10))
assert all(np.isclose(list(CorrelationTest.point_biserial(test_data_linear, test_data_linear2).values()), [0.9153061540753287, 0.02920895440940868], rtol=1e-10))
assert all(np.isclose(list(CorrelationTest.kendall(test_data_linear, test_data_linear2).values()), [0.9486832980505137, 0.022977401503206086], rtol=1e-10))
assert all(np.isclose(list(CorrelationTest.kendall_weighted(test_data_linear, test_data_linear2).values()), [0.9750538072369643, np.nan], rtol=1e-10, equal_nan=True))
def test_fit():
assert Fit.CircleFit(x=[0,0,-1,1], y=[1, -1, 0, 0]).LSC() == (0.0, 0.0, 1.0, 0.0)
def test_knn():
model, metric = KNN.knn_classifier(test_data_2D_pairs, test_labels_2D_pairs, 2)
assert isinstance(model, sklearn.neighbors.KNeighborsClassifier)
assert np.array([[0,0], [2,0]]).all() == metric[0].all()
assert ' precision recall f1-score support\n\n 1 0.00 0.00 0.00 0.0\n 2 0.00 0.00 0.00 2.0\n\n accuracy 0.00 2.0\n macro avg 0.00 0.00 0.00 2.0\nweighted avg 0.00 0.00 0.00 2.0\n' == metric[1]
model, metric = KNN.knn_regressor(test_data_2D_pairs, test_output, 2)
assert isinstance(model, sklearn.neighbors.KNeighborsRegressor)
assert (-25.0, 6.5, 2.5495097567963922) == metric
def test_naivebayes():
model, metric = NaiveBayes.gaussian(test_data_2D_pairs, test_labels_2D_pairs)
assert isinstance(model, sklearn.naive_bayes.GaussianNB)
assert metric[0].all() == np.array([[0, 0], [2, 0]]).all()
model, metric = NaiveBayes.multinomial(test_data_2D_positive, test_labels_2D_pairs)
assert isinstance(model, sklearn.naive_bayes.MultinomialNB)
assert metric[0].all() == np.array([[0, 0], [2, 0]]).all()
model, metric = NaiveBayes.bernoulli(test_data_2D_pairs, test_labels_2D_pairs)
assert isinstance(model, sklearn.naive_bayes.BernoulliNB)
assert metric[0].all() == np.array([[0, 0], [2, 0]]).all()
model, metric = NaiveBayes.complement(test_data_2D_positive, test_labels_2D_pairs)
assert isinstance(model, sklearn.naive_bayes.ComplementNB)
assert metric[0].all() == np.array([[0, 0], [2, 0]]).all()
def test_randomforest():
model, metric = RandomForest.random_forest_classifier(test_data_2D_pairs, test_labels_2D_pairs, 0.3, 2)
assert isinstance(model, sklearn.ensemble.RandomForestClassifier)
assert metric[0].all() == np.array([[0, 0], [2, 0]]).all()
model, metric = RandomForest.random_forest_regressor(test_data_2D_pairs, test_labels_2D_pairs, 0.3, 2)
assert isinstance(model, sklearn.ensemble.RandomForestRegressor)
assert metric == (0.0, 1.0, 1.0)
def test_regressionmetric():
assert RegressionMetric(test_data_linear, test_data_linear2)== (0.7705314009661837, 3.8, 1.9493588689617927)
def test_sort():
sorts = [Sort.quicksort, Sort.mergesort, Sort.heapsort, Sort.introsort, Sort.insertionsort, Sort.timsort, Sort.selectionsort, Sort.shellsort, Sort.bubblesort, Sort.cyclesort, Sort.cocktailsort]
for sort in sorts:
assert all(a == b for a, b in zip(sort(test_data_scrambled), test_data_sorted))
def test_statisticaltest():
assert StatisticalTest.tukey_multicomparison([test_data_linear, test_data_linear2, test_data_linear3]) == \
{'group 1 and group 2': [0.32571517201527916, False], 'group 1 and group 3': [0.977145516045838, False], 'group 2 and group 3': [0.6514303440305589, False]}
def test_svm():
data = test_data_2D_pairs
labels = test_labels_2D_pairs
test_data = validation_data_2D_pairs
test_labels = validation_labels_2D_pairs
lin_kernel = SVM.PrebuiltKernel.Linear()
#ply_kernel = SVM.PrebuiltKernel.Polynomial(3, 0)
rbf_kernel = SVM.PrebuiltKernel.RBF('scale')
sig_kernel = SVM.PrebuiltKernel.Sigmoid(0)
lin_kernel = SVM.fit(lin_kernel, data, labels)
#ply_kernel = SVM.fit(ply_kernel, data, labels)
rbf_kernel = SVM.fit(rbf_kernel, data, labels)
sig_kernel = SVM.fit(sig_kernel, data, labels)
for i in range(len(test_data)):
assert lin_kernel.predict([test_data[i]]).tolist() == [test_labels[i]]
#for i in range(len(test_data)):
# assert ply_kernel.predict([test_data[i]]).tolist() == [test_labels[i]]
for i in range(len(test_data)):
assert rbf_kernel.predict([test_data[i]]).tolist() == [test_labels[i]]
for i in range(len(test_data)):
assert sig_kernel.predict([test_data[i]]).tolist() == [test_labels[i]]
def test_equation():
parser = BNF()
correctParse = {
"9": 9.0,
"-9": -9.0,
"--9": 9.0,
"-E": -2.718281828459045,
"9 + 3 + 6": 18.0,
"9 + 3 / 11": 9.272727272727273,
"(9 + 3)": 12.0,
"(9+3) / 11": 1.0909090909090908,
"9 - 12 - 6": -9.0,
"9 - (12 - 6)": 3.0,
"2*3.14159": 6.28318,
"3.1415926535*3.1415926535 / 10": 0.9869604400525172,
"PI * PI / 10": 0.9869604401089358,
"PI*PI/10": 0.9869604401089358,
"PI^2": 9.869604401089358,
"round(PI^2)": 10,
"6.02E23 * 8.048": 4.844896e+24,
"e / 3": 0.9060939428196817,
"sin(PI/2)": 1.0,
"10+sin(PI/4)^2": 10.5,
"trunc(E)": 2,
"trunc(-E)": -2,
"round(E)": 3,
"round(-E)": -3,
"E^PI": 23.140692632779263,
"exp(0)": 1.0,
"exp(1)": 2.718281828459045,
"2^3^2": 512.0,
"(2^3)^2": 64.0,
"2^3+2": 10.0,
"2^3+5": 13.0,
"2^9": 512.0,
"sgn(-2)": -1,
"sgn(0)": 0,
"sgn(0.1)": 1,
"sgn(cos(PI/4))": 1,
"sgn(cos(PI/2))": 0,
"sgn(cos(PI*3/4))": -1,
"+(sgn(cos(PI/4)))": 1,
"-(sgn(cos(PI/4)))": -1,
}
for key in list(correctParse.keys()):
assert parser.eval(key) == correctParse[key]
def test_clustering():
normalizer = sklearn.preprocessing.Normalizer()
data = X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])
assert Clustering.dbscan(data, eps=3, min_samples=2).tolist() == [0, 0, 0, 1, 1, -1]
assert Clustering.dbscan(data, normalizer=normalizer, eps=3, min_samples=2).tolist() == [0, 0, 0, 0, 0, 0]
data = np.array([[1, 1], [2, 1], [1, 0], [4, 7], [3, 5], [3, 6]])
assert Clustering.spectral(data, n_clusters=2, assign_labels='discretize', random_state=0).tolist() == [1, 1, 1, 0, 0, 0]
assert Clustering.spectral(data, normalizer=normalizer, n_clusters=2, assign_labels='discretize', random_state=0).tolist() == [0, 1, 1, 0, 0, 0]

View File

@@ -0,0 +1,704 @@
# Titan Robotics Team 2022: Analysis Module
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import Analysis'
# this should be included in the local directory or environment variable
# this module has been optimized for multhreaded computing
# current benchmark of optimization: 1.33 times faster
# setup:
__version__ = "3.0.6"
# changelog should be viewed using print(analysis.__changelog__)
__changelog__ = """changelog:
3.0.6:
- added docstrings
3.0.5:
- removed extra submodule imports
- fixed/optimized header
3.0.4:
- removed -_obj imports
3.0.3:
- fixed spelling of deprecate
3.0.2:
- fixed __all__
3.0.1:
- removed numba dependency and calls
3.0.0:
- exported several submodules to their own files while preserving backwards compatibility:
- Array
- ClassificationMetric
- CorrelationTest
- KNN
- NaiveBayes
- RandomForest
- RegressionMetric
- Sort
- StatisticalTest
- SVM
- note: above listed submodules will not be supported in the future
- future changes to all submodules will be held in their respective changelogs
- future changes altering the parent package will be held in the __changelog__ of the parent package (in __init__.py)
- changed reference to module name to Analysis
2.3.1:
- fixed bugs in Array class
2.3.0:
- overhauled Array class
2.2.3:
- fixed spelling of RandomForest
- made n_neighbors required for KNN
- made n_classifiers required for SVM
2.2.2:
- fixed 2.2.1 changelog entry
- changed regression to return dictionary
2.2.1:
- changed all references to parent package analysis to tra_analysis
2.2.0:
- added Sort class
- added several array sorting functions to Sort class including:
- quick sort
- merge sort
- intro(spective) sort
- heap sort
- insertion sort
- tim sort
- selection sort
- bubble sort
- cycle sort
- cocktail sort
- tested all sorting algorithms with both lists and numpy arrays
- deprecated sort function from Array class
- added warnings as an import
2.1.4:
- added sort and search functions to Array class
2.1.3:
- changed output of basic_stats and histo_analysis to libraries
- fixed __all__
2.1.2:
- renamed ArrayTest class to Array
2.1.1:
- added add, mul, neg, and inv functions to ArrayTest class
- added normalize function to ArrayTest class
- added dot and cross functions to ArrayTest class
2.1.0:
- added ArrayTest class
- added elementwise mean, median, standard deviation, variance, min, max functions to ArrayTest class
- added elementwise_stats to ArrayTest which encapsulates elementwise statistics
- appended to __all__ to reflect changes
2.0.6:
- renamed func functions in regression to lin, log, exp, and sig
2.0.5:
- moved random_forrest_regressor and random_forrest_classifier to RandomForrest class
- renamed Metrics to Metric
- renamed RegressionMetrics to RegressionMetric
- renamed ClassificationMetrics to ClassificationMetric
- renamed CorrelationTests to CorrelationTest
- renamed StatisticalTests to StatisticalTest
- reflected rafactoring to all mentions of above classes/functions
2.0.4:
- fixed __all__ to reflected the correct functions and classes
- fixed CorrelationTests and StatisticalTests class functions to require self invocation
- added missing math import
- fixed KNN class functions to require self invocation
- fixed Metrics class functions to require self invocation
- various spelling fixes in CorrelationTests and StatisticalTests
2.0.3:
- bug fixes with CorrelationTests and StatisticalTests
- moved glicko2 and trueskill to the metrics subpackage
- moved elo to a new metrics subpackage
2.0.2:
- fixed docs
2.0.1:
- fixed docs
2.0.0:
- cleaned up wild card imports with scipy and sklearn
- added CorrelationTests class
- added StatisticalTests class
- added several correlation tests to CorrelationTests
- added several statistical tests to StatisticalTests
1.13.9:
- moved elo, glicko2, trueskill functions under class Metrics
1.13.8:
- moved Glicko2 to a seperate package
1.13.7:
- fixed bug with trueskill
1.13.6:
- cleaned up imports
1.13.5:
- cleaned up package
1.13.4:
- small fixes to regression to improve performance
1.13.3:
- filtered nans from regression
1.13.2:
- removed torch requirement, and moved Regression back to regression.py
1.13.1:
- bug fix with linear regression not returning a proper value
- cleaned up regression
- fixed bug with polynomial regressions
1.13.0:
- fixed all regressions to now properly work
1.12.6:
- fixed bg with a division by zero in histo_analysis
1.12.5:
- fixed numba issues by removing numba from elo, glicko2 and trueskill
1.12.4:
- renamed gliko to glicko
1.12.3:
- removed deprecated code
1.12.2:
- removed team first time trueskill instantiation in favor of integration in superscript.py
1.12.1:
- improved readibility of regression outputs by stripping tensor data
- used map with lambda to acheive the improved readibility
- lost numba jit support with regression, and generated_jit hangs at execution
- TODO: reimplement correct numba integration in regression
1.12.0:
- temporarily fixed polynomial regressions by using sklearn's PolynomialFeatures
1.11.010:
- alphabeticaly ordered import lists
1.11.9:
- bug fixes
1.11.8:
- bug fixes
1.11.7:
- bug fixes
1.11.6:
- tested min and max
- bug fixes
1.11.5:
- added min and max in basic_stats
1.11.4:
- bug fixes
1.11.3:
- bug fixes
1.11.2:
- consolidated metrics
- fixed __all__
1.11.1:
- added test/train split to RandomForestClassifier and RandomForestRegressor
1.11.0:
- added RandomForestClassifier and RandomForestRegressor
- note: untested
1.10.0:
- added numba.jit to remaining functions
1.9.2:
- kernelized PCA and KNN
1.9.1:
- fixed bugs with SVM and NaiveBayes
1.9.0:
- added SVM class, subclasses, and functions
- note: untested
1.8.0:
- added NaiveBayes classification engine
- note: untested
1.7.0:
- added knn()
- added confusion matrix to decisiontree()
1.6.2:
- changed layout of __changelog to be vscode friendly
1.6.1:
- added additional hyperparameters to decisiontree()
1.6.0:
- fixed __version__
- fixed __all__ order
- added decisiontree()
1.5.3:
- added pca
1.5.2:
- reduced import list
- added kmeans clustering engine
1.5.1:
- simplified regression by using .to(device)
1.5.0:
- added polynomial regression to regression(); untested
1.4.0:
- added trueskill()
1.3.2:
- renamed regression class to Regression, regression_engine() to regression gliko2_engine class to Gliko2
1.3.1:
- changed glicko2() to return tuple instead of array
1.3.0:
- added glicko2_engine class and glicko()
- verified glicko2() accuracy
1.2.3:
- fixed elo()
1.2.2:
- added elo()
- elo() has bugs to be fixed
1.2.1:
- readded regrression import
1.2.0:
- integrated regression.py as regression class
- removed regression import
- fixed metadata for regression class
- fixed metadata for analysis class
1.1.1:
- regression_engine() bug fixes, now actaully regresses
1.1.0:
- added regression_engine()
- added all regressions except polynomial
1.0.7:
- updated _init_device()
1.0.6:
- removed useless try statements
1.0.5:
- removed impossible outcomes
1.0.4:
- added performance metrics (r^2, mse, rms)
1.0.3:
- resolved nopython mode for mean, median, stdev, variance
1.0.2:
- snapped (removed) majority of uneeded imports
- forced object mode (bad) on all jit
- TODO: stop numba complaining about not being able to compile in nopython mode
1.0.1:
- removed from sklearn import * to resolve uneeded wildcard imports
1.0.0:
- removed c_entities,nc_entities,obstacles,objectives from __all__
- applied numba.jit to all functions
- deprecated and removed stdev_z_split
- cleaned up histo_analysis to include numpy and numba.jit optimizations
- deprecated and removed all regression functions in favor of future pytorch optimizer
- deprecated and removed all nonessential functions (basic_analysis, benchmark, strip_data)
- optimized z_normalize using sklearn.preprocessing.normalize
- TODO: implement kernel/function based pytorch regression optimizer
0.9.0:
- refactored
- numpyed everything
- removed stats in favor of numpy functions
0.8.5:
- minor fixes
0.8.4:
- removed a few unused dependencies
0.8.3:
- added p_value function
0.8.2:
- updated __all__ correctly to contain changes made in v 0.8.0 and v 0.8.1
0.8.1:
- refactors
- bugfixes
0.8.0:
- deprecated histo_analysis_old
- deprecated debug
- altered basic_analysis to take array data instead of filepath
- refactor
- optimization
0.7.2:
- bug fixes
0.7.1:
- bug fixes
0.7.0:
- added tanh_regression (logistical regression)
- bug fixes
0.6.5:
- added z_normalize function to normalize dataset
- bug fixes
0.6.4:
- bug fixes
0.6.3:
- bug fixes
0.6.2:
- bug fixes
0.6.1:
- corrected __all__ to contain all of the functions
0.6.0:
- added calc_overfit, which calculates two measures of overfit, error and performance
- added calculating overfit to optimize_regression
0.5.0:
- added optimize_regression function, which is a sample function to find the optimal regressions
- optimize_regression function filters out some overfit funtions (functions with r^2 = 1)
- planned addition: overfit detection in the optimize_regression function
0.4.2:
- added __changelog__
- updated debug function with log and exponential regressions
0.4.1:
- added log regressions
- added exponential regressions
- added log_regression and exp_regression to __all__
0.3.8:
- added debug function to further consolidate functions
0.3.7:
- added builtin benchmark function
- added builtin random (linear) data generation function
- added device initialization (_init_device)
0.3.6:
- reorganized the imports list to be in alphabetical order
- added search and regurgitate functions to c_entities, nc_entities, obstacles, objectives
0.3.5:
- major bug fixes
- updated historical analysis
- deprecated old historical analysis
0.3.4:
- added __version__, __author__, __all__
- added polynomial regression
- added root mean squared function
- added r squared function
0.3.3:
- bug fixes
- added c_entities
0.3.2:
- bug fixes
- added nc_entities, obstacles, objectives
- consolidated statistics.py to analysis.py
0.3.1:
- compiled 1d, column, and row basic stats into basic stats function
0.3.0:
- added historical analysis function
0.2.x:
- added z score test
0.1.x:
- major bug fixes
0.0.x:
- added loading csv
- added 1d, column, row basic stats
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
'load_csv',
'basic_stats',
'z_score',
'z_normalize',
'histo_analysis',
'regression',
'Metric',
'pca',
'decisiontree',
# all statistics functions left out due to integration in other functions
]
# now back to your regularly scheduled programming:
# imports (now in alphabetical order! v 0.3.006):
import csv
from tra_analysis.metrics import elo as Elo
from tra_analysis.metrics import glicko2 as Glicko2
import numpy as np
import scipy
import sklearn, sklearn.cluster, sklearn.pipeline
from tra_analysis.metrics import trueskill as Trueskill
# import submodules
from .ClassificationMetric import ClassificationMetric
class error(ValueError):
pass
def load_csv(filepath):
"""
Loads csv file into 2D numpy array. Does not check csv file validity.
parameters:
filepath: String path to the csv file
return:
2D numpy array of values stored in csv file
"""
with open(filepath, newline='') as csvfile:
file_array = np.array(list(csv.reader(csvfile)))
csvfile.close()
return file_array
def basic_stats(data):
"""
Calculates mean, median, standard deviation, variance, minimum, maximum of a simple set of elements.
parameters:
data: List representing set of unordered elements
return:
Dictionary with (mean, median, standard-deviation, variance, minimum, maximum) as keys and corresponding values
"""
data_t = np.array(data).astype(float)
_mean = mean(data_t)
_median = median(data_t)
_stdev = stdev(data_t)
_variance = variance(data_t)
_min = npmin(data_t)
_max = npmax(data_t)
return {"mean": _mean, "median": _median, "standard-deviation": _stdev, "variance": _variance, "minimum": _min, "maximum": _max}
def z_score(point, mean, stdev):
"""
Calculates z score of a specific point given mean and standard deviation of data.
parameters:
point: Real value corresponding to a single point of data
mean: Real value corresponding to the mean of the dataset
stdev: Real value corresponding to the standard deviation of the dataset
return:
Real value that is the point's z score
"""
score = (point - mean) / stdev
return score
def z_normalize(array, *args):
"""
Applies sklearn.normalize(array, axis = args) on any arraylike parseable by numpy.
parameters:
array: array like structure of reals aka nested indexables
*args: arguments relating to axis normalized against
return:
numpy array of normalized values from ArrayLike input
"""
array = np.array(array)
for arg in args:
array = sklearn.preprocessing.normalize(array, axis = arg)
return array
def histo_analysis(hist_data):
"""
Calculates the mean and standard deviation of derivatives of (x,y) points. Requires at least 2 points to compute.
parameters:
hist_data: list of real coordinate point data (x, y)
return:
Dictionary with (mean, deviation) as keys to corresponding values
"""
if len(hist_data[0]) > 2:
hist_data = np.array(hist_data)
derivative = np.array(len(hist_data) - 1, dtype = float)
t = np.diff(hist_data)
derivative = t[1] / t[0]
np.sort(derivative)
return {"mean": basic_stats(derivative)["mean"], "deviation": basic_stats(derivative)["standard-deviation"]}
else:
return None
def regression(inputs, outputs, args): # inputs, outputs expects N-D array
"""
Applies specified regression kernels onto input, output data pairs.
parameters:
inputs: List of Reals representing independent variable values of each point
outputs: List of Reals representing dependent variable values of each point
args: List of Strings from values (lin, log, exp, ply, sig)
return:
Dictionary with keys (lin, log, exp, ply, sig) as keys to correspondiong regression models
"""
X = np.array(inputs)
y = np.array(outputs)
regressions = {}
if 'lin' in args: # formula: ax + b
try:
def lin(x, a, b):
return a * x + b
popt, pcov = scipy.optimize.curve_fit(lin, X, y)
coeffs = popt.flatten().tolist()
regressions["lin"] = (str(coeffs[0]) + "*x+" + str(coeffs[1]))
except Exception as e:
pass
if 'log' in args: # formula: a log (b(x + c)) + d
try:
def log(x, a, b, c, d):
return a * np.log(b*(x + c)) + d
popt, pcov = scipy.optimize.curve_fit(log, X, y)
coeffs = popt.flatten().tolist()
regressions["log"] = (str(coeffs[0]) + "*log(" + str(coeffs[1]) + "*(x+" + str(coeffs[2]) + "))+" + str(coeffs[3]))
except Exception as e:
pass
if 'exp' in args: # formula: a e ^ (b(x + c)) + d
try:
def exp(x, a, b, c, d):
return a * np.exp(b*(x + c)) + d
popt, pcov = scipy.optimize.curve_fit(exp, X, y)
coeffs = popt.flatten().tolist()
regressions["exp"] = (str(coeffs[0]) + "*e^(" + str(coeffs[1]) + "*(x+" + str(coeffs[2]) + "))+" + str(coeffs[3]))
except Exception as e:
pass
if 'ply' in args: # formula: a + bx^1 + cx^2 + dx^3 + ...
inputs = np.array([inputs])
outputs = np.array([outputs])
plys = {}
limit = len(outputs[0])
for i in range(2, limit):
model = sklearn.preprocessing.PolynomialFeatures(degree = i)
model = sklearn.pipeline.make_pipeline(model, sklearn.linear_model.LinearRegression())
model = model.fit(np.rot90(inputs), np.rot90(outputs))
params = model.steps[1][1].intercept_.tolist()
params = np.append(params, model.steps[1][1].coef_[0].tolist()[1::])
params = params.flatten().tolist()
temp = ""
counter = 0
for param in params:
temp += "(" + str(param) + "*x^" + str(counter) + ")"
counter += 1
plys["x^" + str(i)] = (temp)
regressions["ply"] = (plys)
if 'sig' in args: # formula: a tanh (b(x + c)) + d
try:
def sig(x, a, b, c, d):
return a * np.tanh(b*(x + c)) + d
popt, pcov = scipy.optimize.curve_fit(sig, X, y)
coeffs = popt.flatten().tolist()
regressions["sig"] = (str(coeffs[0]) + "*tanh(" + str(coeffs[1]) + "*(x+" + str(coeffs[2]) + "))+" + str(coeffs[3]))
except Exception as e:
pass
return regressions
class Metric:
"""
The metric class wraps the metrics models. Call without instantiation as Metric.<method>(...)
"""
def elo(self, starting_score, opposing_score, observed, N, K):
"""
Calculates an elo adjusted ELO score given a player's current score, opponent's score, and outcome of match.
reference: https://en.wikipedia.org/wiki/Elo_rating_system
parameters:
starting_score: Real value representing player's ELO score before a match
opposing_score: Real value representing opponent's score before the match
observed: Array of Real values representing multiple sequential match outcomes against the same opponent. 1 for match win, 0.5 for tie, 0 for loss.
N: Real value representing the normal or mean score expected (usually 1200)
K: R eal value representing a system constant, determines how quickly players will change scores (usually 24)
return:
Real value representing the player's new ELO score
"""
return Elo.calculate(starting_score, opposing_score, observed, N, K)
def glicko2(self, starting_score, starting_rd, starting_vol, opposing_score, opposing_rd, observations):
"""
Calculates an adjusted Glicko-2 score given a player's current score, multiple opponent's score, and outcome of several matches.
reference: http://www.glicko.net/glicko/glicko2.pdf
parameters:
starting_score: Real value representing the player's Glicko-2 score
starting_rd: Real value representing the player's RD
starting_vol: Real value representing the player's volatility
opposing_score: List of Real values representing multiple opponent's Glicko-2 scores
opposing_rd: List of Real values representing multiple opponent's RD
opposing_vol: List of Real values representing multiple opponent's volatility
observations: List of Real values representing the outcome of several matches, where each match's opponent corresponds with the opposing_score, opposing_rd, opposing_vol values of the same indesx. Outcomes can be a score, presuming greater score is better.
return:
Tuple of 3 Real values representing the player's new score, rd, and vol
"""
player = Glicko2.Glicko2(rating = starting_score, rd = starting_rd, vol = starting_vol)
player.update_player([x for x in opposing_score], [x for x in opposing_rd], observations)
return (player.rating, player.rd, player.vol)
def trueskill(self, teams_data, observations): # teams_data is array of array of tuples ie. [[(mu, sigma), (mu, sigma), (mu, sigma)], [(mu, sigma), (mu, sigma), (mu, sigma)]]
"""
Calculates the score changes for multiple teams playing in a single match accoding to the trueskill algorithm.
reference: https://trueskill.org/
parameters:
teams_data: List of List of Tuples of 2 Real values representing multiple player ratings. List of teams, which is a List of players. Each player rating is a Tuple of 2 Real values (mu, sigma).
observations: List of Real values representing the match outcome. Each value in the List is the score corresponding to the team at the same index in teams_data.
return:
List of List of Tuples of 2 Real values representing new player ratings. Same structure as teams_data.
"""
team_ratings = []
for team in teams_data:
team_temp = ()
for player in team:
player = Trueskill.Rating(player[0], player[1])
team_temp = team_temp + (player,)
team_ratings.append(team_temp)
return Trueskill.rate(team_ratings, ranks=observations)
def mean(data):
return np.mean(data)
def median(data):
return np.median(data)
def stdev(data):
return np.std(data)
def variance(data):
return np.var(data)
def npmin(data):
return np.amin(data)
def npmax(data):
return np.amax(data)
def pca(data, n_components = None, copy = True, whiten = False, svd_solver = "auto", tol = 0.0, iterated_power = "auto", random_state = None):
"""
Performs a principle component analysis on the input data.
reference: https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
parameters:
data: Arraylike of Reals representing the set of data to perform PCA on
* : refer to reference for usage, parameters follow same usage
return:
Arraylike of Reals representing the set of data that has had PCA performed. The dimensionality of the Arraylike may be smaller or equal.
"""
kernel = sklearn.decomposition.PCA(n_components = n_components, copy = copy, whiten = whiten, svd_solver = svd_solver, tol = tol, iterated_power = iterated_power, random_state = random_state)
return kernel.fit_transform(data)
def decisiontree(data, labels, test_size = 0.3, criterion = "gini", splitter = "default", max_depth = None): #expects *2d data and 1d labels
"""
Generates a decision tree classifier fitted to the given data.
reference: https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
parameters:
data: List of values representing each data point of multiple axes
labels: List of values represeing the labels corresponding to the same index at data
* : refer to reference for usage, parameters follow same usage
return:
DecisionTreeClassifier model and corresponding classification accuracy metrics
"""
data_train, data_test, labels_train, labels_test = sklearn.model_selection.train_test_split(data, labels, test_size=test_size, random_state=1)
model = sklearn.tree.DecisionTreeClassifier(criterion = criterion, splitter = splitter, max_depth = max_depth)
model = model.fit(data_train,labels_train)
predictions = model.predict(data_test)
metrics = ClassificationMetric(predictions, labels_test)
return model, metrics

View File

@@ -0,0 +1,166 @@
# Titan Robotics Team 2022: Array submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import Array'
# setup:
__version__ = "1.0.4"
__changelog__ = """changelog:
1.0.4:
- fixed spelling of deprecate
1.0.3:
- fixed __all__
1.0.2:
- fixed several implementation bugs with magic methods
1.0.1:
- removed search and __search functions
1.0.0:
- ported analysis.Array() here
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
"Array",
]
import numpy as np
import warnings
class Array(): # tests on nd arrays independent of basic_stats
def __init__(self, narray):
self.array = np.array(narray)
def __str__(self):
return str(self.array)
def __repr__(self):
return str(self.array)
def elementwise_mean(self, axis = 0): # expects arrays that are size normalized
return np.mean(self.array, axis = axis)
def elementwise_median(self, axis = 0):
return np.median(self.array, axis = axis)
def elementwise_stdev(self, axis = 0):
return np.std(self.array, axis = axis)
def elementwise_variance(self, axis = 0):
return np.var(self.array, axis = axis)
def elementwise_npmin(self, axis = 0):
return np.amin(self.array, axis = axis)
def elementwise_npmax(self, axis = 0):
return np.amax(self.array, axis = axis)
def elementwise_stats(self, axis = 0):
_mean = self.elementwise_mean(axis = axis)
_median = self.elementwise_median(axis = axis)
_stdev = self.elementwise_stdev(axis = axis)
_variance = self.elementwise_variance(axis = axis)
_min = self.elementwise_npmin(axis = axis)
_max = self.elementwise_npmax(axis = axis)
return _mean, _median, _stdev, _variance, _min, _max
def __getitem__(self, key):
return self.array[key]
def __setitem__(self, key, value):
self.array[key] = value
def __len__(self):
return len(self.array)
def normalize(self):
a = np.atleast_1d(np.linalg.norm(self.array))
a[a==0] = 1
return Array(self.array / np.expand_dims(a, -1))
def __add__(self, other):
return Array(self.array + other.array)
def __sub__(self, other):
return Array(self.array - other.array)
def __neg__(self):
return Array(-self.array)
def __abs__(self):
return Array(abs(self.array))
def __invert__(self):
return Array(1/self.array)
def __mul__(self, other):
if(isinstance(other, Array)):
return Array(self.array.dot(other.array))
elif(isinstance(other, int)):
return Array(other * self.array)
else:
raise Exception("unsupported multiplication between Array and " + str(type(other)))
def __rmul__(self, other):
return self.__mul__(other)
def cross(self, other):
return np.cross(self.array, other.array)
def transpose(self):
return Array(np.transpose(self.array))
def sort(self, array): # deprecated
warnings.warn("Array.sort has been deprecated in favor of Sort")
array_length = len(array)
if array_length <= 1:
return array
middle_index = int(array_length / 2)
left = array[0:middle_index]
right = array[middle_index:]
left = self.sort(left)
right = self.sort(right)
return self.__merge(left, right)
def __merge(self, left, right):
sorted_list = []
left = left[:]
right = right[:]
while len(left) > 0 or len(right) > 0:
if len(left) > 0 and len(right) > 0:
if left[0] <= right[0]:
sorted_list.append(left.pop(0))
else:
sorted_list.append(right.pop(0))
elif len(left) > 0:
sorted_list.append(left.pop(0))
elif len(right) > 0:
sorted_list.append(right.pop(0))
return sorted_list

View File

@@ -0,0 +1,40 @@
# Titan Robotics Team 2022: ClassificationMetric submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import ClassificationMetric'
# setup:
__version__ = "1.0.2"
__changelog__ = """changelog:
1.0.2:
- optimized imports
1.0.1:
- fixed __all__
1.0.0:
- ported analysis.ClassificationMetric() here
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
"ClassificationMetric",
]
import sklearn
class ClassificationMetric():
def __new__(cls, predictions, targets):
return cls.cm(cls, predictions, targets), cls.cr(cls, predictions, targets)
def cm(self, predictions, targets):
return sklearn.metrics.confusion_matrix(targets, predictions)
def cr(self, predictions, targets):
return sklearn.metrics.classification_report(targets, predictions)

View File

@@ -0,0 +1,63 @@
# Titan Robotics Team 2022: Clustering submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import Clustering'
# setup:
__version__ = "2.0.2"
# changelog should be viewed using print(analysis.__changelog__)
__changelog__ = """changelog:
2.0.2:
- generalized optional args to **kwargs
2.0.1:
- added normalization preprocessing to clustering, expects instance of sklearn.preprocessing.Normalizer()
2.0.0:
- added dbscan clustering algo
- added spectral clustering algo
1.0.0:
- created this submodule
- copied kmeans clustering from Analysis
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
"kmeans",
"dbscan",
"spectral",
]
import sklearn
def kmeans(data, normalizer = None, **kwargs):
if normalizer != None:
data = normalizer.transform(data)
kernel = sklearn.cluster.KMeans(**kwargs)
kernel.fit(data)
predictions = kernel.predict(data)
centers = kernel.cluster_centers_
return centers, predictions
def dbscan(data, normalizer=None, **kwargs):
if normalizer != None:
data = normalizer.transform(data)
model = sklearn.cluster.DBSCAN(**kwargs).fit(data)
return model.labels_
def spectral(data, normalizer=None, **kwargs):
if normalizer != None:
data = normalizer.transform(data)
model = sklearn.cluster.SpectralClustering(**kwargs).fit(data)
return model.labels_

View File

@@ -0,0 +1,70 @@
# Titan Robotics Team 2022: CorrelationTest submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import CorrelationTest'
# setup:
__version__ = "1.0.3"
__changelog__ = """changelog:
1.0.3:
- generalized optional args to **kwargs
1.0.2:
- optimized imports
1.0.1:
- fixed __all__
1.0.0:
- ported analysis.CorrelationTest() here
- removed classness
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
"anova_oneway",
"pearson",
"spearman",
"point_biserial",
"kendall",
"kendall_weighted",
"mgc",
]
import scipy
def anova_oneway(*args): #expects arrays of samples
results = scipy.stats.f_oneway(*args)
return {"f-value": results[0], "p-value": results[1]}
def pearson(x, y):
results = scipy.stats.pearsonr(x, y)
return {"r-value": results[0], "p-value": results[1]}
def spearman(a, b = None, **kwargs):
results = scipy.stats.spearmanr(a, b = b, **kwargs)
return {"r-value": results[0], "p-value": results[1]}
def point_biserial(x, y):
results = scipy.stats.pointbiserialr(x, y)
return {"r-value": results[0], "p-value": results[1]}
def kendall(x, y, **kwargs):
results = scipy.stats.kendalltau(x, y, **kwargs)
return {"tau": results[0], "p-value": results[1]}
def kendall_weighted(x, y, **kwargs):
results = scipy.stats.weightedtau(x, y, **kwargs)
return {"tau": results[0], "p-value": results[1]}
def mgc(x, y, **kwargs):
results = scipy.stats.multiscale_graphcorr(x, y, **kwargs)
return {"k-value": results[0], "p-value": results[1], "data": results[2]} # unsure if MGC test returns a k value

View File

@@ -0,0 +1,87 @@
# Titan Robotics Team 2022: CPU fitting models
# Written by Dev Singh
# Notes:
# this module is cuda-optimized (as appropriate) and vectorized (except for one small part)
# setup:
__version__ = "0.0.2"
# changelog should be viewed using print(analysis.fits.__changelog__)
__changelog__ = """changelog:
0.0.2:
- renamed module to Fit
0.0.1:
- initial release, add circle fitting with LSC
"""
__author__ = (
"Dev Singh <dev@devksingh.com>"
)
__all__ = [
'CircleFit'
]
import numpy as np
class CircleFit:
"""Class to fit data to a circle using the Least Square Circle (LSC) method"""
# For more information on the LSC method, see:
# http://www.dtcenter.org/sites/default/files/community-code/met/docs/write-ups/circle_fit.pdf
def __init__(self, x, y, xy=None):
self.ournp = np #todo: implement cupy correctly
if type(x) == list:
x = np.array(x)
if type(y) == list:
y = np.array(y)
if type(xy) == list:
xy = np.array(xy)
if xy != None:
self.coords = xy
else:
# following block combines x and y into one array if not already done
self.coords = self.ournp.vstack(([x.T], [y.T])).T
def calc_R(x, y, xc, yc):
"""Returns distance between center and point"""
return self.ournp.sqrt((x-xc)**2 + (y-yc)**2)
def f(c, x, y):
"""Returns distance between point and circle at c"""
Ri = calc_R(x, y, *c)
return Ri - Ri.mean()
def LSC(self):
"""Fits given data to a circle and returns the center, radius, and variance"""
x = self.coords[:, 0]
y = self.coords[:, 1]
# guessing at a center
x_m = self.ournp.mean(x)
y_m = self.ournp.mean(y)
# calculation of the reduced coordinates
u = x - x_m
v = y - y_m
# linear system defining the center (uc, vc) in reduced coordinates:
# Suu * uc + Suv * vc = (Suuu + Suvv)/2
# Suv * uc + Svv * vc = (Suuv + Svvv)/2
Suv = self.ournp.sum(u*v)
Suu = self.ournp.sum(u**2)
Svv = self.ournp.sum(v**2)
Suuv = self.ournp.sum(u**2 * v)
Suvv = self.ournp.sum(u * v**2)
Suuu = self.ournp.sum(u**3)
Svvv = self.ournp.sum(v**3)
# Solving the linear system
A = self.ournp.array([ [ Suu, Suv ], [Suv, Svv]])
B = self.ournp.array([ Suuu + Suvv, Svvv + Suuv ])/2.0
uc, vc = self.ournp.linalg.solve(A, B)
xc_1 = x_m + uc
yc_1 = y_m + vc
# Calculate the distances from center (xc_1, yc_1)
Ri_1 = self.ournp.sqrt((x-xc_1)**2 + (y-yc_1)**2)
R_1 = self.ournp.mean(Ri_1)
# calculate residual error
residu_1 = self.ournp.sum((Ri_1-R_1)**2)
return (xc_1, yc_1, R_1, residu_1)

View File

@@ -0,0 +1,48 @@
# Titan Robotics Team 2022: KNN submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import KNN'
# setup:
__version__ = "1.0.2"
__changelog__ = """changelog:
1.0.2:
- generalized optional args to **kwargs
1.0.1:
- optimized imports
1.0.0:
- ported analysis.KNN() here
- removed classness
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
"James Pan <zpan@imsa.edu>"
)
__all__ = [
'knn_classifier',
'knn_regressor'
]
import sklearn
from . import ClassificationMetric, RegressionMetric
def knn_classifier(data, labels, n_neighbors = 5, test_size = 0.3, **kwargs): #expects *2d data and 1d labels post-scaling
data_train, data_test, labels_train, labels_test = sklearn.model_selection.train_test_split(data, labels, test_size=test_size, random_state=1)
model = sklearn.neighbors.KNeighborsClassifier(n_neighbors = n_neighbors, **kwargs)
model.fit(data_train, labels_train)
predictions = model.predict(data_test)
return model, ClassificationMetric(predictions, labels_test)
def knn_regressor(data, outputs, n_neighbors = 5, test_size = 0.3, **kwargs):
data_train, data_test, outputs_train, outputs_test = sklearn.model_selection.train_test_split(data, outputs, test_size=test_size, random_state=1)
model = sklearn.neighbors.KNeighborsRegressor(n_neighbors = n_neighbors, **kwargs)
model.fit(data_train, outputs_train)
predictions = model.predict(data_test)
return model, RegressionMetric.RegressionMetric(predictions, outputs_test)

View File

@@ -0,0 +1,67 @@
# Titan Robotics Team 2022: NaiveBayes submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import NaiveBayes'
# setup:
__version__ = "1.0.2"
__changelog__ = """changelog:
1.0.2:
- generalized optional args to **kwargs
1.0.1:
- optimized imports
1.0.0:
- ported analysis.NaiveBayes() here
- removed classness
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
'gaussian',
'multinomial',
'bernoulli',
'complement',
]
import sklearn
from . import ClassificationMetric
def gaussian(data, labels, test_size = 0.3, **kwargs):
data_train, data_test, labels_train, labels_test = sklearn.model_selection.train_test_split(data, labels, test_size=test_size, random_state=1)
model = sklearn.naive_bayes.GaussianNB(**kwargs)
model.fit(data_train, labels_train)
predictions = model.predict(data_test)
return model, ClassificationMetric(predictions, labels_test)
def multinomial(data, labels, test_size = 0.3, **kwargs):
data_train, data_test, labels_train, labels_test = sklearn.model_selection.train_test_split(data, labels, test_size=test_size, random_state=1)
model = sklearn.naive_bayes.MultinomialNB(**kwargs)
model.fit(data_train, labels_train)
predictions = model.predict(data_test)
return model, ClassificationMetric(predictions, labels_test)
def bernoulli(data, labels, test_size = 0.3, **kwargs):
data_train, data_test, labels_train, labels_test = sklearn.model_selection.train_test_split(data, labels, test_size=test_size, random_state=1)
model = sklearn.naive_bayes.BernoulliNB(**kwargs)
model.fit(data_train, labels_train)
predictions = model.predict(data_test)
return model, ClassificationMetric(predictions, labels_test)
def complement(data, labels, test_size = 0.3, **kwargs):
data_train, data_test, labels_train, labels_test = sklearn.model_selection.train_test_split(data, labels, test_size=test_size, random_state=1)
model = sklearn.naive_bayes.ComplementNB(**kwargs)
model.fit(data_train, labels_train)
predictions = model.predict(data_test)
return model, ClassificationMetric(predictions, labels_test)

View File

@@ -0,0 +1,50 @@
# Titan Robotics Team 2022: RandomForest submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import RandomForest'
# setup:
__version__ = "1.0.3"
__changelog__ = """changelog:
1.0.3:
- updated RandomForestClassifier and RandomForestRegressor parameters to match sklearn v 1.0.2
- changed default values for kwargs to rely on sklearn
1.0.2:
- optimized imports
1.0.1:
- fixed __all__
1.0.0:
- ported analysis.RandomFores() here
- removed classness
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
"random_forest_classifier",
"random_forest_regressor",
]
import sklearn, sklearn.ensemble, sklearn.naive_bayes
from . import ClassificationMetric, RegressionMetric
def random_forest_classifier(data, labels, test_size, n_estimators, **kwargs):
data_train, data_test, labels_train, labels_test = sklearn.model_selection.train_test_split(data, labels, test_size=test_size, random_state=1)
kernel = sklearn.ensemble.RandomForestClassifier(n_estimators = n_estimators, **kwargs)
kernel.fit(data_train, labels_train)
predictions = kernel.predict(data_test)
return kernel, ClassificationMetric(predictions, labels_test)
def random_forest_regressor(data, outputs, test_size, n_estimators, **kwargs):
data_train, data_test, outputs_train, outputs_test = sklearn.model_selection.train_test_split(data, outputs, test_size=test_size, random_state=1)
kernel = sklearn.ensemble.RandomForestRegressor(n_estimators = n_estimators, **kwargs)
kernel.fit(data_train, outputs_train)
predictions = kernel.predict(data_test)
return kernel, RegressionMetric.RegressionMetric(predictions, outputs_test)

View File

@@ -0,0 +1,43 @@
# Titan Robotics Team 2022: RegressionMetric submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import RegressionMetric'
# setup:
__version__ = "1.0.1"
__changelog__ = """changelog:
1.0.1:
- optimized imports
1.0.0:
- ported analysis.RegressionMetric() here
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
'RegressionMetric'
]
import numpy as np
import sklearn
class RegressionMetric():
def __new__(cls, predictions, targets):
return cls.r_squared(cls, predictions, targets), cls.mse(cls, predictions, targets), cls.rms(cls, predictions, targets)
def r_squared(self, predictions, targets): # assumes equal size inputs
return sklearn.metrics.r2_score(targets, predictions)
def mse(self, predictions, targets):
return sklearn.metrics.mean_squared_error(targets, predictions)
def rms(self, predictions, targets):
return np.sqrt(sklearn.metrics.mean_squared_error(targets, predictions))

View File

@@ -0,0 +1,89 @@
# Titan Robotics Team 2022: SVM submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import SVM'
# setup:
__version__ = "1.0.3"
__changelog__ = """changelog:
1.0.3:
- optimized imports
1.0.2:
- fixed __all__
1.0.1:
- removed unessasary self calls
- removed classness
1.0.0:
- ported analysis.SVM() here
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = [
"CustomKernel",
"StandardKernel",
"PrebuiltKernel",
"fit",
"eval_classification",
"eval_regression",
]
import sklearn
from . import ClassificationMetric, RegressionMetric
class CustomKernel:
def __new__(cls, C, kernel, degre, gamma, coef0, shrinking, probability, tol, cache_size, class_weight, verbose, max_iter, decision_function_shape, random_state):
return sklearn.svm.SVC(C = C, kernel = kernel, gamma = gamma, coef0 = coef0, shrinking = shrinking, probability = probability, tol = tol, cache_size = cache_size, class_weight = class_weight, verbose = verbose, max_iter = max_iter, decision_function_shape = decision_function_shape, random_state = random_state)
class StandardKernel:
def __new__(cls, kernel, C=1.0, degree=3, gamma='auto_deprecated', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', random_state=None):
return sklearn.svm.SVC(C = C, kernel = kernel, gamma = gamma, coef0 = coef0, shrinking = shrinking, probability = probability, tol = tol, cache_size = cache_size, class_weight = class_weight, verbose = verbose, max_iter = max_iter, decision_function_shape = decision_function_shape, random_state = random_state)
class PrebuiltKernel:
class Linear:
def __new__(cls):
return sklearn.svm.SVC(kernel = 'linear')
class Polynomial:
def __new__(cls, power, r_bias):
return sklearn.svm.SVC(kernel = 'polynomial', degree = power, coef0 = r_bias)
class RBF:
def __new__(cls, gamma):
return sklearn.svm.SVC(kernel = 'rbf', gamma = gamma)
class Sigmoid:
def __new__(cls, r_bias):
return sklearn.svm.SVC(kernel = 'sigmoid', coef0 = r_bias)
def fit(kernel, train_data, train_outputs): # expects *2d data, 1d labels or outputs
return kernel.fit(train_data, train_outputs)
def eval_classification(kernel, test_data, test_outputs):
predictions = kernel.predict(test_data)
return ClassificationMetric(predictions, test_outputs)
def eval_regression(kernel, test_data, test_outputs):
predictions = kernel.predict(test_data)
return RegressionMetric(predictions, test_outputs)

View File

@@ -0,0 +1,424 @@
# Titan Robotics Team 2022: Sort submodule
# Written by Arthur Lu and James Pan
# Notes:
# this should be imported as a python module using 'from tra_analysis import Sort'
# setup:
__version__ = "1.0.1"
__changelog__ = """changelog:
1.0.1:
- fixed __all__
1.0.0:
- ported analysis.Sort() here
- removed classness
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
"James Pan <zpan@imsa.edu>",
)
__all__ = [
"quicksort",
"mergesort",
"introsort",
"heapsort",
"insertionsort",
"timsort",
"selectionsort",
"shellsort",
"bubblesort",
"cyclesort",
"cocktailsort",
]
import numpy as np
def quicksort(a):
def sort(array):
less = []
equal = []
greater = []
if len(array) > 1:
pivot = array[0]
for x in array:
if x < pivot:
less.append(x)
elif x == pivot:
equal.append(x)
elif x > pivot:
greater.append(x)
return sort(less)+equal+sort(greater)
else:
return array
return np.array(sort(a))
def mergesort(a):
def sort(array):
array = array
if len(array) >1:
middle = len(array) // 2
L = array[:middle]
R = array[middle:]
sort(L)
sort(R)
i = j = k = 0
while i < len(L) and j < len(R):
if L[i] < R[j]:
array[k] = L[i]
i+= 1
else:
array[k] = R[j]
j+= 1
k+= 1
while i < len(L):
array[k] = L[i]
i+= 1
k+= 1
while j < len(R):
array[k] = R[j]
j+= 1
k+= 1
return array
return sort(a)
def introsort(a):
def sort(array, start, end, maxdepth):
array = array
if end - start <= 1:
return
elif maxdepth == 0:
heapsort(array, start, end)
else:
p = partition(array, start, end)
sort(array, start, p + 1, maxdepth - 1)
sort(array, p + 1, end, maxdepth - 1)
return array
def partition(array, start, end):
pivot = array[start]
i = start - 1
j = end
while True:
i = i + 1
while array[i] < pivot:
i = i + 1
j = j - 1
while array[j] > pivot:
j = j - 1
if i >= j:
return j
swap(array, i, j)
def swap(array, i, j):
array[i], array[j] = array[j], array[i]
def heapsort(array, start, end):
build_max_heap(array, start, end)
for i in range(end - 1, start, -1):
swap(array, start, i)
max_heapify(array, index=0, start=start, end=i)
def build_max_heap(array, start, end):
def parent(i):
return (i - 1)//2
length = end - start
index = parent(length - 1)
while index >= 0:
max_heapify(array, index, start, end)
index = index - 1
def max_heapify(array, index, start, end):
def left(i):
return 2*i + 1
def right(i):
return 2*i + 2
size = end - start
l = left(index)
r = right(index)
if (l < size and array[start + l] > array[start + index]):
largest = l
else:
largest = index
if (r < size and array[start + r] > array[start + largest]):
largest = r
if largest != index:
swap(array, start + largest, start + index)
max_heapify(array, largest, start, end)
maxdepth = (len(a).bit_length() - 1)*2
return sort(a, 0, len(a), maxdepth)
def heapsort(a):
def sort(array):
array = array
n = len(array)
for i in range(n//2 - 1, -1, -1):
heapify(array, n, i)
for i in range(n-1, 0, -1):
array[i], array[0] = array[0], array[i]
heapify(array, i, 0)
return array
def heapify(array, n, i):
array = array
largest = i
l = 2 * i + 1
r = 2 * i + 2
if l < n and array[i] < array[l]:
largest = l
if r < n and array[largest] < array[r]:
largest = r
if largest != i:
array[i],array[largest] = array[largest],array[i]
heapify(array, n, largest)
return array
return sort(a)
def insertionsort(a):
def sort(array):
array = array
for i in range(1, len(array)):
key = array[i]
j = i-1
while j >=0 and key < array[j] :
array[j+1] = array[j]
j -= 1
array[j+1] = key
return array
return sort(a)
def timsort(a, block = 32):
BLOCK = block
def sort(array, n):
array = array
for i in range(0, n, BLOCK):
insertionsort(array, i, min((i+31), (n-1)))
size = BLOCK
while size < n:
for left in range(0, n, 2*size):
mid = left + size - 1
right = min((left + 2*size - 1), (n-1))
merge(array, left, mid, right)
size = 2*size
return array
def insertionsort(array, left, right):
array = array
for i in range(left + 1, right+1):
temp = array[i]
j = i - 1
while j >= left and array[j] > temp :
array[j+1] = array[j]
j -= 1
array[j+1] = temp
return array
def merge(array, l, m, r):
len1, len2 = m - l + 1, r - m
left, right = [], []
for i in range(0, len1):
left.append(array[l + i])
for i in range(0, len2):
right.append(array[m + 1 + i])
i, j, k = 0, 0, l
while i < len1 and j < len2:
if left[i] <= right[j]:
array[k] = left[i]
i += 1
else:
array[k] = right[j]
j += 1
k += 1
while i < len1:
array[k] = left[i]
k += 1
i += 1
while j < len2:
array[k] = right[j]
k += 1
j += 1
return sort(a, len(a))
def selectionsort(a):
array = a
for i in range(len(array)):
min_idx = i
for j in range(i+1, len(array)):
if array[min_idx] > array[j]:
min_idx = j
array[i], array[min_idx] = array[min_idx], array[i]
return array
def shellsort(a):
array = a
n = len(array)
gap = n//2
while gap > 0:
for i in range(gap,n):
temp = array[i]
j = i
while j >= gap and array[j-gap] >temp:
array[j] = array[j-gap]
j -= gap
array[j] = temp
gap //= 2
return array
def bubblesort(a):
def sort(array):
for i, num in enumerate(array):
try:
if array[i+1] < num:
array[i] = array[i+1]
array[i+1] = num
sort(array)
except IndexError:
pass
return array
return sort(a)
def cyclesort(a):
def sort(array):
array = array
writes = 0
for cycleStart in range(0, len(array) - 1):
item = array[cycleStart]
pos = cycleStart
for i in range(cycleStart + 1, len(array)):
if array[i] < item:
pos += 1
if pos == cycleStart:
continue
while item == array[pos]:
pos += 1
array[pos], item = item, array[pos]
writes += 1
while pos != cycleStart:
pos = cycleStart
for i in range(cycleStart + 1, len(array)):
if array[i] < item:
pos += 1
while item == array[pos]:
pos += 1
array[pos], item = item, array[pos]
writes += 1
return array
return sort(a)
def cocktailsort(a):
def sort(array):
array = array
n = len(array)
swapped = True
start = 0
end = n-1
while (swapped == True):
swapped = False
for i in range (start, end):
if (array[i] > array[i + 1]) :
array[i], array[i + 1]= array[i + 1], array[i]
swapped = True
if (swapped == False):
break
swapped = False
end = end-1
for i in range(end-1, start-1, -1):
if (array[i] > array[i + 1]):
array[i], array[i + 1] = array[i + 1], array[i]
swapped = True
start = start + 1
return array
return sort(a)

View File

@@ -0,0 +1,315 @@
# Titan Robotics Team 2022: StatisticalTest submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import StatisticalTest'
# setup:
__version__ = "1.0.3"
__changelog__ = """changelog:
1.0.3:
- optimized imports
1.0.2:
- added tukey_multicomparison
- fixed styling
1.0.1:
- fixed typo in __all__
1.0.0:
- ported analysis.StatisticalTest() here
- removed classness
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
"James Pan <zpan@imsa.edu>",
)
__all__ = [
'ttest_onesample',
'ttest_independent',
'ttest_statistic',
'ttest_related',
'ks_fitness',
'chisquare',
'powerdivergence'
'ks_twosample',
'es_twosample',
'mw_rank',
'mw_tiecorrection',
'rankdata',
'wilcoxon_ranksum',
'wilcoxon_signedrank',
'kw_htest',
'friedman_chisquare',
'bm_wtest',
'combine_pvalues',
'jb_fitness',
'ab_equality',
'bartlett_variance',
'levene_variance',
'sw_normality',
'shapiro',
'ad_onesample',
'ad_ksample',
'binomial',
'fk_variance',
'mood_mediantest',
'mood_equalscale',
'skewtest',
'kurtosistest',
'normaltest',
'tukey_multicomparison'
]
import numpy as np
import scipy
def ttest_onesample(a, popmean, axis = 0, nan_policy = 'propagate'):
results = scipy.stats.ttest_1samp(a, popmean, axis = axis, nan_policy = nan_policy)
return {"t-value": results[0], "p-value": results[1]}
def ttest_independent(a, b, equal = True, nan_policy = 'propagate'):
results = scipy.stats.ttest_ind(a, b, equal_var = equal, nan_policy = nan_policy)
return {"t-value": results[0], "p-value": results[1]}
def ttest_statistic(o1, o2, equal = True):
results = scipy.stats.ttest_ind_from_stats(o1["mean"], o1["std"], o1["nobs"], o2["mean"], o2["std"], o2["nobs"], equal_var = equal)
return {"t-value": results[0], "p-value": results[1]}
def ttest_related(a, b, axis = 0, nan_policy='propagate'):
results = scipy.stats.ttest_rel(a, b, axis = axis, nan_policy = nan_policy)
return {"t-value": results[0], "p-value": results[1]}
def ks_fitness(rvs, cdf, args = (), N = 20, alternative = 'two-sided', mode = 'approx'):
results = scipy.stats.kstest(rvs, cdf, args = args, N = N, alternative = alternative, mode = mode)
return {"ks-value": results[0], "p-value": results[1]}
def chisquare(f_obs, f_exp = None, ddof = None, axis = 0):
results = scipy.stats.chisquare(f_obs, f_exp = f_exp, ddof = ddof, axis = axis)
return {"chisquared-value": results[0], "p-value": results[1]}
def powerdivergence(f_obs, f_exp = None, ddof = None, axis = 0, lambda_ = None):
results = scipy.stats.power_divergence(f_obs, f_exp = f_exp, ddof = ddof, axis = axis, lambda_ = lambda_)
return {"powerdivergence-value": results[0], "p-value": results[1]}
def ks_twosample(x, y, alternative = 'two_sided', mode = 'auto'):
results = scipy.stats.ks_2samp(x, y, alternative = alternative, mode = mode)
return {"ks-value": results[0], "p-value": results[1]}
def es_twosample(x, y, t = (0.4, 0.8)):
results = scipy.stats.epps_singleton_2samp(x, y, t = t)
return {"es-value": results[0], "p-value": results[1]}
def mw_rank(x, y, use_continuity = True, alternative = None):
results = scipy.stats.mannwhitneyu(x, y, use_continuity = use_continuity, alternative = alternative)
return {"u-value": results[0], "p-value": results[1]}
def mw_tiecorrection(rank_values):
results = scipy.stats.tiecorrect(rank_values)
return {"correction-factor": results}
def rankdata(a, method = 'average'):
results = scipy.stats.rankdata(a, method = method)
return results
def wilcoxon_ranksum(a, b): # this seems to be superceded by Mann Whitney Wilcoxon U Test
results = scipy.stats.ranksums(a, b)
return {"u-value": results[0], "p-value": results[1]}
def wilcoxon_signedrank(x, y = None, zero_method = 'wilcox', correction = False, alternative = 'two-sided'):
results = scipy.stats.wilcoxon(x, y = y, zero_method = zero_method, correction = correction, alternative = alternative)
return {"t-value": results[0], "p-value": results[1]}
def kw_htest(*args, nan_policy = 'propagate'):
results = scipy.stats.kruskal(*args, nan_policy = nan_policy)
return {"h-value": results[0], "p-value": results[1]}
def friedman_chisquare(*args):
results = scipy.stats.friedmanchisquare(*args)
return {"chisquared-value": results[0], "p-value": results[1]}
def bm_wtest(x, y, alternative = 'two-sided', distribution = 't', nan_policy = 'propagate'):
results = scipy.stats.brunnermunzel(x, y, alternative = alternative, distribution = distribution, nan_policy = nan_policy)
return {"w-value": results[0], "p-value": results[1]}
def combine_pvalues(pvalues, method = 'fisher', weights = None):
results = scipy.stats.combine_pvalues(pvalues, method = method, weights = weights)
return {"combined-statistic": results[0], "p-value": results[1]}
def jb_fitness(x):
results = scipy.stats.jarque_bera(x)
return {"jb-value": results[0], "p-value": results[1]}
def ab_equality(x, y):
results = scipy.stats.ansari(x, y)
return {"ab-value": results[0], "p-value": results[1]}
def bartlett_variance(*args):
results = scipy.stats.bartlett(*args)
return {"t-value": results[0], "p-value": results[1]}
def levene_variance(*args, center = 'median', proportiontocut = 0.05):
results = scipy.stats.levene(*args, center = center, proportiontocut = proportiontocut)
return {"w-value": results[0], "p-value": results[1]}
def sw_normality(x):
results = scipy.stats.shapiro(x)
return {"w-value": results[0], "p-value": results[1]}
def shapiro(x):
return "destroyed by facts and logic"
def ad_onesample(x, dist = 'norm'):
results = scipy.stats.anderson(x, dist = dist)
return {"d-value": results[0], "critical-values": results[1], "significance-value": results[2]}
def ad_ksample(samples, midrank = True):
results = scipy.stats.anderson_ksamp(samples, midrank = midrank)
return {"d-value": results[0], "critical-values": results[1], "significance-value": results[2]}
def binomial(x, n = None, p = 0.5, alternative = 'two-sided'):
results = scipy.stats.binom_test(x, n = n, p = p, alternative = alternative)
return {"p-value": results}
def fk_variance(*args, center = 'median', proportiontocut = 0.05):
results = scipy.stats.fligner(*args, center = center, proportiontocut = proportiontocut)
return {"h-value": results[0], "p-value": results[1]} # unknown if the statistic is an h value
def mood_mediantest(*args, ties = 'below', correction = True, lambda_ = 1, nan_policy = 'propagate'):
results = scipy.stats.median_test(*args, ties = ties, correction = correction, lambda_ = lambda_, nan_policy = nan_policy)
return {"chisquared-value": results[0], "p-value": results[1], "m-value": results[2], "table": results[3]}
def mood_equalscale(x, y, axis = 0):
results = scipy.stats.mood(x, y, axis = axis)
return {"z-score": results[0], "p-value": results[1]}
def skewtest(a, axis = 0, nan_policy = 'propogate'):
results = scipy.stats.skewtest(a, axis = axis, nan_policy = nan_policy)
return {"z-score": results[0], "p-value": results[1]}
def kurtosistest(a, axis = 0, nan_policy = 'propogate'):
results = scipy.stats.kurtosistest(a, axis = axis, nan_policy = nan_policy)
return {"z-score": results[0], "p-value": results[1]}
def normaltest(a, axis = 0, nan_policy = 'propogate'):
results = scipy.stats.normaltest(a, axis = axis, nan_policy = nan_policy)
return {"z-score": results[0], "p-value": results[1]}
def get_tukeyQcrit(k, df, alpha=0.05):
'''
From statsmodels.sandbox.stats.multicomp
return critical values for Tukey's HSD (Q)
Parameters
----------
k : int in {2, ..., 10}
number of tests
df : int
degrees of freedom of error term
alpha : {0.05, 0.01}
type 1 error, 1-confidence level
not enough error checking for limitations
'''
# qtable from statsmodels.sandbox.stats.multicomp
qcrit = '''
2 3 4 5 6 7 8 9 10
5 3.64 5.70 4.60 6.98 5.22 7.80 5.67 8.42 6.03 8.91 6.33 9.32 6.58 9.67 6.80 9.97 6.99 10.24
6 3.46 5.24 4.34 6.33 4.90 7.03 5.30 7.56 5.63 7.97 5.90 8.32 6.12 8.61 6.32 8.87 6.49 9.10
7 3.34 4.95 4.16 5.92 4.68 6.54 5.06 7.01 5.36 7.37 5.61 7.68 5.82 7.94 6.00 8.17 6.16 8.37
8 3.26 4.75 4.04 5.64 4.53 6.20 4.89 6.62 5.17 6.96 5.40 7.24 5.60 7.47 5.77 7.68 5.92 7.86
9 3.20 4.60 3.95 5.43 4.41 5.96 4.76 6.35 5.02 6.66 5.24 6.91 5.43 7.13 5.59 7.33 5.74 7.49
10 3.15 4.48 3.88 5.27 4.33 5.77 4.65 6.14 4.91 6.43 5.12 6.67 5.30 6.87 5.46 7.05 5.60 7.21
11 3.11 4.39 3.82 5.15 4.26 5.62 4.57 5.97 4.82 6.25 5.03 6.48 5.20 6.67 5.35 6.84 5.49 6.99
12 3.08 4.32 3.77 5.05 4.20 5.50 4.51 5.84 4.75 6.10 4.95 6.32 5.12 6.51 5.27 6.67 5.39 6.81
13 3.06 4.26 3.73 4.96 4.15 5.40 4.45 5.73 4.69 5.98 4.88 6.19 5.05 6.37 5.19 6.53 5.32 6.67
14 3.03 4.21 3.70 4.89 4.11 5.32 4.41 5.63 4.64 5.88 4.83 6.08 4.99 6.26 5.13 6.41 5.25 6.54
15 3.01 4.17 3.67 4.84 4.08 5.25 4.37 5.56 4.59 5.80 4.78 5.99 4.94 6.16 5.08 6.31 5.20 6.44
16 3.00 4.13 3.65 4.79 4.05 5.19 4.33 5.49 4.56 5.72 4.74 5.92 4.90 6.08 5.03 6.22 5.15 6.35
17 2.98 4.10 3.63 4.74 4.02 5.14 4.30 5.43 4.52 5.66 4.70 5.85 4.86 6.01 4.99 6.15 5.11 6.27
18 2.97 4.07 3.61 4.70 4.00 5.09 4.28 5.38 4.49 5.60 4.67 5.79 4.82 5.94 4.96 6.08 5.07 6.20
19 2.96 4.05 3.59 4.67 3.98 5.05 4.25 5.33 4.47 5.55 4.65 5.73 4.79 5.89 4.92 6.02 5.04 6.14
20 2.95 4.02 3.58 4.64 3.96 5.02 4.23 5.29 4.45 5.51 4.62 5.69 4.77 5.84 4.90 5.97 5.01 6.09
24 2.92 3.96 3.53 4.55 3.90 4.91 4.17 5.17 4.37 5.37 4.54 5.54 4.68 5.69 4.81 5.81 4.92 5.92
30 2.89 3.89 3.49 4.45 3.85 4.80 4.10 5.05 4.30 5.24 4.46 5.40 4.60 5.54 4.72 5.65 4.82 5.76
40 2.86 3.82 3.44 4.37 3.79 4.70 4.04 4.93 4.23 5.11 4.39 5.26 4.52 5.39 4.63 5.50 4.73 5.60
60 2.83 3.76 3.40 4.28 3.74 4.59 3.98 4.82 4.16 4.99 4.31 5.13 4.44 5.25 4.55 5.36 4.65 5.45
120 2.80 3.70 3.36 4.20 3.68 4.50 3.92 4.71 4.10 4.87 4.24 5.01 4.36 5.12 4.47 5.21 4.56 5.30
infinity 2.77 3.64 3.31 4.12 3.63 4.40 3.86 4.60 4.03 4.76 4.17 4.88 4.29 4.99 4.39 5.08 4.47 5.16
'''
res = [line.split() for line in qcrit.replace('infinity','9999').split('\n')]
c=np.array(res[2:-1]).astype(float)
#c[c==9999] = np.inf
ccols = np.arange(2,11)
crows = c[:,0]
cv005 = c[:, 1::2]
cv001 = c[:, 2::2]
if alpha == 0.05:
intp = scipy.interpolate.interp1d(crows, cv005[:,k-2])
elif alpha == 0.01:
intp = scipy.interpolate.interp1d(crows, cv001[:,k-2])
else:
raise ValueError('only implemented for alpha equal to 0.01 and 0.05')
return intp(df)
def tukey_multicomparison(groups, alpha=0.05):
#formulas according to https://astatsa.com/OneWay_Anova_with_TukeyHSD/
k = len(groups)
df = 0
means = []
MSE = 0
for group in groups:
df+= len(group)
mean = sum(group)/len(group)
means.append(mean)
MSE += sum([(i-mean)**2 for i in group])
df -= k
MSE /= df
q_dict = {}
crit_q = get_tukeyQcrit(k, df, alpha)
for i in range(k-1):
for j in range(i+1, k):
numerator = abs(means[i] - means[j])
denominator = np.sqrt( MSE / ( 2/(1/len(groups[i]) + 1/len(groups[j])) ))
q = numerator/denominator
q_dict["group "+ str(i+1) + " and group " + str(j+1)] = [q, q>crit_q]
return q_dict

View File

@@ -0,0 +1,76 @@
# Titan Robotics Team 2022: tra_analysis package
# Written by Arthur Lu, Jacob Levine, Dev Singh, and James Pan
# Notes:
# this should be imported as a python package using 'import tra_analysis'
# this should be included in the local directory or environment variable
# this module has been optimized for multhreaded computing
# current benchmark of optimization: 1.33 times faster
# setup:
__version__ = "4.0.0"
# changelog should be viewed using print(analysis.__changelog__)
__changelog__ = """changelog:
4.0.0:
- deprecated all *_obj.py compatibility modules
- deprecated titanlearn.py
- deprecated visualization.py
- removed matplotlib from requirements
- removed extra submodule imports in Analysis
- added typehinting, docstrings for each function
3.0.0:
- incremented version to release 3.0.0
3.0.0-rc2:
- fixed __changelog__
- fixed __all__ of Analysis, Array, ClassificationMetric, CorrelationTest, RandomForest, Sort, SVM
- populated __all__
3.0.0-alpha.4:
- changed version to 3 because of significant changes
- added backwards compatibility import of analysis
2.1.0-alpha.3:
- fixed indentation in meta data
2.1.0-alpha.2:
- updated SVM import
2.1.0-alpha.1:
- moved multiple submodules under analysis to their own modules/files
- added header, __version__, __changelog__, __author__, __all__ (unpopulated)
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
"Jacob Levine <jlevine@imsa.edu>",
"Dev Singh <dev@devksingh.com>",
"James Pan <zpan@imsa.edu>"
)
__all__ = [
"Analysis",
"Array",
"ClassificationMetric",
"Clustering",
"CorrelationTest",
"Expression",
"Fit",
"KNN",
"NaiveBayes",
"RandomForest",
"RegressionMetric",
"Sort",
"StatisticalTest",
"SVM"
]
from . import Analysis as Analysis
from .Array import Array
from .ClassificationMetric import ClassificationMetric
from . import Clustering
from . import CorrelationTest
from .equation import Expression
from . import Fit
from . import KNN
from . import NaiveBayes
from . import RandomForest
from .RegressionMetric import RegressionMetric
from . import Sort
from . import StatisticalTest
from . import SVM

View File

@@ -0,0 +1,37 @@
# Titan Robotics Team 2022: Expression submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis.Equation import Expression'
# TODO:
# - add option to pick parser backend
# - fix unit tests
# setup:
__version__ = "0.0.1-alpha"
__changelog__ = """changelog:
0.0.1-alpha:
- used the HybridExpressionParser as backend for Expression
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = {
"Expression"
}
import re
from .parser import BNF, RegexInplaceParser, HybridExpressionParser, Core, equation_base
class Expression(HybridExpressionParser):
expression = None
core = None
def __init__(self,expression,argorder=[],*args,**kwargs):
self.core = Core()
equation_base.equation_extend(self.core)
self.core.recalculateFMatch()
super().__init__(self.core, expression, argorder=[],*args,**kwargs)

View File

@@ -0,0 +1,22 @@
# Titan Robotics Team 2022: Expression submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import Equation'
# setup:
__version__ = "0.0.1-alpha"
__changelog__ = """changelog:
0.0.1-alpha:
- made first prototype of Expression
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = {
"Expression"
}
from .Expression import Expression

View File

@@ -0,0 +1,97 @@
from __future__ import division
from pyparsing import (Literal, CaselessLiteral, Word, Combine, Group, Optional, ZeroOrMore, Forward, nums, alphas, oneOf)
from . import py2
import math
import operator
class BNF(object):
def pushFirst(self, strg, loc, toks):
self.exprStack.append(toks[0])
def pushUMinus(self, strg, loc, toks):
if toks and toks[0] == '-':
self.exprStack.append('unary -')
def __init__(self):
"""
expop :: '^'
multop :: '*' | '/'
addop :: '+' | '-'
integer :: ['+' | '-'] '0'..'9'+
atom :: PI | E | real | fn '(' expr ')' | '(' expr ')'
factor :: atom [ expop factor ]*
term :: factor [ multop factor ]*
expr :: term [ addop term ]*
"""
point = Literal(".")
e = CaselessLiteral("E")
fnumber = Combine(Word("+-" + nums, nums) +
Optional(point + Optional(Word(nums))) +
Optional(e + Word("+-" + nums, nums)))
ident = Word(alphas, alphas + nums + "_$")
plus = Literal("+")
minus = Literal("-")
mult = Literal("*")
div = Literal("/")
lpar = Literal("(").suppress()
rpar = Literal(")").suppress()
addop = plus | minus
multop = mult | div
expop = Literal("^")
pi = CaselessLiteral("PI")
expr = Forward()
atom = ((Optional(oneOf("- +")) +
(ident + lpar + expr + rpar | pi | e | fnumber).setParseAction(self.pushFirst))
| Optional(oneOf("- +")) + Group(lpar + expr + rpar)
).setParseAction(self.pushUMinus)
factor = Forward()
factor << atom + \
ZeroOrMore((expop + factor).setParseAction(self.pushFirst))
term = factor + \
ZeroOrMore((multop + factor).setParseAction(self.pushFirst))
expr << term + \
ZeroOrMore((addop + term).setParseAction(self.pushFirst))
self.bnf = expr
epsilon = 1e-12
self.opn = {"+": operator.add,
"-": operator.sub,
"*": operator.mul,
"/": operator.truediv,
"^": operator.pow}
self.fn = {"sin": math.sin,
"cos": math.cos,
"tan": math.tan,
"exp": math.exp,
"abs": abs,
"trunc": lambda a: int(a),
"round": round,
"sgn": lambda a: abs(a) > epsilon and py2.cmp(a, 0) or 0}
def evaluateStack(self, s):
op = s.pop()
if op == 'unary -':
return -self.evaluateStack(s)
if op in "+-*/^":
op2 = self.evaluateStack(s)
op1 = self.evaluateStack(s)
return self.opn[op](op1, op2)
elif op == "PI":
return math.pi
elif op == "E":
return math.e
elif op in self.fn:
return self.fn[op](self.evaluateStack(s))
elif op[0].isalpha():
return 0
else:
return float(op)
def eval(self, num_string, parseAll=True):
self.exprStack = []
results = self.bnf.parseString(num_string, parseAll)
val = self.evaluateStack(self.exprStack[:])
return val

View File

@@ -0,0 +1,521 @@
from .Hybrid_Utils import Core, ExpressionFunction, ExpressionVariable, ExpressionValue
import sys
if sys.version_info >= (3,):
xrange = range
basestring = str
class HybridExpressionParser(object):
def __init__(self,core,expression,argorder=[],*args,**kwargs):
super(HybridExpressionParser,self).__init__(*args,**kwargs)
if isinstance(expression,type(self)): # clone the object
self.core = core
self.__args = list(expression.__args)
self.__vars = dict(expression.__vars) # intenral array of preset variables
self.__argsused = set(expression.__argsused)
self.__expr = list(expression.__expr)
self.variables = {} # call variables
else:
self.__expression = expression
self.__args = argorder;
self.__vars = {} # intenral array of preset variables
self.__argsused = set()
self.__expr = [] # compiled equation tokens
self.variables = {} # call variables
self.__compile()
del self.__expression
def __getitem__(self, name):
if name in self.__argsused:
if name in self.__vars:
return self.__vars[name]
else:
return None
else:
raise KeyError(name)
def __setitem__(self,name,value):
if name in self.__argsused:
self.__vars[name] = value
else:
raise KeyError(name)
def __delitem__(self,name):
if name in self.__argsused:
if name in self.__vars:
del self.__vars[name]
else:
raise KeyError(name)
def __contains__(self, name):
return name in self.__argsused
def __call__(self,*args,**kwargs):
if len(self.__expr) == 0:
return None
self.variables = {}
self.variables.update(self.core.constants)
self.variables.update(self.__vars)
if len(args) > len(self.__args):
raise TypeError("<{0:s}.{1:s}({2:s}) object at {3:0=#10x}>() takes at most {4:d} arguments ({5:d} given)".format(
type(self).__module__,type(self).__name__,repr(self),id(self),len(self.__args),len(args)))
for i in xrange(len(args)):
if i < len(self.__args):
if self.__args[i] in kwargs:
raise TypeError("<{0:s}.{1:s}({2:s}) object at {3:0=#10x}>() got multiple values for keyword argument '{4:s}'".format(
type(self).__module__,type(self).__name__,repr(self),id(self),self.__args[i]))
self.variables[self.__args[i]] = args[i]
self.variables.update(kwargs)
for arg in self.__argsused:
if arg not in self.variables:
min_args = len(self.__argsused - (set(self.__vars.keys()) | set(self.core.constants.keys())))
raise TypeError("<{0:s}.{1:s}({2:s}) object at {3:0=#10x}>() takes at least {4:d} arguments ({5:d} given) '{6:s}' not defined".format(
type(self).__module__,type(self).__name__,repr(self),id(self),min_args,len(args)+len(kwargs),arg))
expr = self.__expr[::-1]
args = []
while len(expr) > 0:
t = expr.pop()
r = t(args,self)
args.append(r)
if len(args) > 1:
return args
else:
return args[0]
def __next(self,__expect_op):
if __expect_op:
m = self.core.gematch.match(self.__expression)
if m != None:
self.__expression = self.__expression[m.end():]
g = m.groups()
return g[0],'CLOSE'
m = self.core.smatch.match(self.__expression)
if m != None:
self.__expression = self.__expression[m.end():]
return ",",'SEP'
m = self.core.omatch.match(self.__expression)
if m != None:
self.__expression = self.__expression[m.end():]
g = m.groups()
return g[0],'OP'
else:
m = self.core.gsmatch.match(self.__expression)
if m != None:
self.__expression = self.__expression[m.end():]
g = m.groups()
return g[0],'OPEN'
m = self.core.vmatch.match(self.__expression)
if m != None:
self.__expression = self.__expression[m.end():]
g = m.groupdict(0)
if g['dec']:
if g["ivalue"]:
return complex(int(g["rsign"]+"1")*float(g["rvalue"])*10**int(g["rexpoent"]),int(g["isign"]+"1")*float(g["ivalue"])*10**int(g["iexpoent"])),'VALUE'
elif g["rexpoent"] or g["rvalue"].find('.')>=0:
return int(g["rsign"]+"1")*float(g["rvalue"])*10**int(g["rexpoent"]),'VALUE'
else:
return int(g["rsign"]+"1")*int(g["rvalue"]),'VALUE'
elif g["hex"]:
return int(g["hexsign"]+"1")*int(g["hexvalue"],16),'VALUE'
elif g["oct"]:
return int(g["octsign"]+"1")*int(g["octvalue"],8),'VALUE'
elif g["bin"]:
return int(g["binsign"]+"1")*int(g["binvalue"],2),'VALUE'
else:
raise NotImplemented("'{0:s}' Values Not Implemented Yet".format(m.string))
m = self.core.nmatch.match(self.__expression)
if m != None:
self.__expression = self.__expression[m.end():]
g = m.groups()
return g[0],'NAME'
m = self.core.fmatch.match(self.__expression)
if m != None:
self.__expression = self.__expression[m.end():]
g = m.groups()
return g[0],'FUNC'
m = self.core.umatch.match(self.__expression)
if m != None:
self.__expression = self.__expression[m.end():]
g = m.groups()
return g[0],'UNARY'
return None
def show(self):
"""Show RPN tokens
This will print out the internal token list (RPN) of the expression
one token perline.
"""
for expr in self.__expr:
print(expr)
def __str__(self):
"""str(fn)
Generates a Printable version of the Expression
Returns
-------
str
Latex String respresation of the Expression, suitable for rendering the equation
"""
expr = self.__expr[::-1]
if len(expr) == 0:
return ""
args = [];
while len(expr) > 0:
t = expr.pop()
r = t.toStr(args,self)
args.append(r)
if len(args) > 1:
return args
else:
return args[0]
def __repr__(self):
"""repr(fn)
Generates a String that correctrly respresents the equation
Returns
-------
str
Convert the Expression to a String that passed to the constructor, will constuct
an identical equation object (in terms of sequence of tokens, and token type/value)
"""
expr = self.__expr[::-1]
if len(expr) == 0:
return ""
args = [];
while len(expr) > 0:
t = expr.pop()
r = t.toRepr(args,self)
args.append(r)
if len(args) > 1:
return args
else:
return args[0]
def __iter__(self):
return iter(self.__argsused)
def __lt__(self, other):
if isinstance(other, Expression):
return repr(self) < repr(other)
else:
raise TypeError("{0:s} is not an {1:s} Object, and can't be compared to an Expression Object".format(repr(other), type(other)))
def __eq__(self, other):
if isinstance(other, Expression):
return repr(self) == repr(other)
else:
raise TypeError("{0:s} is not an {1:s} Object, and can't be compared to an Expression Object".format(repr(other), type(other)))
def __combine(self,other,op):
if op not in self.core.ops or not isinstance(other,(int,float,complex,type(self),basestring)):
return NotImplemented
else:
obj = type(self)(self)
if isinstance(other,(int,float,complex)):
obj.__expr.append(ExpressionValue(other))
else:
if isinstance(other,basestring):
try:
other = type(self)(other)
except:
raise SyntaxError("Can't Convert string, \"{0:s}\" to an Expression Object".format(other))
obj.__expr += other.__expr
obj.__argsused |= other.__argsused
for v in other.__args:
if v not in obj.__args:
obj.__args.append(v)
for k,v in other.__vars.items():
if k not in obj.__vars:
obj.__vars[k] = v
elif v != obj.__vars[k]:
raise RuntimeError("Predifined Variable Conflict in '{0:s}' two differing values defined".format(k))
fn = self.core.ops[op]
obj.__expr.append(ExpressionFunction(fn['func'],fn['args'],fn['str'],fn['latex'],op,False))
return obj
def __rcombine(self,other,op):
if op not in self.core.ops or not isinstance(other,(int,float,complex,type(self),basestring)):
return NotImplemented
else:
obj = type(self)(self)
if isinstance(other,(int,float,complex)):
obj.__expr.insert(0,ExpressionValue(other))
else:
if isinstance(other,basestring):
try:
other = type(self)(other)
except:
raise SyntaxError("Can't Convert string, \"{0:s}\" to an Expression Object".format(other))
obj.__expr = other.__expr + self.__expr
obj.__argsused = other.__argsused | self.__expr
__args = other.__args
for v in obj.__args:
if v not in __args:
__args.append(v)
obj.__args = __args
for k,v in other.__vars.items():
if k not in obj.__vars:
obj.__vars[k] = v
elif v != obj.__vars[k]:
raise RuntimeError("Predifined Variable Conflict in '{0:s}' two differing values defined".format(k))
fn = self.core.ops[op]
obj.__expr.append(ExpressionFunction(fn['func'],fn['args'],fn['str'],fn['latex'],op,False))
return obj
def __icombine(self,other,op):
if op not in self.core.ops or not isinstance(other,(int,float,complex,type(self),basestring)):
return NotImplemented
else:
obj = self
if isinstance(other,(int,float,complex)):
obj.__expr.append(ExpressionValue(other))
else:
if isinstance(other,basestring):
try:
other = type(self)(other)
except:
raise SyntaxError("Can't Convert string, \"{0:s}\" to an Expression Object".format(other))
obj.__expr += other.__expr
obj.__argsused |= other.__argsused
for v in other.__args:
if v not in obj.__args:
obj.__args.append(v)
for k,v in other.__vars.items():
if k not in obj.__vars:
obj.__vars[k] = v
elif v != obj.__vars[k]:
raise RuntimeError("Predifined Variable Conflict in '{0:s}' two differing values defined".format(k))
fn = self.core.ops[op]
obj.__expr.append(ExpressionFunction(fn['func'],fn['args'],fn['str'],fn['latex'],op,False))
return obj
def __apply(self,op):
fn = self.core.unary_ops[op]
obj = type(self)(self)
obj.__expr.append(ExpressionFunction(fn['func'],1,fn['str'],fn['latex'],op,False))
return obj
def __applycall(self,op):
fn = self.core.functions[op]
if 1 not in fn['args'] or '*' not in fn['args']:
raise RuntimeError("Can't Apply {0:s} function, dosen't accept only 1 argument".format(op))
obj = type(self)(self)
obj.__expr.append(ExpressionFunction(fn['func'],1,fn['str'],fn['latex'],op,False))
return obj
def __add__(self,other):
return self.__combine(other,'+')
def __sub__(self,other):
return self.__combine(other,'-')
def __mul__(self,other):
return self.__combine(other,'*')
def __div__(self,other):
return self.__combine(other,'/')
def __truediv__(self,other):
return self.__combine(other,'/')
def __pow__(self,other):
return self.__combine(other,'^')
def __mod__(self,other):
return self.__combine(other,'%')
def __and__(self,other):
return self.__combine(other,'&')
def __or__(self,other):
return self.__combine(other,'|')
def __xor__(self,other):
return self.__combine(other,'</>')
def __radd__(self,other):
return self.__rcombine(other,'+')
def __rsub__(self,other):
return self.__rcombine(other,'-')
def __rmul__(self,other):
return self.__rcombine(other,'*')
def __rdiv__(self,other):
return self.__rcombine(other,'/')
def __rtruediv__(self,other):
return self.__rcombine(other,'/')
def __rpow__(self,other):
return self.__rcombine(other,'^')
def __rmod__(self,other):
return self.__rcombine(other,'%')
def __rand__(self,other):
return self.__rcombine(other,'&')
def __ror__(self,other):
return self.__rcombine(other,'|')
def __rxor__(self,other):
return self.__rcombine(other,'</>')
def __iadd__(self,other):
return self.__icombine(other,'+')
def __isub__(self,other):
return self.__icombine(other,'-')
def __imul__(self,other):
return self.__icombine(other,'*')
def __idiv__(self,other):
return self.__icombine(other,'/')
def __itruediv__(self,other):
return self.__icombine(other,'/')
def __ipow__(self,other):
return self.__icombine(other,'^')
def __imod__(self,other):
return self.__icombine(other,'%')
def __iand__(self,other):
return self.__icombine(other,'&')
def __ior__(self,other):
return self.__icombine(other,'|')
def __ixor__(self,other):
return self.__icombine(other,'</>')
def __neg__(self):
return self.__apply('-')
def __invert__(self):
return self.__apply('!')
def __abs__(self):
return self.__applycall('abs')
def __getfunction(self,op):
if op[1] == 'FUNC':
fn = self.core.functions[op[0]]
fn['type'] = 'FUNC'
elif op[1] == 'UNARY':
fn = self.core.unary_ops[op[0]]
fn['type'] = 'UNARY'
fn['args'] = 1
elif op[1] == 'OP':
fn = self.core.ops[op[0]]
fn['type'] = 'OP'
return fn
def __compile(self):
self.__expr = []
stack = []
argc = []
__expect_op = False
v = self.__next(__expect_op)
while v != None:
if not __expect_op and v[1] == "OPEN":
stack.append(v)
__expect_op = False
elif __expect_op and v[1] == "CLOSE":
op = stack.pop()
while op[1] != "OPEN":
fs = self.__getfunction(op)
self.__expr.append(ExpressionFunction(fs['func'],fs['args'],fs['str'],fs['latex'],op[0],False))
op = stack.pop()
if len(stack) > 0 and stack[-1][0] in self.core.functions:
op = stack.pop()
fs = self.core.functions[op[0]]
args = argc.pop()
if fs['args'] != '+' and (args != fs['args'] and args not in fs['args']):
raise SyntaxError("Invalid number of arguments for {0:s} function".format(op[0]))
self.__expr.append(ExpressionFunction(fs['func'],args,fs['str'],fs['latex'],op[0],True))
__expect_op = True
elif __expect_op and v[0] == ",":
argc[-1] += 1
op = stack.pop()
while op[1] != "OPEN":
fs = self.__getfunction(op)
self.__expr.append(ExpressionFunction(fs['func'],fs['args'],fs['str'],fs['latex'],op[0],False))
op = stack.pop()
stack.append(op)
__expect_op = False
elif __expect_op and v[0] in self.core.ops:
fn = self.core.ops[v[0]]
if len(stack) == 0:
stack.append(v)
__expect_op = False
v = self.__next(__expect_op)
continue
op = stack.pop()
if op[0] == "(":
stack.append(op)
stack.append(v)
__expect_op = False
v = self.__next(__expect_op)
continue
fs = self.__getfunction(op)
while True:
if (fn['prec'] >= fs['prec']):
self.__expr.append(ExpressionFunction(fs['func'],fs['args'],fs['str'],fs['latex'],op[0],False))
if len(stack) == 0:
stack.append(v)
break
op = stack.pop()
if op[0] == "(":
stack.append(op)
stack.append(v)
break
fs = self.__getfunction(op)
else:
stack.append(op)
stack.append(v)
break
__expect_op = False
elif not __expect_op and v[0] in self.core.unary_ops:
fn = self.core.unary_ops[v[0]]
stack.append(v)
__expect_op = False
elif not __expect_op and v[0] in self.core.functions:
stack.append(v)
argc.append(1)
__expect_op = False
elif not __expect_op and v[1] == 'NAME':
self.__argsused.add(v[0])
if v[0] not in self.__args:
self.__args.append(v[0])
self.__expr.append(ExpressionVariable(v[0]))
__expect_op = True
elif not __expect_op and v[1] == 'VALUE':
self.__expr.append(ExpressionValue(v[0]))
__expect_op = True
else:
raise SyntaxError("Invalid Token \"{0:s}\" in Expression, Expected {1:s}".format(v,"Op" if __expect_op else "Value"))
v = self.__next(__expect_op)
if len(stack) > 0:
op = stack.pop()
while op != "(":
fs = self.__getfunction(op)
self.__expr.append(ExpressionFunction(fs['func'],fs['args'],fs['str'],fs['latex'],op[0],False))
if len(stack) > 0:
op = stack.pop()
else:
break

View File

@@ -0,0 +1,237 @@
import math
import sys
import re
if sys.version_info >= (3,):
xrange = range
basestring = str
class ExpressionObject(object):
def __init__(self,*args,**kwargs):
super(ExpressionObject,self).__init__(*args,**kwargs)
def toStr(self,args,expression):
return ""
def toRepr(self,args,expression):
return ""
def __call__(self,args,expression):
pass
class ExpressionValue(ExpressionObject):
def __init__(self,value,*args,**kwargs):
super(ExpressionValue,self).__init__(*args,**kwargs)
self.value = value
def toStr(self,args,expression):
if (isinstance(self.value,complex)):
V = [self.value.real,self.value.imag]
E = [0,0]
B = [0,0]
out = ["",""]
for i in xrange(2):
if V[i] == 0:
E[i] = 0
B[i] = 0
else:
E[i] = int(math.floor(math.log10(abs(V[i]))))
B[i] = V[i]*10**-E[i]
if E[i] in [0,1,2,3] and str(V[i])[-2:] == ".0":
B[i] = int(V[i])
E[i] = 0
if E[i] in [-1,-2] and len(str(V[i])) <= 7:
B[i] = V[i]
E[i] = 0
if i == 1:
fmt = "{{0:+{0:s}}}"
else:
fmt = "{{0:-{0:s}}}"
if type(B[i]) == int:
out[i] += fmt.format('d').format(B[i])
else:
out[i] += fmt.format('.5f').format(B[i]).rstrip("0.")
if i == 1:
out[i] += "\\imath"
if E[i] != 0:
out[i] += "\\times10^{{{0:d}}}".format(E[i])
return "\\left(" + ''.join(out) + "\\right)"
elif (isinstance(self.value,float)):
V = self.value
E = 0
B = 0
out = ""
if V == 0:
E = 0
B = 0
else:
E = int(math.floor(math.log10(abs(V))))
B = V*10**-E
if E in [0,1,2,3] and str(V)[-2:] == ".0":
B = int(V)
E = 0
if E in [-1,-2] and len(str(V)) <= 7:
B = V
E = 0
if type(B) == int:
out += "{0:-d}".format(B)
else:
out += "{0:-.5f}".format(B).rstrip("0.")
if E != 0:
out += "\\times10^{{{0:d}}}".format(E)
return "\\left(" + out + "\\right)"
else:
return out
else:
return str(self.value)
def toRepr(self,args,expression):
return str(self.value)
def __call__(self,args,expression):
return self.value
def __repr__(self):
return "<{0:s}.{1:s}({2:s}) object at {3:0=#10x}>".format(type(self).__module__,type(self).__name__,str(self.value),id(self))
class ExpressionFunction(ExpressionObject):
def __init__(self,function,nargs,form,display,id,isfunc,*args,**kwargs):
super(ExpressionFunction,self).__init__(*args,**kwargs)
self.function = function
self.nargs = nargs
self.form = form
self.display = display
self.id = id
self.isfunc = isfunc
def toStr(self,args,expression):
params = []
for i in xrange(self.nargs):
params.append(args.pop())
if self.isfunc:
return str(self.display.format(','.join(params[::-1])))
else:
return str(self.display.format(*params[::-1]))
def toRepr(self,args,expression):
params = []
for i in xrange(self.nargs):
params.append(args.pop())
if self.isfunc:
return str(self.form.format(','.join(params[::-1])))
else:
return str(self.form.format(*params[::-1]))
def __call__(self,args,expression):
params = []
for i in xrange(self.nargs):
params.append(args.pop())
return self.function(*params[::-1])
def __repr__(self):
return "<{0:s}.{1:s}({2:s},{3:d}) object at {4:0=#10x}>".format(type(self).__module__,type(self).__name__,str(self.id),self.nargs,id(self))
class ExpressionVariable(ExpressionObject):
def __init__(self,name,*args,**kwargs):
super(ExpressionVariable,self).__init__(*args,**kwargs)
self.name = name
def toStr(self,args,expression):
return str(self.name)
def toRepr(self,args,expression):
return str(self.name)
def __call__(self,args,expression):
if self.name in expression.variables:
return expression.variables[self.name]
else:
return 0 # Default variables to return 0
def __repr__(self):
return "<{0:s}.{1:s}({2:s}) object at {3:0=#10x}>".format(type(self).__module__,type(self).__name__,str(self.name),id(self))
class Core():
constants = {}
unary_ops = {}
ops = {}
functions = {}
smatch = re.compile(r"\s*,")
vmatch = re.compile(r"\s*"
"(?:"
"(?P<oct>"
"(?P<octsign>[+-]?)"
r"\s*0o"
"(?P<octvalue>[0-7]+)"
")|(?P<hex>"
"(?P<hexsign>[+-]?)"
r"\s*0x"
"(?P<hexvalue>[0-9a-fA-F]+)"
")|(?P<bin>"
"(?P<binsign>[+-]?)"
r"\s*0b"
"(?P<binvalue>[01]+)"
")|(?P<dec>"
"(?P<rsign>[+-]?)"
r"\s*"
r"(?P<rvalue>(?:\d+\.\d+|\d+\.|\.\d+|\d+))"
"(?:"
"[Ee]"
r"(?P<rexpoent>[+-]?\d+)"
")?"
"(?:"
r"\s*"
r"(?P<sep>(?(rvalue)\+|))?"
r"\s*"
"(?P<isign>(?(rvalue)(?(sep)[+-]?|[+-])|[+-]?)?)"
r"\s*"
r"(?P<ivalue>(?:\d+\.\d+|\d+\.|\.\d+|\d+))"
"(?:"
"[Ee]"
r"(?P<iexpoent>[+-]?\d+)"
")?"
"[ij]"
")?"
")"
")")
nmatch = re.compile(r"\s*([a-zA-Z_][a-zA-Z0-9_]*)")
gsmatch = re.compile(r'\s*(\()')
gematch = re.compile(r'\s*(\))')
def recalculateFMatch(self):
fks = sorted(self.functions.keys(), key=len, reverse=True)
oks = sorted(self.ops.keys(), key=len, reverse=True)
uks = sorted(self.unary_ops.keys(), key=len, reverse=True)
self.fmatch = re.compile(r'\s*(' + '|'.join(map(re.escape,fks)) + ')')
self.omatch = re.compile(r'\s*(' + '|'.join(map(re.escape,oks)) + ')')
self.umatch = re.compile(r'\s*(' + '|'.join(map(re.escape,uks)) + ')')
def addFn(self,id,str,latex,args,func):
self.functions[id] = {
'str': str,
'latex': latex,
'args': args,
'func': func}
def addOp(self,id,str,latex,single,prec,func):
if single:
raise RuntimeError("Single Ops Not Yet Supported")
self.ops[id] = {
'str': str,
'latex': latex,
'args': 2,
'prec': prec,
'func': func}
def addUnaryOp(self,id,str,latex,func):
self.unary_ops[id] = {
'str': str,
'latex': latex,
'args': 1,
'prec': 0,
'func': func}
def addConst(self,name,value):
self.constants[name] = value

View File

@@ -0,0 +1,2 @@
from . import equation_base as equation_base
from .ExpressionCore import ExpressionValue, ExpressionFunction, ExpressionVariable, Core

View File

@@ -0,0 +1,106 @@
try:
import numpy as np
has_numpy = True
except ImportError:
import math
has_numpy = False
try:
import scipy.constants
has_scipy = True
except ImportError:
has_scipy = False
import operator as op
from .similar import sim, nsim, gsim, lsim
def equation_extend(core):
def product(*args):
if len(args) == 1 and has_numpy:
return np.prod(args[0])
else:
return reduce(op.mul,args,1)
def sumargs(*args):
if len(args) == 1:
return sum(args[0])
else:
return sum(args)
core.addOp('+',"({0:s} + {1:s})","\\left({0:s} + {1:s}\\right)",False,3,op.add)
core.addOp('-',"({0:s} - {1:s})","\\left({0:s} - {1:s}\\right)",False,3,op.sub)
core.addOp('*',"({0:s} * {1:s})","\\left({0:s} \\times {1:s}\\right)",False,2,op.mul)
core.addOp('/',"({0:s} / {1:s})","\\frac{{{0:s}}}{{{1:s}}}",False,2,op.truediv)
core.addOp('%',"({0:s} % {1:s})","\\left({0:s} \\bmod {1:s}\\right)",False,2,op.mod)
core.addOp('^',"({0:s} ^ {1:s})","{0:s}^{{{1:s}}}",False,1,op.pow)
core.addOp('**',"({0:s} ^ {1:s})","{0:s}^{{{1:s}}}",False,1,op.pow)
core.addOp('&',"({0:s} & {1:s})","\\left({0:s} \\land {1:s}\\right)",False,4,op.and_)
core.addOp('|',"({0:s} | {1:s})","\\left({0:s} \\lor {1:s}\\right)",False,4,op.or_)
core.addOp('</>',"({0:s} </> {1:s})","\\left({0:s} \\oplus {1:s}\\right)",False,4,op.xor)
core.addOp('&|',"({0:s} </> {1:s})","\\left({0:s} \\oplus {1:s}\\right)",False,4,op.xor)
core.addOp('|&',"({0:s} </> {1:s})","\\left({0:s} \\oplus {1:s}\\right)",False,4,op.xor)
core.addOp('==',"({0:s} == {1:s})","\\left({0:s} = {1:s}\\right)",False,5,op.eq)
core.addOp('=',"({0:s} == {1:s})","\\left({0:s} = {1:s}\\right)",False,5,op.eq)
core.addOp('~',"({0:s} ~ {1:s})","\\left({0:s} \\approx {1:s}\\right)",False,5,sim)
core.addOp('!~',"({0:s} !~ {1:s})","\\left({0:s} \\not\\approx {1:s}\\right)",False,5,nsim)
core.addOp('!=',"({0:s} != {1:s})","\\left({0:s} \\neg {1:s}\\right)",False,5,op.ne)
core.addOp('<>',"({0:s} != {1:s})","\\left({0:s} \\neg {1:s}\\right)",False,5,op.ne)
core.addOp('><',"({0:s} != {1:s})","\\left({0:s} \\neg {1:s}\\right)",False,5,op.ne)
core.addOp('<',"({0:s} < {1:s})","\\left({0:s} < {1:s}\\right)",False,5,op.lt)
core.addOp('>',"({0:s} > {1:s})","\\left({0:s} > {1:s}\\right)",False,5,op.gt)
core.addOp('<=',"({0:s} <= {1:s})","\\left({0:s} \\leq {1:s}\\right)",False,5,op.le)
core.addOp('>=',"({0:s} >= {1:s})","\\left({0:s} \\geq {1:s}\\right)",False,5,op.ge)
core.addOp('=<',"({0:s} <= {1:s})","\\left({0:s} \\leq {1:s}\\right)",False,5,op.le)
core.addOp('=>',"({0:s} >= {1:s})","\\left({0:s} \\geq {1:s}\\right)",False,5,op.ge)
core.addOp('<~',"({0:s} <~ {1:s})","\\left({0:s} \lessapprox {1:s}\\right)",False,5,lsim)
core.addOp('>~',"({0:s} >~ {1:s})","\\left({0:s} \\gtrapprox {1:s}\\right)",False,5,gsim)
core.addOp('~<',"({0:s} <~ {1:s})","\\left({0:s} \lessapprox {1:s}\\right)",False,5,lsim)
core.addOp('~>',"({0:s} >~ {1:s})","\\left({0:s} \\gtrapprox {1:s}\\right)",False,5,gsim)
core.addUnaryOp('!',"(!{0:s})","\\neg{0:s}",op.not_)
core.addUnaryOp('-',"-{0:s}","-{0:s}",op.neg)
core.addFn('abs',"abs({0:s})","\\left|{0:s}\\right|",1,op.abs)
core.addFn('sum',"sum({0:s})","\\sum\\left({0:s}\\right)",'+',sumargs)
core.addFn('prod',"prod({0:s})","\\prod\\left({0:s}\\right)",'+',product)
if has_numpy:
core.addFn('floor',"floor({0:s})","\\lfloor {0:s} \\rfloor",1,np.floor)
core.addFn('ceil',"ceil({0:s})","\\lceil {0:s} \\rceil",1,np.ceil)
core.addFn('round',"round({0:s})","\\lfloor {0:s} \\rceil",1,np.round)
core.addFn('sin',"sin({0:s})","\\sin\\left({0:s}\\right)",1,np.sin)
core.addFn('cos',"cos({0:s})","\\cos\\left({0:s}\\right)",1,np.cos)
core.addFn('tan',"tan({0:s})","\\tan\\left({0:s}\\right)",1,np.tan)
core.addFn('re',"re({0:s})","\\Re\\left({0:s}\\right)",1,np.real)
core.addFn('im',"re({0:s})","\\Im\\left({0:s}\\right)",1,np.imag)
core.addFn('sqrt',"sqrt({0:s})","\\sqrt{{{0:s}}}",1,np.sqrt)
core.addConst("pi",np.pi)
core.addConst("e",np.e)
core.addConst("Inf",np.Inf)
core.addConst("NaN",np.NaN)
else:
core.addFn('floor',"floor({0:s})","\\lfloor {0:s} \\rfloor",1,math.floor)
core.addFn('ceil',"ceil({0:s})","\\lceil {0:s} \\rceil",1,math.ceil)
core.addFn('round',"round({0:s})","\\lfloor {0:s} \\rceil",1,round)
core.addFn('sin',"sin({0:s})","\\sin\\left({0:s}\\right)",1,math.sin)
core.addFn('cos',"cos({0:s})","\\cos\\left({0:s}\\right)",1,math.cos)
core.addFn('tan',"tan({0:s})","\\tan\\left({0:s}\\right)",1,math.tan)
core.addFn('re',"re({0:s})","\\Re\\left({0:s}\\right)",1,complex.real)
core.addFn('im',"re({0:s})","\\Im\\left({0:s}\\right)",1,complex.imag)
core.addFn('sqrt',"sqrt({0:s})","\\sqrt{{{0:s}}}",1,math.sqrt)
core.addConst("pi",math.pi)
core.addConst("e",math.e)
core.addConst("Inf",float("Inf"))
core.addConst("NaN",float("NaN"))
if has_scipy:
core.addConst("h",scipy.constants.h)
core.addConst("hbar",scipy.constants.hbar)
core.addConst("m_e",scipy.constants.m_e)
core.addConst("m_p",scipy.constants.m_p)
core.addConst("m_n",scipy.constants.m_n)
core.addConst("c",scipy.constants.c)
core.addConst("N_A",scipy.constants.N_A)
core.addConst("mu_0",scipy.constants.mu_0)
core.addConst("eps_0",scipy.constants.epsilon_0)
core.addConst("k",scipy.constants.k)
core.addConst("G",scipy.constants.G)
core.addConst("g",scipy.constants.g)
core.addConst("q",scipy.constants.e)
core.addConst("R",scipy.constants.R)
core.addConst("sigma",scipy.constants.e)
core.addConst("Rb",scipy.constants.Rydberg)

View File

@@ -0,0 +1,49 @@
_tol = 1e-5
def sim(a,b):
if (a==b):
return True
elif a == 0 or b == 0:
return False
if (a<b):
return (1-a/b)<=_tol
else:
return (1-b/a)<=_tol
def nsim(a,b):
if (a==b):
return False
elif a == 0 or b == 0:
return True
if (a<b):
return (1-a/b)>_tol
else:
return (1-b/a)>_tol
def gsim(a,b):
if a >= b:
return True
return (1-a/b)<=_tol
def lsim(a,b):
if a <= b:
return True
return (1-b/a)<=_tol
def set_tol(value=1e-5):
r"""Set Error Tolerance
Set the tolerance for detriming if two numbers are simliar, i.e
:math:`\left|\frac{a}{b}\right| = 1 \pm tolerance`
Parameters
----------
value: float
The Value to set the tolerance to show be very small as it respresents the
percentage of acceptable error in detriming if two values are the same.
"""
global _tol
if isinstance(value,float):
_tol = value
else:
raise TypeError(type(value))

View File

@@ -0,0 +1,51 @@
import re
from decimal import Decimal
from functools import reduce
class RegexInplaceParser(object):
def __init__(self, string):
self.string = string
def add(self, string):
while(len(re.findall("[+]{1}[-]?", string)) != 0):
string = re.sub("[-]?\d+[.]?\d*[+]{1}[-]?\d+[.]?\d*", str("%f" % reduce((lambda x, y: x + y), [Decimal(i) for i in re.split("[+]{1}", re.search("[-]?\d+[.]?\d*[+]{1}[-]?\d+[.]?\d*", string).group())])), string, 1)
return string
def sub(self, string):
while(len(re.findall("\d+[.]?\d*[-]{1,2}\d+[.]?\d*", string)) != 0):
g = re.search("\d+[.]?\d*[-]{1,2}\d+[.]?\d*", string).group()
if(re.search("[-]{1,2}", g).group() == "-"):
r = re.sub("[-]{1}", "+-", g, 1)
string = re.sub(g, r, string, 1)
elif(re.search("[-]{1,2}", g).group() == "--"):
r = re.sub("[-]{2}", "+", g, 1)
string = re.sub(g, r, string, 1)
else:
pass
return string
def mul(self, string):
while(len(re.findall("[*]{1}[-]?", string)) != 0):
string = re.sub("[-]?\d+[.]?\d*[*]{1}[-]?\d+[.]?\d*", str("%f" % reduce((lambda x, y: x * y), [Decimal(i) for i in re.split("[*]{1}", re.search("[-]?\d+[.]?\d*[*]{1}[-]?\d+[.]?\d*", string).group())])), string, 1)
return string
def div(self, string):
while(len(re.findall("[/]{1}[-]?", string)) != 0):
string = re.sub("[-]?\d+[.]?\d*[/]{1}[-]?\d+[.]?\d*", str("%f" % reduce((lambda x, y: x / y), [Decimal(i) for i in re.split("[/]{1}", re.search("[-]?\d+[.]?\d*[/]{1}[-]?\d+[.]?\d*", string).group())])), string, 1)
return string
def exp(self, string):
while(len(re.findall("[\^]{1}[-]?", string)) != 0):
string = re.sub("[-]?\d+[.]?\d*[\^]{1}[-]?\d+[.]?\d*", str("%f" % reduce((lambda x, y: x ** y), [Decimal(i) for i in re.split("[\^]{1}", re.search("[-]?\d+[.]?\d*[\^]{1}[-]?\d+[.]?\d*", string).group())])), string, 1)
return string
def evaluate(self):
string = self.string
string = self.exp(string)
string = self.div(string)
string = self.mul(string)
string = self.sub(string)
string = self.add(string)
return string

View File

@@ -0,0 +1,34 @@
# Titan Robotics Team 2022: Expression submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis.Equation import parser'
# setup:
__version__ = "0.0.4-alpha"
__changelog__ = """changelog:
0.0.4-alpha:
- moved individual parsers to their own files
0.0.3-alpha:
- readded old regex based parser as RegexInplaceParser
0.0.2-alpha:
- wrote BNF using pyparsing and uses a BNF metasyntax
- renamed this submodule parser
0.0.1-alpha:
- took items from equation.ipynb and ported here
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = {
"BNF",
"RegexInplaceParser",
"HybridExpressionParser"
}
from .BNF import BNF as BNF
from .RegexInplaceParser import RegexInplaceParser as RegexInplaceParser
from .Hybrid import HybridExpressionParser
from .Hybrid_Utils import equation_base, Core

View File

@@ -0,0 +1,21 @@
# Titan Robotics Team 2022: py2 module
# Written by Arthur Lu
# Notes:
# this module should only be used internally, contains old python 2.X functions that have been removed.
# setup:
from __future__ import division
__version__ = "1.0.0"
__changelog__ = """changelog:
1.0.0:
- added cmp function
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
def cmp(a, b):
return (a > b) - (a < b)

View File

@@ -0,0 +1,24 @@
# Titan Robotics Team 2022: Metrics submodule
# Written by Arthur Lu
# Notes:
# this should be imported as a python module using 'from tra_analysis import metrics'
# setup:
__version__ = "1.0.0"
__changelog__ = """changelog:
1.0.0:
- implemented elo, glicko2, trueskill
"""
__author__ = (
"Arthur Lu <learthurgo@gmail.com>",
)
__all__ = {
"Expression"
}
from . import elo
from . import glicko2
from . import trueskill

View File

@@ -0,0 +1,7 @@
import numpy as np
def calculate(starting_score, opposing_score, observed, N, K):
expected = 1/(1+10**((np.array(opposing_score) - starting_score)/N))
return starting_score + K*(np.sum(observed) - np.sum(expected))

View File

@@ -0,0 +1,99 @@
import math
class Glicko2:
_tau = 0.5
def getRating(self):
return (self.__rating * 173.7178) + 1500
def setRating(self, rating):
self.__rating = (rating - 1500) / 173.7178
rating = property(getRating, setRating)
def getRd(self):
return self.__rd * 173.7178
def setRd(self, rd):
self.__rd = rd / 173.7178
rd = property(getRd, setRd)
def __init__(self, rating = 1500, rd = 350, vol = 0.06):
self.setRating(rating)
self.setRd(rd)
self.vol = vol
def _preRatingRD(self):
self.__rd = math.sqrt(math.pow(self.__rd, 2) + math.pow(self.vol, 2))
def update_player(self, rating_list, RD_list, outcome_list):
rating_list = [(x - 1500) / 173.7178 for x in rating_list]
RD_list = [x / 173.7178 for x in RD_list]
v = self._v(rating_list, RD_list)
self.vol = self._newVol(rating_list, RD_list, outcome_list, v)
self._preRatingRD()
self.__rd = 1 / math.sqrt((1 / math.pow(self.__rd, 2)) + (1 / v))
tempSum = 0
for i in range(len(rating_list)):
tempSum += self._g(RD_list[i]) * \
(outcome_list[i] - self._E(rating_list[i], RD_list[i]))
self.__rating += math.pow(self.__rd, 2) * tempSum
def _newVol(self, rating_list, RD_list, outcome_list, v):
i = 0
delta = self._delta(rating_list, RD_list, outcome_list, v)
a = math.log(math.pow(self.vol, 2))
tau = self._tau
x0 = a
x1 = 0
while x0 != x1:
# New iteration, so x(i) becomes x(i-1)
x0 = x1
d = math.pow(self.__rating, 2) + v + math.exp(x0)
h1 = -(x0 - a) / math.pow(tau, 2) - 0.5 * math.exp(x0) \
/ d + 0.5 * math.exp(x0) * math.pow(delta / d, 2)
h2 = -1 / math.pow(tau, 2) - 0.5 * math.exp(x0) * \
(math.pow(self.__rating, 2) + v) \
/ math.pow(d, 2) + 0.5 * math.pow(delta, 2) * math.exp(x0) \
* (math.pow(self.__rating, 2) + v - math.exp(x0)) / math.pow(d, 3)
x1 = x0 - (h1 / h2)
return math.exp(x1 / 2)
def _delta(self, rating_list, RD_list, outcome_list, v):
tempSum = 0
for i in range(len(rating_list)):
tempSum += self._g(RD_list[i]) * (outcome_list[i] - self._E(rating_list[i], RD_list[i]))
return v * tempSum
def _v(self, rating_list, RD_list):
tempSum = 0
for i in range(len(rating_list)):
tempE = self._E(rating_list[i], RD_list[i])
tempSum += math.pow(self._g(RD_list[i]), 2) * tempE * (1 - tempE)
return 1 / tempSum
def _E(self, p2rating, p2RD):
return 1 / (1 + math.exp(-1 * self._g(p2RD) * \
(self.__rating - p2rating)))
def _g(self, RD):
return 1 / math.sqrt(1 + 3 * math.pow(RD, 2) / math.pow(math.pi, 2))
def did_not_compete(self):
self._preRatingRD()

View File

@@ -0,0 +1,907 @@
from __future__ import absolute_import
from itertools import chain
import math
from six import iteritems
from six.moves import map, range, zip
from six import iterkeys
import copy
try:
from numbers import Number
except ImportError:
Number = (int, long, float, complex)
inf = float('inf')
class Gaussian(object):
#: Precision, the inverse of the variance.
pi = 0
#: Precision adjusted mean, the precision multiplied by the mean.
tau = 0
def __init__(self, mu=None, sigma=None, pi=0, tau=0):
if mu is not None:
if sigma is None:
raise TypeError('sigma argument is needed')
elif sigma == 0:
raise ValueError('sigma**2 should be greater than 0')
pi = sigma ** -2
tau = pi * mu
self.pi = pi
self.tau = tau
@property
def mu(self):
return self.pi and self.tau / self.pi
@property
def sigma(self):
return math.sqrt(1 / self.pi) if self.pi else inf
def __mul__(self, other):
pi, tau = self.pi + other.pi, self.tau + other.tau
return Gaussian(pi=pi, tau=tau)
def __truediv__(self, other):
pi, tau = self.pi - other.pi, self.tau - other.tau
return Gaussian(pi=pi, tau=tau)
__div__ = __truediv__ # for Python 2
def __eq__(self, other):
return self.pi == other.pi and self.tau == other.tau
def __lt__(self, other):
return self.mu < other.mu
def __le__(self, other):
return self.mu <= other.mu
def __gt__(self, other):
return self.mu > other.mu
def __ge__(self, other):
return self.mu >= other.mu
def __repr__(self):
return 'N(mu={:.3f}, sigma={:.3f})'.format(self.mu, self.sigma)
def _repr_latex_(self):
latex = r'\mathcal{{ N }}( {:.3f}, {:.3f}^2 )'.format(self.mu, self.sigma)
return '$%s$' % latex
class Matrix(list):
def __init__(self, src, height=None, width=None):
if callable(src):
f, src = src, {}
size = [height, width]
if not height:
def set_height(height):
size[0] = height
size[0] = set_height
if not width:
def set_width(width):
size[1] = width
size[1] = set_width
try:
for (r, c), val in f(*size):
src[r, c] = val
except TypeError:
raise TypeError('A callable src must return an interable '
'which generates a tuple containing '
'coordinate and value')
height, width = tuple(size)
if height is None or width is None:
raise TypeError('A callable src must call set_height and '
'set_width if the size is non-deterministic')
if isinstance(src, list):
is_number = lambda x: isinstance(x, Number)
unique_col_sizes = set(map(len, src))
everything_are_number = filter(is_number, sum(src, []))
if len(unique_col_sizes) != 1 or not everything_are_number:
raise ValueError('src must be a rectangular array of numbers')
two_dimensional_array = src
elif isinstance(src, dict):
if not height or not width:
w = h = 0
for r, c in iterkeys(src):
if not height:
h = max(h, r + 1)
if not width:
w = max(w, c + 1)
if not height:
height = h
if not width:
width = w
two_dimensional_array = []
for r in range(height):
row = []
two_dimensional_array.append(row)
for c in range(width):
row.append(src.get((r, c), 0))
else:
raise TypeError('src must be a list or dict or callable')
super(Matrix, self).__init__(two_dimensional_array)
@property
def height(self):
return len(self)
@property
def width(self):
return len(self[0])
def transpose(self):
height, width = self.height, self.width
src = {}
for c in range(width):
for r in range(height):
src[c, r] = self[r][c]
return type(self)(src, height=width, width=height)
def minor(self, row_n, col_n):
height, width = self.height, self.width
if not (0 <= row_n < height):
raise ValueError('row_n should be between 0 and %d' % height)
elif not (0 <= col_n < width):
raise ValueError('col_n should be between 0 and %d' % width)
two_dimensional_array = []
for r in range(height):
if r == row_n:
continue
row = []
two_dimensional_array.append(row)
for c in range(width):
if c == col_n:
continue
row.append(self[r][c])
return type(self)(two_dimensional_array)
def determinant(self):
height, width = self.height, self.width
if height != width:
raise ValueError('Only square matrix can calculate a determinant')
tmp, rv = copy.deepcopy(self), 1.
for c in range(width - 1, 0, -1):
pivot, r = max((abs(tmp[r][c]), r) for r in range(c + 1))
pivot = tmp[r][c]
if not pivot:
return 0.
tmp[r], tmp[c] = tmp[c], tmp[r]
if r != c:
rv = -rv
rv *= pivot
fact = -1. / pivot
for r in range(c):
f = fact * tmp[r][c]
for x in range(c):
tmp[r][x] += f * tmp[c][x]
return rv * tmp[0][0]
def adjugate(self):
height, width = self.height, self.width
if height != width:
raise ValueError('Only square matrix can be adjugated')
if height == 2:
a, b = self[0][0], self[0][1]
c, d = self[1][0], self[1][1]
return type(self)([[d, -b], [-c, a]])
src = {}
for r in range(height):
for c in range(width):
sign = -1 if (r + c) % 2 else 1
src[r, c] = self.minor(r, c).determinant() * sign
return type(self)(src, height, width)
def inverse(self):
if self.height == self.width == 1:
return type(self)([[1. / self[0][0]]])
return (1. / self.determinant()) * self.adjugate()
def __add__(self, other):
height, width = self.height, self.width
if (height, width) != (other.height, other.width):
raise ValueError('Must be same size')
src = {}
for r in range(height):
for c in range(width):
src[r, c] = self[r][c] + other[r][c]
return type(self)(src, height, width)
def __mul__(self, other):
if self.width != other.height:
raise ValueError('Bad size')
height, width = self.height, other.width
src = {}
for r in range(height):
for c in range(width):
src[r, c] = sum(self[r][x] * other[x][c]
for x in range(self.width))
return type(self)(src, height, width)
def __rmul__(self, other):
if not isinstance(other, Number):
raise TypeError('The operand should be a number')
height, width = self.height, self.width
src = {}
for r in range(height):
for c in range(width):
src[r, c] = other * self[r][c]
return type(self)(src, height, width)
def __repr__(self):
return '{}({})'.format(type(self).__name__, super(Matrix, self).__repr__())
def _repr_latex_(self):
rows = [' && '.join(['%.3f' % cell for cell in row]) for row in self]
latex = r'\begin{matrix} %s \end{matrix}' % r'\\'.join(rows)
return '$%s$' % latex
def _gen_erfcinv(erfc, math=math):
def erfcinv(y):
"""The inverse function of erfc."""
if y >= 2:
return -100.
elif y <= 0:
return 100.
zero_point = y < 1
if not zero_point:
y = 2 - y
t = math.sqrt(-2 * math.log(y / 2.))
x = -0.70711 * \
((2.30753 + t * 0.27061) / (1. + t * (0.99229 + t * 0.04481)) - t)
for i in range(2):
err = erfc(x) - y
x += err / (1.12837916709551257 * math.exp(-(x ** 2)) - x * err)
return x if zero_point else -x
return erfcinv
def _gen_ppf(erfc, math=math):
erfcinv = _gen_erfcinv(erfc, math)
def ppf(x, mu=0, sigma=1):
return mu - sigma * math.sqrt(2) * erfcinv(2 * x)
return ppf
def erfc(x):
z = abs(x)
t = 1. / (1. + z / 2.)
r = t * math.exp(-z * z - 1.26551223 + t * (1.00002368 + t * (
0.37409196 + t * (0.09678418 + t * (-0.18628806 + t * (
0.27886807 + t * (-1.13520398 + t * (1.48851587 + t * (
-0.82215223 + t * 0.17087277
)))
)))
)))
return 2. - r if x < 0 else r
def cdf(x, mu=0, sigma=1):
return 0.5 * erfc(-(x - mu) / (sigma * math.sqrt(2)))
def pdf(x, mu=0, sigma=1):
return (1 / math.sqrt(2 * math.pi) * abs(sigma) *
math.exp(-(((x - mu) / abs(sigma)) ** 2 / 2)))
ppf = _gen_ppf(erfc)
def choose_backend(backend):
if backend is None: # fallback
return cdf, pdf, ppf
elif backend == 'mpmath':
try:
import mpmath
except ImportError:
raise ImportError('Install "mpmath" to use this backend')
return mpmath.ncdf, mpmath.npdf, _gen_ppf(mpmath.erfc, math=mpmath)
elif backend == 'scipy':
try:
from scipy.stats import norm
except ImportError:
raise ImportError('Install "scipy" to use this backend')
return norm.cdf, norm.pdf, norm.ppf
raise ValueError('%r backend is not defined' % backend)
def available_backends():
backends = [None]
for backend in ['mpmath', 'scipy']:
try:
__import__(backend)
except ImportError:
continue
backends.append(backend)
return backends
class Node(object):
pass
class Variable(Node, Gaussian):
def __init__(self):
self.messages = {}
super(Variable, self).__init__()
def set(self, val):
delta = self.delta(val)
self.pi, self.tau = val.pi, val.tau
return delta
def delta(self, other):
pi_delta = abs(self.pi - other.pi)
if pi_delta == inf:
return 0.
return max(abs(self.tau - other.tau), math.sqrt(pi_delta))
def update_message(self, factor, pi=0, tau=0, message=None):
message = message or Gaussian(pi=pi, tau=tau)
old_message, self[factor] = self[factor], message
return self.set(self / old_message * message)
def update_value(self, factor, pi=0, tau=0, value=None):
value = value or Gaussian(pi=pi, tau=tau)
old_message = self[factor]
self[factor] = value * old_message / self
return self.set(value)
def __getitem__(self, factor):
return self.messages[factor]
def __setitem__(self, factor, message):
self.messages[factor] = message
def __repr__(self):
args = (type(self).__name__, super(Variable, self).__repr__(),
len(self.messages), '' if len(self.messages) == 1 else 's')
return '<%s %s with %d connection%s>' % args
class Factor(Node):
def __init__(self, variables):
self.vars = variables
for var in variables:
var[self] = Gaussian()
def down(self):
return 0
def up(self):
return 0
@property
def var(self):
assert len(self.vars) == 1
return self.vars[0]
def __repr__(self):
args = (type(self).__name__, len(self.vars),
'' if len(self.vars) == 1 else 's')
return '<%s with %d connection%s>' % args
class PriorFactor(Factor):
def __init__(self, var, val, dynamic=0):
super(PriorFactor, self).__init__([var])
self.val = val
self.dynamic = dynamic
def down(self):
sigma = math.sqrt(self.val.sigma ** 2 + self.dynamic ** 2)
value = Gaussian(self.val.mu, sigma)
return self.var.update_value(self, value=value)
class LikelihoodFactor(Factor):
def __init__(self, mean_var, value_var, variance):
super(LikelihoodFactor, self).__init__([mean_var, value_var])
self.mean = mean_var
self.value = value_var
self.variance = variance
def calc_a(self, var):
return 1. / (1. + self.variance * var.pi)
def down(self):
# update value.
msg = self.mean / self.mean[self]
a = self.calc_a(msg)
return self.value.update_message(self, a * msg.pi, a * msg.tau)
def up(self):
# update mean.
msg = self.value / self.value[self]
a = self.calc_a(msg)
return self.mean.update_message(self, a * msg.pi, a * msg.tau)
class SumFactor(Factor):
def __init__(self, sum_var, term_vars, coeffs):
super(SumFactor, self).__init__([sum_var] + term_vars)
self.sum = sum_var
self.terms = term_vars
self.coeffs = coeffs
def down(self):
vals = self.terms
msgs = [var[self] for var in vals]
return self.update(self.sum, vals, msgs, self.coeffs)
def up(self, index=0):
coeff = self.coeffs[index]
coeffs = []
for x, c in enumerate(self.coeffs):
try:
if x == index:
coeffs.append(1. / coeff)
else:
coeffs.append(-c / coeff)
except ZeroDivisionError:
coeffs.append(0.)
vals = self.terms[:]
vals[index] = self.sum
msgs = [var[self] for var in vals]
return self.update(self.terms[index], vals, msgs, coeffs)
def update(self, var, vals, msgs, coeffs):
pi_inv = 0
mu = 0
for val, msg, coeff in zip(vals, msgs, coeffs):
div = val / msg
mu += coeff * div.mu
if pi_inv == inf:
continue
try:
# numpy.float64 handles floating-point error by different way.
# For example, it can just warn RuntimeWarning on n/0 problem
# instead of throwing ZeroDivisionError. So div.pi, the
# denominator has to be a built-in float.
pi_inv += coeff ** 2 / float(div.pi)
except ZeroDivisionError:
pi_inv = inf
pi = 1. / pi_inv
tau = pi * mu
return var.update_message(self, pi, tau)
class TruncateFactor(Factor):
def __init__(self, var, v_func, w_func, draw_margin):
super(TruncateFactor, self).__init__([var])
self.v_func = v_func
self.w_func = w_func
self.draw_margin = draw_margin
def up(self):
val = self.var
msg = self.var[self]
div = val / msg
sqrt_pi = math.sqrt(div.pi)
args = (div.tau / sqrt_pi, self.draw_margin * sqrt_pi)
v = self.v_func(*args)
w = self.w_func(*args)
denom = (1. - w)
pi, tau = div.pi / denom, (div.tau + sqrt_pi * v) / denom
return val.update_value(self, pi, tau)
#: Default initial mean of ratings.
MU = 25.
#: Default initial standard deviation of ratings.
SIGMA = MU / 3
#: Default distance that guarantees about 76% chance of winning.
BETA = SIGMA / 2
#: Default dynamic factor.
TAU = SIGMA / 100
#: Default draw probability of the game.
DRAW_PROBABILITY = .10
#: A basis to check reliability of the result.
DELTA = 0.0001
def calc_draw_probability(draw_margin, size, env=None):
if env is None:
env = global_env()
return 2 * env.cdf(draw_margin / (math.sqrt(size) * env.beta)) - 1
def calc_draw_margin(draw_probability, size, env=None):
if env is None:
env = global_env()
return env.ppf((draw_probability + 1) / 2.) * math.sqrt(size) * env.beta
def _team_sizes(rating_groups):
team_sizes = [0]
for group in rating_groups:
team_sizes.append(len(group) + team_sizes[-1])
del team_sizes[0]
return team_sizes
def _floating_point_error(env):
if env.backend == 'mpmath':
msg = 'Set "mpmath.mp.dps" to higher'
else:
msg = 'Cannot calculate correctly, set backend to "mpmath"'
return FloatingPointError(msg)
class Rating(Gaussian):
def __init__(self, mu=None, sigma=None):
if isinstance(mu, tuple):
mu, sigma = mu
elif isinstance(mu, Gaussian):
mu, sigma = mu.mu, mu.sigma
if mu is None:
mu = global_env().mu
if sigma is None:
sigma = global_env().sigma
super(Rating, self).__init__(mu, sigma)
def __int__(self):
return int(self.mu)
def __long__(self):
return long(self.mu)
def __float__(self):
return float(self.mu)
def __iter__(self):
return iter((self.mu, self.sigma))
def __repr__(self):
c = type(self)
args = ('.'.join([c.__module__, c.__name__]), self.mu, self.sigma)
return '%s(mu=%.3f, sigma=%.3f)' % args
class TrueSkill(object):
def __init__(self, mu=MU, sigma=SIGMA, beta=BETA, tau=TAU,
draw_probability=DRAW_PROBABILITY, backend=None):
self.mu = mu
self.sigma = sigma
self.beta = beta
self.tau = tau
self.draw_probability = draw_probability
self.backend = backend
if isinstance(backend, tuple):
self.cdf, self.pdf, self.ppf = backend
else:
self.cdf, self.pdf, self.ppf = choose_backend(backend)
def create_rating(self, mu=None, sigma=None):
if mu is None:
mu = self.mu
if sigma is None:
sigma = self.sigma
return Rating(mu, sigma)
def v_win(self, diff, draw_margin):
x = diff - draw_margin
denom = self.cdf(x)
return (self.pdf(x) / denom) if denom else -x
def v_draw(self, diff, draw_margin):
abs_diff = abs(diff)
a, b = draw_margin - abs_diff, -draw_margin - abs_diff
denom = self.cdf(a) - self.cdf(b)
numer = self.pdf(b) - self.pdf(a)
return ((numer / denom) if denom else a) * (-1 if diff < 0 else +1)
def w_win(self, diff, draw_margin):
x = diff - draw_margin
v = self.v_win(diff, draw_margin)
w = v * (v + x)
if 0 < w < 1:
return w
raise _floating_point_error(self)
def w_draw(self, diff, draw_margin):
abs_diff = abs(diff)
a, b = draw_margin - abs_diff, -draw_margin - abs_diff
denom = self.cdf(a) - self.cdf(b)
if not denom:
raise _floating_point_error(self)
v = self.v_draw(abs_diff, draw_margin)
return (v ** 2) + (a * self.pdf(a) - b * self.pdf(b)) / denom
def validate_rating_groups(self, rating_groups):
# check group sizes
if len(rating_groups) < 2:
raise ValueError('Need multiple rating groups')
elif not all(rating_groups):
raise ValueError('Each group must contain multiple ratings')
# check group types
group_types = set(map(type, rating_groups))
if len(group_types) != 1:
raise TypeError('All groups should be same type')
elif group_types.pop() is Rating:
raise TypeError('Rating cannot be a rating group')
# normalize rating_groups
if isinstance(rating_groups[0], dict):
dict_rating_groups = rating_groups
rating_groups = []
keys = []
for dict_rating_group in dict_rating_groups:
rating_group, key_group = [], []
for key, rating in iteritems(dict_rating_group):
rating_group.append(rating)
key_group.append(key)
rating_groups.append(tuple(rating_group))
keys.append(tuple(key_group))
else:
rating_groups = list(rating_groups)
keys = None
return rating_groups, keys
def validate_weights(self, weights, rating_groups, keys=None):
if weights is None:
weights = [(1,) * len(g) for g in rating_groups]
elif isinstance(weights, dict):
weights_dict, weights = weights, []
for x, group in enumerate(rating_groups):
w = []
weights.append(w)
for y, rating in enumerate(group):
if keys is not None:
y = keys[x][y]
w.append(weights_dict.get((x, y), 1))
return weights
def factor_graph_builders(self, rating_groups, ranks, weights):
flatten_ratings = sum(map(tuple, rating_groups), ())
flatten_weights = sum(map(tuple, weights), ())
size = len(flatten_ratings)
group_size = len(rating_groups)
# create variables
rating_vars = [Variable() for x in range(size)]
perf_vars = [Variable() for x in range(size)]
team_perf_vars = [Variable() for x in range(group_size)]
team_diff_vars = [Variable() for x in range(group_size - 1)]
team_sizes = _team_sizes(rating_groups)
# layer builders
def build_rating_layer():
for rating_var, rating in zip(rating_vars, flatten_ratings):
yield PriorFactor(rating_var, rating, self.tau)
def build_perf_layer():
for rating_var, perf_var in zip(rating_vars, perf_vars):
yield LikelihoodFactor(rating_var, perf_var, self.beta ** 2)
def build_team_perf_layer():
for team, team_perf_var in enumerate(team_perf_vars):
if team > 0:
start = team_sizes[team - 1]
else:
start = 0
end = team_sizes[team]
child_perf_vars = perf_vars[start:end]
coeffs = flatten_weights[start:end]
yield SumFactor(team_perf_var, child_perf_vars, coeffs)
def build_team_diff_layer():
for team, team_diff_var in enumerate(team_diff_vars):
yield SumFactor(team_diff_var,
team_perf_vars[team:team + 2], [+1, -1])
def build_trunc_layer():
for x, team_diff_var in enumerate(team_diff_vars):
if callable(self.draw_probability):
# dynamic draw probability
team_perf1, team_perf2 = team_perf_vars[x:x + 2]
args = (Rating(team_perf1), Rating(team_perf2), self)
draw_probability = self.draw_probability(*args)
else:
# static draw probability
draw_probability = self.draw_probability
size = sum(map(len, rating_groups[x:x + 2]))
draw_margin = calc_draw_margin(draw_probability, size, self)
if ranks[x] == ranks[x + 1]: # is a tie?
v_func, w_func = self.v_draw, self.w_draw
else:
v_func, w_func = self.v_win, self.w_win
yield TruncateFactor(team_diff_var,
v_func, w_func, draw_margin)
# build layers
return (build_rating_layer, build_perf_layer, build_team_perf_layer,
build_team_diff_layer, build_trunc_layer)
def run_schedule(self, build_rating_layer, build_perf_layer,
build_team_perf_layer, build_team_diff_layer,
build_trunc_layer, min_delta=DELTA):
if min_delta <= 0:
raise ValueError('min_delta must be greater than 0')
layers = []
def build(builders):
layers_built = [list(build()) for build in builders]
layers.extend(layers_built)
return layers_built
# gray arrows
layers_built = build([build_rating_layer,
build_perf_layer,
build_team_perf_layer])
rating_layer, perf_layer, team_perf_layer = layers_built
for f in chain(*layers_built):
f.down()
# arrow #1, #2, #3
team_diff_layer, trunc_layer = build([build_team_diff_layer,
build_trunc_layer])
team_diff_len = len(team_diff_layer)
for x in range(10):
if team_diff_len == 1:
# only two teams
team_diff_layer[0].down()
delta = trunc_layer[0].up()
else:
# multiple teams
delta = 0
for x in range(team_diff_len - 1):
team_diff_layer[x].down()
delta = max(delta, trunc_layer[x].up())
team_diff_layer[x].up(1) # up to right variable
for x in range(team_diff_len - 1, 0, -1):
team_diff_layer[x].down()
delta = max(delta, trunc_layer[x].up())
team_diff_layer[x].up(0) # up to left variable
# repeat until to small update
if delta <= min_delta:
break
# up both ends
team_diff_layer[0].up(0)
team_diff_layer[team_diff_len - 1].up(1)
# up the remainder of the black arrows
for f in team_perf_layer:
for x in range(len(f.vars) - 1):
f.up(x)
for f in perf_layer:
f.up()
return layers
def rate(self, rating_groups, ranks=None, weights=None, min_delta=DELTA):
rating_groups, keys = self.validate_rating_groups(rating_groups)
weights = self.validate_weights(weights, rating_groups, keys)
group_size = len(rating_groups)
if ranks is None:
ranks = range(group_size)
elif len(ranks) != group_size:
raise ValueError('Wrong ranks')
# sort rating groups by rank
by_rank = lambda x: x[1][1]
sorting = sorted(enumerate(zip(rating_groups, ranks, weights)),
key=by_rank)
sorted_rating_groups, sorted_ranks, sorted_weights = [], [], []
for x, (g, r, w) in sorting:
sorted_rating_groups.append(g)
sorted_ranks.append(r)
# make weights to be greater than 0
sorted_weights.append(max(min_delta, w_) for w_ in w)
# build factor graph
args = (sorted_rating_groups, sorted_ranks, sorted_weights)
builders = self.factor_graph_builders(*args)
args = builders + (min_delta,)
layers = self.run_schedule(*args)
# make result
rating_layer, team_sizes = layers[0], _team_sizes(sorted_rating_groups)
transformed_groups = []
for start, end in zip([0] + team_sizes[:-1], team_sizes):
group = []
for f in rating_layer[start:end]:
group.append(Rating(float(f.var.mu), float(f.var.sigma)))
transformed_groups.append(tuple(group))
by_hint = lambda x: x[0]
unsorting = sorted(zip((x for x, __ in sorting), transformed_groups),
key=by_hint)
if keys is None:
return [g for x, g in unsorting]
# restore the structure with input dictionary keys
return [dict(zip(keys[x], g)) for x, g in unsorting]
def quality(self, rating_groups, weights=None):
rating_groups, keys = self.validate_rating_groups(rating_groups)
weights = self.validate_weights(weights, rating_groups, keys)
flatten_ratings = sum(map(tuple, rating_groups), ())
flatten_weights = sum(map(tuple, weights), ())
length = len(flatten_ratings)
# a vector of all of the skill means
mean_matrix = Matrix([[r.mu] for r in flatten_ratings])
# a matrix whose diagonal values are the variances (sigma ** 2) of each
# of the players.
def variance_matrix(height, width):
variances = (r.sigma ** 2 for r in flatten_ratings)
for x, variance in enumerate(variances):
yield (x, x), variance
variance_matrix = Matrix(variance_matrix, length, length)
# the player-team assignment and comparison matrix
def rotated_a_matrix(set_height, set_width):
t = 0
for r, (cur, _next) in enumerate(zip(rating_groups[:-1],
rating_groups[1:])):
for x in range(t, t + len(cur)):
yield (r, x), flatten_weights[x]
t += 1
x += 1
for x in range(x, x + len(_next)):
yield (r, x), -flatten_weights[x]
set_height(r + 1)
set_width(x + 1)
rotated_a_matrix = Matrix(rotated_a_matrix)
a_matrix = rotated_a_matrix.transpose()
# match quality further derivation
_ata = (self.beta ** 2) * rotated_a_matrix * a_matrix
_atsa = rotated_a_matrix * variance_matrix * a_matrix
start = mean_matrix.transpose() * a_matrix
middle = _ata + _atsa
end = rotated_a_matrix * mean_matrix
# make result
e_arg = (-0.5 * start * middle.inverse() * end).determinant()
s_arg = _ata.determinant() / middle.determinant()
return math.exp(e_arg) * math.sqrt(s_arg)
def expose(self, rating):
k = self.mu / self.sigma
return rating.mu - k * rating.sigma
def make_as_global(self):
return setup(env=self)
def __repr__(self):
c = type(self)
if callable(self.draw_probability):
f = self.draw_probability
draw_probability = '.'.join([f.__module__, f.__name__])
else:
draw_probability = '%.1f%%' % (self.draw_probability * 100)
if self.backend is None:
backend = ''
elif isinstance(self.backend, tuple):
backend = ', backend=...'
else:
backend = ', backend=%r' % self.backend
args = ('.'.join([c.__module__, c.__name__]), self.mu, self.sigma,
self.beta, self.tau, draw_probability, backend)
return ('%s(mu=%.3f, sigma=%.3f, beta=%.3f, tau=%.3f, '
'draw_probability=%s%s)' % args)
def rate_1vs1(rating1, rating2, drawn=False, min_delta=DELTA, env=None):
if env is None:
env = global_env()
ranks = [0, 0 if drawn else 1]
teams = env.rate([(rating1,), (rating2,)], ranks, min_delta=min_delta)
return teams[0][0], teams[1][0]
def quality_1vs1(rating1, rating2, env=None):
if env is None:
env = global_env()
return env.quality([(rating1,), (rating2,)])
def global_env():
try:
global_env.__trueskill__
except AttributeError:
# setup the default environment
setup()
return global_env.__trueskill__
def setup(mu=MU, sigma=SIGMA, beta=BETA, tau=TAU,
draw_probability=DRAW_PROBABILITY, backend=None, env=None):
if env is None:
env = TrueSkill(mu, sigma, beta, tau, draw_probability, backend)
global_env.__trueskill__ = env
return env
def rate(rating_groups, ranks=None, weights=None, min_delta=DELTA):
return global_env().rate(rating_groups, ranks, weights, min_delta)
def quality(rating_groups, weights=None):
return global_env().quality(rating_groups, weights)
def expose(rating):
return global_env().expose(rating)

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,16 +0,0 @@
import random
def generate(filename, x, y, low, high):
file = open(filename, "w")
for i in range (0, y, 1):
temp = ""
for j in range (0, x - 1, 1):
temp = str(random.uniform(low, high)) + "," + temp
temp = temp + str(random.uniform(low, high))
file.write(temp + "\n")

View File

@@ -1,28 +0,0 @@
import os
import json
import ordereddict
import collections
import unicodecsv
content = open("realtimeDatabaseExport2018.json").read()
dict_content = json.loads(content)
list_of_new_data = []
for datak, datav in dict_content.iteritems():
for teamk, teamv in datav["teams"].iteritems():
for matchk, matchv in teamv.iteritems():
for detailk, detailv in matchv.iteritems():
new_data = collections.OrderedDict(detailv)
new_data["uuid"] = detailk
new_data["match"] = matchk
new_data["team"] = teamk
list_of_new_data.append(new_data)
allkey = reduce(lambda x, y: x.union(y.keys()), list_of_new_data, set())
output_file = open('realtimeDatabaseExport2018.csv', 'wb')
dict_writer = unicodecsv.DictWriter(csvfile=output_file, fieldnames=allkey)
dict_writer.writerow(dict((fn,fn) for fn in dict_writer.fieldnames))
dict_writer.writerows(list_of_new_data)
output_file.close()