mirror of
https://github.com/titanscouting/tra-analysis.git
synced 2024-11-10 06:54:44 +00:00
9f71ab3aad
* 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>
424 lines
7.0 KiB
Python
424 lines
7.0 KiB
Python
# 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) |