@ -0,0 +1,23 @@ | |||
from torch import nn | |||
class BasicNeuralNet(nn.Module): | |||
def __init__(self): | |||
super().__init__() | |||
# Inputs to hidden layer linear transformation | |||
self.hidden = nn.Linear(784, 256) | |||
# Output layer, 10 units | |||
self.output = nn.Linear(256, 10) | |||
# Define sigmoid activation and softmax output | |||
self.sigmoid = nn.Sigmoid() | |||
self.softmax = nn.Softmax(dim=1) | |||
def forward(self, x): | |||
# Pass the input tensor through each of the operations | |||
x = self.hidden(x) | |||
x = self.sigmoid(x) | |||
x = self.output(x) | |||
x = self.softmax(x) | |||
return x |
@ -0,0 +1,16 @@ | |||
import torch.nn as nn | |||
import torch.nn.functional as F | |||
# CNN architecture definition | |||
class Net(nn.Module): | |||
def __init__(self): | |||
super(Net, self).__init__() | |||
# convolutional layer | |||
self.conv1 = nn.Conv2d(3, 16, 3, padding=1) | |||
# max pooling layer | |||
self.pool = nn.MaxPool2d(2, 2) | |||
def forward(self, x): | |||
# add sequence of convolutional and max pooling layers | |||
x = self.pool(F.relu(self.conv1(x))) | |||
return x |
@ -0,0 +1,342 @@ | |||
""" | |||
:Author: James Sherratt | |||
:Date: 21/10/2019 | |||
:License: MIT | |||
:name: DecisionTree.py | |||
Basic implementation of a binary decision tree algorithm, with one | |||
discriminant per node. | |||
Useful links: | |||
https://scikit-learn.org/stable/modules/tree.html | |||
https://en.wikipedia.org/wiki/Decision_tree | |||
""" | |||
import numpy as np | |||
from sklearn import datasets | |||
def proportion_k(ym): | |||
""" | |||
Get the proportions of each class in the current set of values. | |||
:param ym: y values (class) of the data at a given node. | |||
:return: list containing the classes and the fraction of those classes present. | |||
""" | |||
counts = list(np.unique(ym, return_counts=True)) | |||
counts[1] = counts[1]/(ym.shape[0]) | |||
return counts | |||
def gini(k_proportions): | |||
""" | |||
Gini impurity function. This is used to determine the impurity of a given | |||
set of data, given the proportions of the classes in the dataset. | |||
This is equivalent to: | |||
H = ∑ pk(1-pk) for all k classes. | |||
k_proportions, in this case, is an array of pk's | |||
:param k_proportions: array containing proportions of different classes. Proportions sum to 1. | |||
:return: the impurity of the dataset. | |||
""" | |||
return (k_proportions*(1-k_proportions)).sum() | |||
def node_impurity(ym): | |||
""" | |||
Calculate the impurity of data on one side of node after split. | |||
:param ym: Actual y data for the selected dataset. | |||
:return: dict containing the impurity value of the side and the most common class on that side. | |||
""" | |||
if ym.shape[0] == 0: | |||
return {"impurity": 0, "max_class": 0} | |||
k_prop = proportion_k(ym) | |||
return {"impurity": gini(k_prop[1]), "max_class": k_prop[0][np.argmax(k_prop[1])]} | |||
def disc_val_impurity(yleft, yright): | |||
""" | |||
Calculate the level of impurity left in the given data after splitting. This returns | |||
a dict which contains: | |||
- The impurity of the data after being split. | |||
- The class of the largest proportion on the left and right side of the split. | |||
The aim is to find a split which minimises impurity. | |||
The impurity calculated is: | |||
G = (nleft/ntot)*Hleft + (nright/ntot)*Hright | |||
This gives the impurity of the split data. | |||
:param yleft: Real/ training y values for the data on the left. | |||
:param yright: Real/ training y values for the data on the right. | |||
:return: Dict containing the data impurity after split and the most common class on the left and right of the split. | |||
""" | |||
nleft = yleft.shape[0] | |||
nright = yright.shape[0] | |||
ntot = nleft + nright | |||
left_imp = node_impurity(yleft) | |||
right_imp = node_impurity(yright) | |||
return { | |||
"impurity": ((nleft/ntot)*left_imp["impurity"])+((nright/ntot)*right_imp["impurity"]), | |||
"lmax_class": left_imp["max_class"], | |||
"rmax_class": right_imp["max_class"] | |||
} | |||
def niave_min_impurity(xm, ym): | |||
""" | |||
Find a discriminator which minimises the impurity of the data. The discriminator | |||
is used to split data at a node. | |||
This works by: | |||
1. Selecting a data column as a discriminator. | |||
2. Splitting the possible values of the discriminator into 1000 even spaced values | |||
(between the minimum and maximum value in the dataset). | |||
3. Selecting the discriminator column + value which minimises the impurity. | |||
:param xm: Data on the left. | |||
:param ym: Data on the right. | |||
:return: dict containing the current niave minimum impurity. | |||
""" | |||
minxs = xm.min(axis=0) | |||
maxxs = xm.max(axis=0) | |||
# discriminator with the smallest impurity. | |||
cur_min_disc = None | |||
# Choose a column to discriminate by. | |||
for x_idx, (dmin, dmax) in enumerate(zip(minxs, maxxs)): | |||
# Create a set of possibly values to use as the discriminator for that column. | |||
disc_vals = np.linspace(dmin, dmax, 1000) | |||
for disc_val in disc_vals: | |||
selection = xm[:, x_idx] < disc_val | |||
yleft = ym[selection] | |||
yright = ym[selection==False] | |||
# Calculate impurity. | |||
imp = disc_val_impurity(yleft, yright) | |||
# Choose a column with the smallest impurity. | |||
try: | |||
if cur_min_disc["impurity"] > imp["impurity"]: | |||
imp["discriminator"] = x_idx | |||
imp["val"] = disc_val | |||
cur_min_disc = imp | |||
except TypeError: | |||
imp["discriminator"] = x_idx | |||
imp["val"] = disc_val | |||
cur_min_disc = imp | |||
return cur_min_disc | |||
class BinaryTreeClassifier: | |||
def __init__(self, max_depth=4, min_data=5): | |||
""" | |||
Initialise the binary decision tree classifier. This classifier works by: | |||
- Splitting the data into 2 sets at every node. | |||
- These 2 sets are then split into 2 more sets at their nodes etc. until they reach a leaf. | |||
- At the leaves, the data is classified into whatever class was "most common" in that leaf during training. | |||
:param max_depth: The maximum depth the binary tree classifier goes to. | |||
:param min_data: The minimum sample size of the training data before the tree stops splitting. | |||
""" | |||
tree = dict() | |||
self.depth = max_depth | |||
self.min_data = min_data | |||
def _node_mask(X, node): | |||
""" | |||
Get the discriminator mask for the node. This splits the data into left and right components. | |||
:param X: dataset input data. | |||
:param node: the current node of the tree, with its discriminator value. | |||
:return: truth array, which splits data left and right. | |||
""" | |||
return X[:, node["discriminator"]] < node["val"] | |||
def _apply_disc(X, y, node): | |||
""" | |||
Apply the discriminator to the data at a given node. | |||
:param X: dataset input. | |||
:param y: dataset (observed) output. | |||
:param node: The node to split data by. | |||
:return: The x and y data, split left and right. | |||
""" | |||
left_cond = BinaryTreeClassifier._node_mask(X, node) | |||
right_cond = left_cond == False | |||
left_X, left_y = X[left_cond], y[left_cond] | |||
right_X, right_y = X[right_cond], y[right_cond] | |||
return left_X, left_y, right_X, right_y | |||
def _tree_node(X, y, max_depth, min_data): | |||
""" | |||
Create a tree node. This also creates child nodes of this node recursively. | |||
:param X: input data for the dataset at a node. | |||
:param y: output (observed) data for the dataset at a node. | |||
:param max_depth: The maximum depth of the tree from this node. | |||
:param min_data: The minimum amount of data which can be discriminated. | |||
:return: The node + its children, as a dict. | |||
""" | |||
# Get the new node, as a dict. | |||
node = niave_min_impurity(X, y) | |||
# Split the data using the discriminator. | |||
left_X, left_y, right_X, right_y = BinaryTreeClassifier._apply_disc(X, y, node) | |||
if max_depth > 1: | |||
if left_X.shape[0] >= min_data: | |||
# Create a new node on the left (recursively) if max depth | |||
# and min data have not been reached. | |||
node["left"] = BinaryTreeClassifier._tree_node(left_X, left_y, max_depth-1, min_data) | |||
if right_X.shape[0] >= min_data: | |||
# Create a new node on the right (recursively) if max depth | |||
# and min data have not been reached. | |||
node["right"] = BinaryTreeClassifier._tree_node(right_X, right_y, max_depth-1, min_data) | |||
return node | |||
def _run_tree(X, node): | |||
""" | |||
Run a node of the classifier, recurisively. | |||
:param node: The node to run on the data. | |||
:return: The classified y (expected) data. | |||
""" | |||
# Setup y array. | |||
y = np.zeros(X.shape[0]) | |||
# Get the discriminator left conditional. | |||
left_cond = BinaryTreeClassifier._node_mask(X, node) | |||
# Right conditional | |||
right_cond = left_cond == False | |||
try: | |||
# Try to split the data further on the left side. | |||
y[left_cond] = BinaryTreeClassifier._run_tree(X[left_cond], node["left"]) | |||
except KeyError: | |||
# If we cannot split any further, get the class of the data on the left (as this is a leaf). | |||
y[left_cond] = node["lmax_class"] | |||
try: | |||
# Try to split the data further on the right side. | |||
y[right_cond] = BinaryTreeClassifier._run_tree(X[right_cond], node["right"]) | |||
except KeyError: | |||
# If we cannot split any further, get the class of the data on the right (as this is a leaf). | |||
y[right_cond] = node["rmax_class"] | |||
return y | |||
def _node_dict(node, idx=0): | |||
""" | |||
Get a dict of all the nodes, recursively. The keys are the index of an array, | |||
as if the array is a heap. | |||
:param node: The current node to add to the dict and to get children of recursively. | |||
:param idx: current index (key) of the node. | |||
:return: dict containing all the nodes retrieved. | |||
""" | |||
# Current nodes. | |||
nodes = {} | |||
node_data = {"lmax_class": node["lmax_class"], | |||
"rmax_class": node["rmax_class"], | |||
"discriminator": node["discriminator"], | |||
"val": node["val"]} | |||
nodes[idx] = node_data | |||
# Try to get the left nodes. | |||
try: | |||
left_idx = 2 * idx + 1 | |||
nodes.update(BinaryTreeClassifier._node_dict(node["left"], left_idx)) | |||
except KeyError: | |||
pass | |||
# Try to get the right nodes. | |||
try: | |||
right_idx = 2 * idx + 2 | |||
nodes.update(BinaryTreeClassifier._node_dict(node["right"], right_idx)) | |||
except KeyError: | |||
pass | |||
# return the dict of nodes retrieved. | |||
return nodes | |||
def build_tree(self, X, y): | |||
""" | |||
Build (train) the decision tree classifier. | |||
:param X: input training data. | |||
:param y: output training (observed) data. | |||
:return: None | |||
""" | |||
self.tree = BinaryTreeClassifier._tree_node(X, y, self.depth, self.min_data) | |||
def classify(self, X): | |||
""" | |||
Classify some data using the tree. | |||
:param X: Input data. | |||
:return: output (expected) classes of the data, or y values, for the given input. | |||
""" | |||
return BinaryTreeClassifier._run_tree(X, self.tree) | |||
def tree_to_heap_array(self): | |||
""" | |||
Convert the tree to a binary heap, stored in an array with standard indexing. | |||
i.e. a node at index i has children at 2i*1 and 2i+2 and a parent at (i-1)//2. | |||
:return: list containing the tree nodes. | |||
""" | |||
tree_dict = BinaryTreeClassifier._node_dict(self.tree) | |||
return [tree_dict[key] for key in sorted(tree_dict.keys())] | |||
def shuffle_split(x, y, frac=0.6): | |||
""" | |||
Shuffle and split X and y data. "frac" is the ratio of the split. | |||
e.g. 0.6 means 60% of the data goes into the left fraction, 40% into the right. | |||
Note X and y are shuffled the same, so row i in X data is still matched with row i in y after shuffle. | |||
:param x: X values of the data (predictor). | |||
:param y: y values of the data (observation). | |||
:param frac: fraction to split data by. | |||
:return: x1, y1, x2, y2 data where x1, y1 is the left fraction and x2, y2 is the right. | |||
""" | |||
data_idx = np.arange(x.shape[0]) | |||
sample1 = data_idx < (data_idx.max()*frac) | |||
np.random.shuffle(data_idx) | |||
np.random.shuffle(sample1) | |||
sample2 = sample1 == False | |||
x1, y1 = x[data_idx[sample1]], y[data_idx[sample1]] | |||
x2, y2 = x[data_idx[sample2]], y[data_idx[sample2]] | |||
return x1, y1, x2, y2 | |||
if __name__ == "__main__": | |||
# Set the seed for expected test results. | |||
np.random.seed(10) | |||
# Test decision tree with iris data. | |||
iris_data = datasets.load_iris() | |||
X = iris_data["data"] | |||
y = iris_data["target"] | |||
# Split iris data into test and train. | |||
X_train, y_train, X_test, y_test = shuffle_split(X, y) | |||
# create the decision tree classifier. | |||
classifier = BinaryTreeClassifier() | |||
# Train the classifier. | |||
classifier.build_tree(X_train, y_train) | |||
# Get the result when the classifier is applied to to the test data. | |||
result = classifier.classify(X_test) | |||
# Get the accuracy of the classifier. | |||
# accuracy = (number of correct results)/(total number of results) | |||
print("accuracy:", (result == y_test).sum()/(result.shape[0])) | |||
# convert the tree into a heap array. | |||
tree_arr = classifier.tree_to_heap_array() | |||
print("heap:") | |||
for i, node in enumerate(tree_arr): | |||
print(i, node) |
@ -0,0 +1,29 @@ | |||
import re as clear | |||
class process(): | |||
def master_clean_text(text): | |||
#clean up all the html tags | |||
text = clear.sub(r'<.*?>','',text) | |||
#remove the unwanted punctation chars | |||
text = clear.sub(r"\\","",text) | |||
text = clear.sub(r"\'","",text) | |||
text = clear.sub(r"\"","",text) | |||
# coversion to lowercase to remove complexity | |||
text = text.strip().lower() | |||
#removing unwanted expressions | |||
unwanted = '!"\'#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n' | |||
convert = dict((c," ") for c in unwanted) | |||
# str.maketrans() --->> creates a one to one mapping of a character to its translation/replacement. | |||
mapping_trans = str.maketrans(convert) | |||
text = text.translate(mapping_trans) | |||
return text | |||
#master_clean_text("<a> Say youre scrapping a text from you'r website !! WEll it might be swap CASE or unevened you wanna remove all the punctation's into separate WOrd !!!!</a>").split() |
@ -0,0 +1,41 @@ | |||
import numpy as np | |||
class Perceptron(object): | |||
"""Implements a perceptron network""" | |||
def __init__(self, input_size, lr=1, epochs=100): | |||
self.W = np.zeros(input_size+1) | |||
# add one for bias | |||
self.epochs = epochs | |||
self.lr = lr | |||
#activation function | |||
def activation_fn(self, x): | |||
#return (x >= 0).astype(np.float32) | |||
return 1 if x >= 0 else 0 | |||
#we need a prediction function to run an input through the perceptron and return an output. | |||
def predict(self, x): | |||
z = self.W.T.dot(x) | |||
a = self.activation_fn(z) | |||
return a | |||
def fit(self, X, d): | |||
for _ in range(self.epochs): | |||
for i in range(d.shape[0]): | |||
x = np.insert(X[i], 0, 1) | |||
y = self.predict(x) | |||
e = d[i] - y | |||
self.W = self.W + self.lr * e * x | |||
#the easiset set of data that we can provide is the AND gate. Given is set of inputs and outputs. | |||
if __name__ == '__main__': | |||
X = np.array([ | |||
[0, 0], | |||
[0, 1], | |||
[1, 0], | |||
[1, 1] | |||
]) | |||
d = np.array([0, 0, 0, 1]) | |||
perceptron = Perceptron(input_size=2) | |||
perceptron.fit(X, d) | |||
print(perceptron.W) |
@ -0,0 +1,41 @@ | |||
import numpy as np | |||
class Perceptron(object): | |||
"""Implements a perceptron network""" | |||
def __init__(self, input_size, lr=1, epochs=100): | |||
self.W = np.zeros(input_size+1) | |||
# add one for bias | |||
self.epochs = epochs | |||
self.lr = lr | |||
#activation function | |||
def activation_fn(self, x): | |||
#return (x >= 0).astype(np.float32) | |||
return 1 if x >= 0 else 0 | |||
#we need a prediction function to run an input through the perceptron and return an output. | |||
def predict(self, x): | |||
z = self.W.T.dot(x) | |||
a = self.activation_fn(z) | |||
return a | |||
def fit(self, X, d): | |||
for _ in range(self.epochs): | |||
for i in range(d.shape[0]): | |||
x = np.insert(X[i], 0, 1) | |||
y = self.predict(x) | |||
e = d[i] - y | |||
self.W = self.W + self.lr * e * x | |||
#the easiset set of data that we can provide is the AND gate. Given is set of inputs and outputs. | |||
if __name__ == '__main__': | |||
X = np.array([ | |||
[0, 0], | |||
[0, 1], | |||
[1, 0], | |||
[1, 1] | |||
]) | |||
d = np.array([0, 0, 0, 1]) | |||
perceptron = Perceptron(input_size=2) | |||
perceptron.fit(X, d) | |||
print(perceptron.W) |
@ -0,0 +1,41 @@ | |||
import shutil | |||
from shutil import copyfile | |||
copyfile(src = "../input/cleantext/cleantext.py", dst = "../working/cleantext.py") | |||
# import all our functions | |||
from cleantext import * | |||
#!pylint cleantext | |||
import pandas as pd | |||
from sklearn.feature_extraction.text import CountVectorizer | |||
training = [ | |||
" I am master of all", | |||
"I am a absolute learner" | |||
] | |||
generalization = [ | |||
"I am absolute learner learner" | |||
] | |||
vectorization = CountVectorizer( | |||
stop_words = "english", | |||
preprocessor = process.master_clean_text) | |||
vectorization.fit(training) | |||
build_vocab = { | |||
value:key | |||
for key , value in vectorization.vocabulary_.items() | |||
} | |||
vocab = [build_vocab[i] for i in range(len(build_vocab))] | |||
pd.DataFrame( | |||
data = vectorization.transform(generalization).toarray(), | |||
index=["generalization"], | |||
columns=vocab | |||
) |
@ -0,0 +1,63 @@ | |||
# Python3 Program to print BFS traversal | |||
from collections import defaultdict | |||
# This class represents a directed graph | |||
# using adjacency list representation | |||
class Graph: | |||
# Constructor | |||
def __init__(self): | |||
# default dictionary to store graph | |||
self.graph = defaultdict(list) | |||
# function to add an edge to graph | |||
def addEdge(self,u,v): | |||
self.graph[u].append(v) | |||
# Function to print a BFS of graph | |||
def BFS(self, s): | |||
# Mark all the vertices as not visited | |||
visited = [False] * (len(self.graph)) | |||
# Create a queue for BFS | |||
queue = [] | |||
# Mark the source node as | |||
# visited and enqueue it | |||
queue.append(s) | |||
visited[s] = True | |||
while queue: | |||
# Dequeue a vertex from | |||
# queue and print it | |||
s = queue.pop(0) | |||
print (s, end = " ") | |||
# Get all adjacent vertices of the | |||
# dequeued vertex s. If a adjacent | |||
# has not been visited, then mark it | |||
# visited and enqueue it | |||
for i in self.graph[s]: | |||
if visited[i] == False: | |||
queue.append(i) | |||
visited[i] = True | |||
# Driver code | |||
g = Graph() | |||
g.addEdge(0, 1) | |||
g.addEdge(0, 2) | |||
g.addEdge(1, 2) | |||
g.addEdge(2, 0) | |||
g.addEdge(2, 3) | |||
g.addEdge(3, 3) | |||
print ("Following is Breadth First Traversal" | |||
" (starting from vertex 2)") | |||
g.BFS(2) | |||
@ -0,0 +1,120 @@ | |||
" sets spell check to be enabled to files which | |||
" end with either .md or .txt | |||
" | |||
" To get auto complete type z= when you are | |||
" over the word. | |||
autocmd BufRead,BufNewFile *.md setlocal spell spelllang=en_us | |||
autocmd BufRead,BufNewFile *.txt setlocal spell spelllang=en_us | |||
""" Indentation and Tabs """ | |||
"file based indentation | |||
filetype plugin indent on | |||
"copy indentation from current line when making a new line | |||
set autoindent | |||
" Smart indentation when programming: indent after { | |||
set smartindent | |||
set tabstop=4 " number of spaces per tab | |||
set expandtab " convert tabs to spaces | |||
set shiftwidth=4 " set a tab press equal to 4 spaces | |||
""" Looks and Appearance""" | |||
" Enable syntax highlighting | |||
syntax enable | |||
" Enable 256 colors palette in Gnome Terminal | |||
if $COLORTERM == 'gnome-terminal' | |||
set t_Co=256 | |||
endif | |||
try | |||
colorscheme desert | |||
catch | |||
endtry | |||
set background=dark | |||
" Set extra options when running in GUI mode | |||
if has("gui_running") | |||
set guioptions-=T | |||
set guioptions-=e | |||
set t_Co=256 | |||
set guitablabel=%M\ %t | |||
endif | |||
" File Encodings | |||
" Set utf8 as standard encoding and en_US as the standard language | |||
set encoding=utf8 | |||
" Use Unix as the standard file type | |||
set ffs=unix,dos,mac | |||
" Productivity | |||
" Set Line Numbers to show | |||
set number | |||
" Highlights the current line with a underscore | |||
set cursorline | |||
" Displays a red bar at 80 characters | |||
set colorcolumn=80 | |||
" Shows a auto complete tab when you are typing a command | |||
" like :sp <tab> | |||
set wildmenu | |||
" sets the size of the status bar at bottom to have a height of two | |||
set laststatus=2 | |||
" Searching when in command mode type /words to find | |||
" search as characters are entered | |||
set incsearch | |||
" highlight matched characters | |||
set hlsearch | |||
" Ignore case when searching | |||
set ignorecase | |||
"Disable ding sound on error, flashes cursor instead | |||
set visualbell | |||
" Display ruler on bottom right -- should be there by default | |||
set ruler | |||
" Enables mouse support | |||
set mouse=a | |||
" Auto updates file if an external source edits the file | |||
set autoread | |||
" Improves performance by only redrawing screen when needed | |||
set lazyredraw | |||
" Copy and paste | |||
" Selection | |||
" v and arrows select characters | |||
" V select entire lines | |||
" d on something selected cuts it -- also used for delete | |||
" y = yank = copy | |||
" P paste before cursor | |||
" p paste after cursor | |||
" Basic Vim navigation | |||
" :sp file -- this will open a new file horizontally | |||
" :vsp file -- will open a file splitting vertically | |||
" ctrl-w w -- this will toggle to another open vim window |
@ -0,0 +1,58 @@ | |||
# Python3 program to print DFS traversal | |||
from collections import defaultdict | |||
# This class represents a directed graph using | |||
# adjacency list representation | |||
class Graph: | |||
# Constructor | |||
def __init__(self): | |||
# default dictionary to store graph | |||
self.graph = defaultdict(list) | |||
def addEdge(self, u, v): | |||
self.graph[u].append(v) | |||
# A function used by DFS | |||
def DFSUtil(self, v, visited): | |||
# Mark the current node as visited | |||
# and print it | |||
visited[v] = True | |||
print(v, end = ' ') | |||
# Recur for all the vertices | |||
# adjacent to this vertex | |||
for i in self.graph[v]: | |||
if visited[i] == False: | |||
self.DFSUtil(i, visited) | |||
# The function to do DFS traversal. It uses | |||
# recursive DFSUtil() | |||
def DFS(self, v): | |||
# Mark all the vertices as not visited | |||
visited = [False] * (len(self.graph)) | |||
# Call the recursive helper function | |||
# to print DFS traversal | |||
self.DFSUtil(v, visited) | |||
# Driver code | |||
# Create a graph given | |||
# in the above diagram | |||
g = Graph() | |||
g.addEdge(0, 1) | |||
g.addEdge(0, 2) | |||
g.addEdge(1, 2) | |||
g.addEdge(2, 0) | |||
g.addEdge(2, 3) | |||
g.addEdge(3, 3) | |||
print("Following is DFS from (starting from vertex 2)") | |||
g.DFS(2) | |||
@ -0,0 +1,579 @@ | |||
<html> | |||
<head> | |||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> | |||
<script | |||
src="https://code.jquery.com/jquery-3.3.1.slim.min.js" | |||
integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" | |||
crossorigin="anonymous"> | |||
</script> | |||
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> | |||
<script> | |||
class Gene | |||
{ | |||
/** | |||
* Constructs a new Gene to store in a chromosome. | |||
* @param min minimum value that this gene can store | |||
* @param max value this gene can possibly be | |||
* @param value normalized value | |||
*/ | |||
constructor(min, max, value) | |||
{ | |||
this.min = min; | |||
this.max = max; | |||
this.value = value; | |||
} | |||
/** | |||
* De-normalizes the value of the gene | |||
* @returns {*} | |||
*/ | |||
getRealValue() | |||
{ | |||
return (this.max - this.min) * this.value + this.min; | |||
} | |||
getValue() | |||
{ | |||
return this.value; | |||
} | |||
setValue(val) | |||
{ | |||
this.value = val; | |||
} | |||
makeClone() | |||
{ | |||
return new Gene(this.min, this.max, this.value); | |||
} | |||
makeRandomGene() | |||
{ | |||
return new Gene(this.min, this.max, Math.random()); | |||
} | |||
} | |||
class Chromosome | |||
{ | |||
/** | |||
* Constructs a chromosome by making a copy of | |||
* a list of genes. | |||
* @param geneArray | |||
*/ | |||
constructor(geneArray) | |||
{ | |||
this.genes = []; | |||
for(let i = 0; i < geneArray.length; i++) | |||
{ | |||
this.genes.push(geneArray[i].makeClone()); | |||
} | |||
} | |||
getGenes() | |||
{ | |||
return this.genes; | |||
} | |||
/** | |||
* Mutates a random gene. | |||
*/ | |||
mutate() | |||
{ | |||
this.genes[Math.round(Math.random() * (this.genes.length-1))].setValue(Math.random()); | |||
} | |||
/** | |||
* Creates a totally new chromosome with same | |||
* genetic structure as this chromosome but different | |||
* values. | |||
* @returns {Chromosome} | |||
*/ | |||
createRandomChromosome() | |||
{ | |||
let geneAr = []; | |||
for(let i = 0; i < this.genes.length; i++) | |||
{ | |||
geneAr.push(this.genes[i].makeRandomGene()); | |||
} | |||
return new Chromosome(geneAr); | |||
} | |||
} | |||
/** | |||
* Mates two chromosomes using the blending method | |||
* and returns a list of 2 offspring. | |||
* @param father | |||
* @param mother | |||
* @returns {Chromosome[]} | |||
*/ | |||
const breed = function(father, mother) | |||
{ | |||
let son = new Chromosome(father.getGenes()); | |||
let daughter = new Chromosome(mother.getGenes()); | |||
for(let i = 0;i < son.getGenes().length; i++) | |||
{ | |||
let blendCoef = Math.random(); | |||
blendGene(son.getGenes()[i], daughter.getGenes()[i], blendCoef); | |||
} | |||
return [son, daughter]; | |||
}; | |||
/** | |||
* Blends two genes together based on a random blend | |||
* coefficient. | |||
**/ | |||
const blendGene = function(gene1, gene2, blendCoef) | |||
{ | |||
let value1 = (blendCoef * gene1.getValue()) + | |||
(gene2.getValue() * (1- blendCoef)); | |||
let value2 = ((1-blendCoef) * gene1.getValue()) + | |||
(gene2.getValue() * blendCoef); | |||
gene1.setValue(value1); | |||
gene2.setValue(value2); | |||
}; | |||
/** | |||
* Helper function to sort an array | |||
* | |||
* @param prop name of JSON property to sort by | |||
* @returns {function(*, *): number} | |||
*/ | |||
function predicateBy(prop) | |||
{ | |||
return function(a,b) | |||
{ | |||
var result; | |||
if(a[prop] > b[prop]) | |||
{ | |||
result = 1; | |||
} | |||
else if(a[prop] < b[prop]) | |||
{ | |||
result = -1; | |||
} | |||
return result; | |||
} | |||
} | |||
/** | |||
* Function which computes the fitness of everyone in the | |||
* population and returns the most fit survivors. Method | |||
* known as elitism. | |||
* | |||
* @param population | |||
* @param keepNumber | |||
* @param fitnessFunction | |||
* @returns {{average: number, | |||
* survivors: Array, bestFit: Chromosome }} | |||
*/ | |||
const naturalSelection = function(population, keepNumber, fitnessFunction) | |||
{ | |||
let fitnessArray = []; | |||
let total = 0; | |||
for(let i = 0; i < population.length; i++) | |||
{ | |||
const fitness = fitnessFunction(population[i]); | |||
console.log(fitness); | |||
fitnessArray.push({fit:fitness, chrom: population[i]}); | |||
total+= fitness; | |||
} | |||
fitnessArray.sort(predicateBy("fit")); | |||
let survivors = []; | |||
let bestFitness = fitnessArray[0].fit; | |||
let bestChromosome = fitnessArray[0].chrom; | |||
for(let i = 0; i < keepNumber; i++) | |||
{ | |||
survivors.push(fitnessArray[i].chrom); | |||
} | |||
return {average: total/population.length, survivors: survivors, bestFit: bestFitness, bestChrom: bestChromosome}; | |||
}; | |||
/** | |||
* Randomly everyone in the population | |||
* | |||
* @param population | |||
* @param desiredPopulationSize | |||
*/ | |||
const matePopulation = function(population, desiredPopulationSize) | |||
{ | |||
const originalLength = population.length; | |||
while(population.length < desiredPopulationSize) | |||
{ | |||
let index1 = Math.round(Math.random() * (originalLength-1)); | |||
let index2 = Math.round(Math.random() * (originalLength-1)); | |||
if(index1 !== index2) | |||
{ | |||
const babies = breed(population[index1], population[index2]); | |||
population.push(babies[0]); | |||
population.push(babies[1]); | |||
} | |||
} | |||
}; | |||
/** | |||
* Randomly mutates the population | |||
**/ | |||
const mutatePopulation = function(population, mutatePercentage) | |||
{ | |||
if(population.length >= 2) | |||
{ | |||
let mutations = mutatePercentage * | |||
population.length * | |||
population[0].getGenes().length; | |||
for(let i = 0; i < mutations; i++) | |||
{ | |||
population[i].mutate(); | |||
} | |||
} | |||
else | |||
{ | |||
console.log("Error, population too small to mutate"); | |||
} | |||
}; | |||
/** | |||
* Introduces x random chromosomes to the population. | |||
* @param population | |||
* @param immigrationSize | |||
*/ | |||
const newBlood = function(population, immigrationSize) | |||
{ | |||
for(let i = 0; i < immigrationSize; i++) | |||
{ | |||
let geneticChromosome = population[0]; | |||
population.push(geneticChromosome.createRandomChromosome()); | |||
} | |||
}; | |||
let costx = Math.random() * 10; | |||
let costy = Math.random() * 10; | |||
/** Defines the cost as the "distance" to a 2-d point. | |||
* @param chromosome | |||
* @returns {number} | |||
*/ | |||
const basicCostFunction = function(chromosome) | |||
{ | |||
return Math.abs(chromosome.getGenes()[0].getRealValue() - costx) + | |||
Math.abs(chromosome.getGenes()[1].getRealValue() - costy); | |||
}; | |||
/** | |||
* Creates a totally random population based on a desired size | |||
* and a prototypical chromosome. | |||
* | |||
* @param geneticChromosome | |||
* @param populationSize | |||
* @returns {Array} | |||
*/ | |||
const createRandomPopulation = function(geneticChromosome, populationSize) | |||
{ | |||
let population = []; | |||
for(let i = 0; i < populationSize; i++) | |||
{ | |||
population.push(geneticChromosome.createRandomChromosome()); | |||
} | |||
return population; | |||
}; | |||
/** | |||
* Runs the genetic algorithm by going through the processes of | |||
* natural selection, mutation, mating, and immigrations. This | |||
* process will continue until an adequately performing chromosome | |||
* is found or a generation threshold is passed. | |||
* | |||
* @param geneticChromosome Prototypical chromosome: used so algo knows | |||
* what the dna of the population looks like. | |||
* @param costFunction Function which defines how bad a Chromosome is | |||
* @param populationSize Desired population size for population | |||
* @param maxGenerations Cut off level for number of generations to run | |||
* @param desiredCost Sufficient cost to terminate program at | |||
* @param mutationRate Number between [0,1] representing proportion of genes | |||
* to mutate each generation | |||
* @param keepNumber Number of Organisms which survive each generation | |||
* @param newBloodNumber Number of random immigrants to introduce into | |||
* the population each generation. | |||
* @returns {*} | |||
*/ | |||
const runGeneticOptimization = function(geneticChromosome, costFunction, | |||
populationSize, maxGenerations, | |||
desiredCost, mutationRate, keepNumber, | |||
newBloodNumber) | |||
{ | |||
let population = createRandomPopulation(geneticChromosome, populationSize); | |||
let generation = 0; | |||
let bestCost = Number.MAX_VALUE; | |||
let bestChromosome = geneticChromosome; | |||
do | |||
{ | |||
matePopulation(population, populationSize); | |||
newBlood(population, newBloodNumber); | |||
mutatePopulation(population, mutationRate); | |||
let generationResult = naturalSelection(population, keepNumber, costFunction); | |||
if(bestCost > generationResult.bestFit) | |||
{ | |||
bestChromosome = generationResult.bestChrom; | |||
bestCost = generationResult.bestFit; | |||
} | |||
population = generationResult.survivors; | |||
generation++; | |||
console.log("Generation " + generation + " Best Cost: " + bestCost); | |||
}while(generation < maxGenerations && bestCost > desiredCost); | |||
return bestChromosome; | |||
}; | |||
/** | |||
* Ugly globals used to keep track of population state for the graph. | |||
*/ | |||
let genericChromosomeG, costFunctionG, | |||
populationSizeG, maxGenerationsG, | |||
desiredCostG, mutationRateG, keepNumberG, | |||
newBloodNumberG, populationG, generationG, | |||
bestCostG = Number.MAX_VALUE, bestChromosomeG = genericChromosomeG; | |||
const runGeneticOptimizationForGraph = function() | |||
{ | |||
let generationResult = naturalSelection(populationG, keepNumberG, costFunctionG); | |||
stats.push([generationG, generationResult.bestFit, generationResult.average]); | |||
if(bestCostG > generationResult.bestFit) | |||
{ | |||
bestChromosomeG = generationResult.bestChrom; | |||
bestCostG = generationResult.bestFit; | |||
} | |||
populationG = generationResult.survivors; | |||
generationG++; | |||
console.log("Generation " + generationG + " Best Cost: " + bestCostG); | |||
console.log(generationResult); | |||
matePopulation(populationG, populationSizeG); | |||
newBlood(populationG, newBloodNumberG); | |||
mutatePopulation(populationG, mutationRateG); | |||
createGraph(); | |||
}; | |||
let stats = []; | |||
const createGraph = function() | |||
{ | |||
var dataPoints = []; | |||
console.log(dataPoints); | |||
var data = new google.visualization.DataTable(); | |||
data.addColumn('number', 'Gene 1'); | |||
data.addColumn('number', 'Gene 2'); | |||
for(let i = 0; i < populationG.length; i++) | |||
{ | |||
data.addRow([populationG[i].getGenes()[0].getRealValue(), | |||
populationG[i].getGenes()[1].getRealValue()]); | |||
} | |||
var options = { | |||
title: 'Genetic Evolution On Two Genes Generation: ' + generationG, | |||
hAxis: {title: 'Gene 1', minValue: 0, maxValue: 10}, | |||
vAxis: {title: 'Gene 2', minValue: 0, maxValue: 10}, | |||
}; | |||
var chart = new google.visualization.ScatterChart(document.getElementById('chart_div')); | |||
chart.draw(data, options); | |||
//line chart stuff | |||
var line_data = new google.visualization.DataTable(); | |||
line_data.addColumn('number', 'Generation'); | |||
line_data.addColumn('number', 'Best'); | |||
line_data.addColumn('number', 'Average'); | |||
line_data.addRows(stats); | |||
console.log(stats); | |||
var lineChartOptions = { | |||
hAxis: { | |||
title: 'Generation' | |||
}, | |||
vAxis: { | |||
title: 'Cost' | |||
}, | |||
colors: ['#AB0D06', '#007329'] | |||
}; | |||
var chart = new google.visualization.LineChart(document.getElementById('line_chart')); | |||
chart.draw(line_data, lineChartOptions); | |||
}; | |||
let gene1 = new Gene(1,10,10); | |||
let gene2 = new Gene(1,10,0.4); | |||
let geneList = [gene1, gene2]; | |||
let exampleOrganism = new Chromosome(geneList); | |||
genericChromosomeG = exampleOrganism; | |||
costFunctionG = basicCostFunction; | |||
populationSizeG = 100; | |||
maxGenerationsG = 30; | |||
desiredCostG = 0.00001; | |||
mutationRateG = 0.3; | |||
keepNumberG = 30; | |||
newBloodNumberG = 10; | |||
generationG = 0; | |||
function verifyForm() | |||
{ | |||
if(Number($("#populationSize").val()) <= 1) | |||
{ | |||
alert("Population size must be greater than one."); | |||
return false; | |||
} | |||
if(Number($("#mutationRate").val()) > 1 || | |||
Number($("#mutationRate").val()) < 0) | |||
{ | |||
alert("Mutation rate must be between zero and one."); | |||
return false; | |||
} | |||
if(Number($("#survivalSize").val()) < 0) | |||
{ | |||
alert("Survival size can't be less than one."); | |||
return false; | |||
} | |||
if(Number($("#newBlood").val()) < 0) | |||
{ | |||
alert("New organisms can't be a negative number."); | |||
return false; | |||
} | |||
return true; | |||
} | |||
function resetPopulation() | |||
{ | |||
if(verifyForm()) | |||
{ | |||
stats = []; | |||
autoRunning = false; | |||
$("#runAutoOptimizer").val("Auto Run"); | |||
populationSizeG = $("#populationSize").val(); | |||
mutationRateG = $("#mutationRate").val(); | |||
keepNumberG = $("#survivalSize").val(); | |||
newBloodNumberG = $("#newBlood").val(); | |||
generationG = 0; | |||
populationG = createRandomPopulation(genericChromosomeG, populationSizeG); | |||
createGraph(); | |||
} | |||
} | |||
populationG = createRandomPopulation(genericChromosomeG, populationSizeG); | |||
window.onload = function (){ | |||
google.charts.load('current', {packages: ['corechart', 'line']}); | |||
google.charts.load('current', {'packages':['corechart']}).then(function() | |||
{ | |||
createGraph(); | |||
}) | |||
}; | |||
let autoRunning = false; | |||
function runAutoOptimizer() | |||
{ | |||
if(autoRunning === true) | |||
{ | |||
runGeneticOptimizationForGraph(); | |||
setTimeout(runAutoOptimizer, 1000); | |||
} | |||
} | |||
function startStopAutoRun() | |||
{ | |||
autoRunning = !autoRunning; | |||
if(autoRunning) | |||
{ | |||
$("#runAutoOptimizer").val("Stop Auto Run"); | |||
} | |||
else | |||
{ | |||
$("#runAutoOptimizer").val("Resume Auto Run"); | |||
} | |||
runAutoOptimizer(); | |||
} | |||
//runGeneticOptimization(exampleOrganism, basicCostFunction, 100, 50, 0.01, 0.3, 20, 10); | |||
</script> | |||
</head> | |||
<body> | |||
<div id="chart_div" style="width: 900px; height: 500px;"></div> | |||
<div id="line_chart"></div> | |||
<input class='btn btn-primary' id="runOptimizer" onclick='runGeneticOptimizationForGraph()' type="button" value="Next Generation"> | |||
<input class='btn btn-primary' id="runAutoOptimizer" onclick='startStopAutoRun()' type="button" value="Auto Run"> | |||
<div class="card"> | |||
<div class="card-header"> | |||
<h2>Population Variables</h2> | |||
</div> | |||
<form class="card-body"> | |||
<div class="row p-2"> | |||
<div class="col"> | |||
<label for="populationSize">Population Size</label> | |||
<input type="text" class="form-control" value="100" id="populationSize" placeholder="Population Size" required> | |||
</div> | |||
<div class="col"> | |||
<label for="populationSize">Survival Size</label> | |||
<input type="text" class="form-control" value="20" id="survivalSize" placeholder="Survival Size" required> | |||
</div> | |||
</div> | |||
<div class="row p-2"> | |||
<div class="col"> | |||
<label for="populationSize">Mutation Rate</label> | |||
<input type="text" class="form-control" value="0.03" id="mutationRate" placeholder="Mutation Rate" required> | |||
</div> | |||
<div class="col"> | |||
<label for="populationSize">New Organisms Per Generation</label> | |||
<input type="text" class="form-control" value="5" id="newBlood" placeholder="New Organisms" required> | |||
</div> | |||
</div> | |||
<br> | |||
<input class='btn btn-primary' id="reset" onclick='resetPopulation()' type="button" value="Reset Population"> | |||
</form> | |||
</div> | |||
</body> | |||
</html> |
@ -0,0 +1,92 @@ | |||
<!DOCTYPE HTML> | |||
<html> | |||
<head> | |||
<title>Graph2d | Performance</title> | |||
<style> | |||
body, html { | |||
font-family: arial, sans-serif; | |||
font-size: 11pt; | |||
} | |||
span.label { | |||
width:150px; | |||
display:inline-block; | |||
} | |||
</style> | |||
<!-- note: moment.js must be loaded before vis.js, else vis.js uses its embedded version of moment.js --> | |||
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script> | |||
<script src="https://code.jquery.com/jquery-3.3.1.min.js" | |||
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" | |||
crossorigin="anonymous"> | |||
</script> | |||
<script src="./dist/vis.js"></script> | |||
<link href="./dist/vis-timeline-graph2d.min.css" rel="stylesheet" type="text/css" /> | |||
</head> | |||
<body> | |||
<br /> | |||
Click the button then choose a file to graph. | |||
<button onclick="openFile(dispFile)">Open a file</button> | |||
<pre id="contents"></pre> | |||
<div id="visualization"> | |||
<script type="text/javascript"> | |||
function dispFile(contents) | |||
{ | |||
console.log(contents); | |||
console.log(typeof contents); | |||
var container = document.getElementById('visualization'); | |||
var items = JSON.parse(contents); | |||
var dataset = new vis.DataSet(items); | |||
var options = {}; | |||
var graph2d = new vis.Graph2d(container, dataset, options); | |||
} | |||
function clickElem(elem) | |||
{ | |||
// Thx user1601638 on Stack Overflow (6/6/2018 - https://stackoverflow.com/questions/13405129/javascript-create-and-save-file ) | |||
var eventMouse = document.createEvent("MouseEvents"); | |||
eventMouse.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); | |||
elem.dispatchEvent(eventMouse); | |||
} | |||
function openFile(func) | |||
{ | |||
readFile = function(e) | |||
{ | |||
var file = e.target.files[0]; | |||
if (!file) | |||
{ | |||
return; | |||
} | |||
var reader = new FileReader(); | |||
reader.onload = function(e) | |||
{ | |||
var contents = e.target.result; | |||
fileInput.func(contents); | |||
document.body.removeChild(fileInput); | |||
} | |||
reader.readAsText(file); | |||
} | |||
fileInput = document.createElement("input"); | |||
fileInput.type='file'; | |||
fileInput.style.display='none'; | |||
fileInput.onchange=readFile; | |||
fileInput.func=func; | |||
document.body.appendChild(fileInput); | |||
clickElem(fileInput); | |||
} | |||
</script> | |||
</div> | |||
</body> | |||
</html> |
@ -0,0 +1 @@ | |||
[{"x": "2014-06-1", "y": -6},{"x": "2014-06-11", "y": 0},{"x": "2014-06-12", "y": 25},{"x": "2014-06-13", "y": 30},{"x": "2014-06-14", "y": 10},{"x": "2014-06-15", "y": 15},{"x": "2014-06-16", "y": 30}] |
@ -0,0 +1,142 @@ | |||
class Graph: | |||
def __init__(self): | |||
self.vertices = {} | |||
def add_vertex(self, key): | |||
vertex = Vertex(key) | |||
self.vertices[key] = vertex | |||
def get_vertex(self, key): | |||
return self.vertices[key] | |||
def __contains__(self, key): | |||
return key in self.vertices | |||
def add_edge(self, src_key, dest_key, weight=1): | |||
self.vertices[src_key].add_neighbour(self.vertices[dest_key], weight) | |||
def does_edge_exist(self, src_key, dest_key): | |||
return self.vertices[src_key].does_it_point_to(self.vertices[dest_key]) | |||
def __len__(self): | |||
return len(self.vertices) | |||
def __iter__(self): | |||
return iter(self.vertices.values()) | |||
class Vertex: | |||
def __init__(self, key): | |||
self.key = key | |||
self.points_to = {} | |||
def get_key(self): | |||
return self.key | |||
def add_neighbour(self, dest, weight): | |||
self.points_to[dest] = weight | |||
def get_neighbours(self): | |||
return self.points_to.keys() | |||
def get_weight(self, dest): | |||
return self.points_to[dest] | |||
def does_it_point_to(self, dest): | |||
return dest in self.points_to | |||
def floyd_warshall(g): | |||
distance = {v:dict.fromkeys(g, float('inf')) for v in g} | |||
next_v = {v:dict.fromkeys(g, None) for v in g} | |||
for v in g: | |||
for n in v.get_neighbours(): | |||
distance[v][n] = v.get_weight(n) | |||
next_v[v][n] = n | |||
for v in g: | |||
distance[v][v] = 0 | |||
next_v[v][v] = None | |||
for p in g: | |||
for v in g: | |||
for w in g: | |||
if distance[v][w] > distance[v][p] + distance[p][w]: | |||
distance[v][w] = distance[v][p] + distance[p][w] | |||
next_v[v][w] = next_v[v][p] | |||
return distance, next_v | |||
def print_path(next_v, u, v): | |||
p = u | |||
while (next_v[p][v]): | |||
print('{} -> '.format(p.get_key()), end='') | |||
p = next_v[p][v] | |||
print('{} '.format(v.get_key()), end='') | |||
g = Graph() | |||
print('Menu') | |||
print('add vertex <key>') | |||
print('add edge <src> <dest> <weight>') | |||
print('floyd-warshall') | |||
print('display') | |||
print('quit') | |||
while True: | |||
do = input('What would you like to do? ').split() | |||
operation = do[0] | |||
if operation == 'add': | |||
suboperation = do[1] | |||
if suboperation == 'vertex': | |||
key = int(do[2]) | |||
if key not in g: | |||
g.add_vertex(key) | |||
else: | |||
print('Vertex already exists.') | |||
elif suboperation == 'edge': | |||
src = int(do[2]) | |||
dest = int(do[3]) | |||
weight = int(do[4]) | |||
if src not in g: | |||
print('Vertex {} does not exist.'.format(src)) | |||
elif dest not in g: | |||
print('Vertex {} does not exist.'.format(dest)) | |||
else: | |||
if not g.does_edge_exist(src, dest): | |||
g.add_edge(src, dest, weight) | |||
else: | |||
print('Edge already exists.') | |||
elif operation == 'floyd-warshall': | |||
distance, next_v = floyd_warshall(g) | |||
print('Shortest distances:') | |||
for start in g: | |||
for end in g: | |||
if next_v[start][end]: | |||
print('From {} to {}: '.format(start.get_key(), | |||
end.get_key()), | |||
end = '') | |||
print_path(next_v, start, end) | |||
print('(distance {})'.format(distance[start][end])) | |||
elif operation == 'display': | |||
print('Vertices: ', end='') | |||
for v in g: | |||
print(v.get_key(), end=' ') | |||
print() | |||
print('Edges: ') | |||
for v in g: | |||
for dest in v.get_neighbours(): | |||
w = v.get_weight(dest) | |||
print('(src={}, dest={}, weight={}) '.format(v.get_key(), | |||
dest.get_key(), w)) | |||
print() | |||
elif operation == 'quit': | |||
break |
@ -0,0 +1,122 @@ | |||
""" | |||
:Author: James Sherratt | |||
:Date: 20/10/2019 | |||
:License: MIT | |||
:name: graph.py | |||
""" | |||
class Graph: | |||
def __init__(self): | |||
self.vertices = set() | |||
self.edges = set() | |||
def add_vertex(self, vert): | |||
""" | |||
Add a vertex to the graph. | |||
:param vert: name of the vertex. | |||
:return: None | |||
""" | |||
self.vertices.add(vert) | |||
def add_edge(self, vert1, vert2, directional=False): | |||
""" | |||
Add an edge to the graph. The edge will be defined as a simple tuple where: | |||
- The first value is the initial edge. | |||
- The second is the final edge. | |||
- The third is whether the edge is directional. | |||
:param vert1: the start vertex. | |||
:param vert2: the end vertex. | |||
:param directional: whether or not the edge has a direction. Default: False | |||
:return: None | |||
""" | |||
self.vertices.add(vert1) | |||
self.vertices.add(vert2) | |||
if (not directional) and (vert1 > vert2): | |||
# swap if not directional to avoid duplicates in the set. | |||
self.edges.add((vert2, vert1, directional)) | |||
else: | |||
self.edges.add((vert1, vert2, directional)) | |||
def adjacency(self, vert1, vert2): | |||
""" | |||
Check if 2 vertices are adjacent (if they exist). Note: if vert1 and vert2 | |||
are connected, but directionally from vert2 to vert1, False is returned. | |||
:param vert1: The first vertex to compare. | |||
:param vert2: The second vertex to compare. | |||
:return: True if adjacent, False if not, None if either are not in the set. | |||
""" | |||
if (vert1 not in self.vertices) or (vert2 not in self.vertices): | |||
return None | |||
for edge in self.edges: | |||
if (vert1 == edge[0]) and (vert2 == edge[1]): | |||
return True | |||
if (not edge[2]) and ((vert1 == edge[1]) and (vert2 == edge[0])): | |||
return True | |||
return False | |||
def neighbours(self, vert): | |||
""" | |||
Get the neighbours of a vertex. | |||
:param vert: name of the vertex. | |||
:return: list of neighbours, or None if the vertex is not in the graph. | |||
""" | |||
if vert not in self.vertices: | |||
return None | |||
neighbours = set() | |||
for edge in self.edges: | |||
if vert == edge[0]: | |||
neighbours.add(edge[1]) | |||
elif (not edge[2]) and (vert == edge[1]): | |||
neighbours.add(edge[0]) | |||
return neighbours | |||
def as_dict(self): | |||
""" | |||
Convert the graph to a dictionary where: | |||
- Each key is a vertex. | |||
- Each value is a set of neighbours you can travel to. | |||
:return: dict representing the graph. | |||
""" | |||
graph_dict = {v: set() for v in self.vertices} | |||
for edge in self.edges: | |||
graph_dict[edge[0]].add(edge[1]) | |||
if not edge[2]: | |||
graph_dict[edge[1]].add(edge[0]) | |||
return graph_dict | |||
if __name__ == "__main__": | |||
mygraph = Graph() | |||
mygraph.add_edge("a", "b") | |||
mygraph.add_edge("b", "c") | |||
mygraph.add_edge("b", "d") | |||
mygraph.add_edge("c", "b") | |||
mygraph.add_edge("a", "e", directional=True) | |||
mygraph.add_vertex("z") | |||
print("b neighbours:", mygraph.neighbours("b")) | |||
print("a neighbours:", mygraph.neighbours("a")) | |||
print("q neighbours:", mygraph.neighbours("q")) | |||
print("e neighbours:", mygraph.neighbours("e")) | |||
print() | |||
# Adjacency has direction. | |||
print("a and e adjacent:", mygraph.adjacency("a", "e")) | |||
print("e and a adjacent:", mygraph.adjacency("e", "a")) | |||
print("d and b adjacent", mygraph.adjacency("d", "b")) | |||
print("q and a adjacent:", mygraph.adjacency("q", "a")) | |||
print("z and a adjacent:", mygraph.adjacency("z", "a")) | |||
print() | |||
print("as dict") | |||
print(mygraph.as_dict()) | |||
# Exercise/ project: add a method "path" to find path between 2 vertices. | |||
# (Hint: lookup DFS/ BFS algorithm.) |
@ -0,0 +1,71 @@ | |||
import java.io.BufferedWriter; | |||
import java.io.File; | |||
import java.io.FileWriter; | |||
import java.math.*; | |||
/** | |||
* Simple class to generate random data for | |||
* file IO tests. | |||
* | |||
* @author Jeffery Russell 1-31-19 | |||
*/ | |||
public class DataCreator | |||
{ | |||
/** | |||
* Generates an obscure random character | |||
* @return | |||
*/ | |||
private static char rndChar() | |||
{ | |||
// or use Random or whatever | |||
int rnd = (int) (Math.random() * 52); | |||
char base = (rnd < 26) ? 'A' : 'a'; | |||
return (char) (base + rnd % 26); | |||
} | |||
/** | |||
* Simple function to save contents to the disk | |||
* | |||
* @param s | |||
* @param fileName | |||
*/ | |||
private static void saveToDisk(String s, String fileName) | |||
{ | |||
BufferedWriter writer; | |||
try | |||
{ | |||
File file = new File(fileName); | |||
file.createNewFile(); | |||
writer = new BufferedWriter(new FileWriter(file)); | |||
writer.write(s); | |||
writer.flush(); | |||
writer.close(); | |||
} | |||
catch (Exception e) | |||
{ | |||
e.printStackTrace(); | |||
} | |||
} | |||
/** | |||
* Creates 5MB of random test data to use | |||
*/ | |||
public static void main(String[] arguments) | |||
{ | |||
System.out.println("Creating Test Files"); | |||
for(int i = 0; i < 100; i++) | |||
{ | |||
//10k random characters for each file | |||
//each file is 10kb * 500 files, total size of 5MB | |||
String s = ""; | |||
for(int j = 0; j < 1000000; j++) | |||
{ | |||
s = s + rndChar(); | |||
} | |||
saveToDisk(s, "./testData/" + i + ".txt"); | |||
System.out.println(s); | |||
} | |||
} | |||
} |
@ -0,0 +1,44 @@ | |||
import java.io.BufferedReader; | |||
import java.io.FileInputStream; | |||
import java.io.IOException; | |||
import java.io.InputStreamReader; | |||
/** | |||
* Simple class for reading files as strings. | |||
* | |||
* @author Jeffery Russell | |||
*/ | |||
public class FileReader | |||
{ | |||
public static String readFile(String filePath) | |||
{ | |||
String fileContent = new String(); | |||
try | |||
{ | |||
BufferedReader br = new BufferedReader( | |||
new InputStreamReader(new FileInputStream(filePath))); | |||
String line; | |||
while ((line = br.readLine()) != null) | |||
{ | |||
fileContent = fileContent.concat(line); | |||
} | |||
br.close(); | |||
} | |||
catch (IOException e) | |||
{ | |||
e.printStackTrace(); | |||
} | |||
return fileContent; | |||
} | |||
public static void main(String[] args) | |||
{ | |||
System.out.println("Test"); | |||
System.out.println(FileReader.readFile("./testData/data1.txt")); | |||
} | |||
} |
@ -0,0 +1,40 @@ | |||
import java.util.*; | |||
/** | |||
* File to test the performance of multi threaded file | |||
* io by reading a large quantity of files in parallel | |||
* using a different amount of threads. | |||
* | |||
* @author Jeffery Russell 1-31-19 | |||
*/ | |||
public class MultiThreadedFileReadTest | |||
{ | |||
public static void main(String[] args) | |||
{ | |||
List<Integer> x = new ArrayList<>(); | |||
List<Double> y = new ArrayList<>(); | |||
for(int i = 1; i <= 64; i++) | |||
{ | |||
long threadTotal = 0; | |||
for(int w = 0; w < 20; w++) | |||
{ | |||
TaskManager boss = new TaskManager(i); | |||
for(int j = 0; j < 500; j++) | |||
{ | |||
boss.addTask(new ReadTask("./testData/" + i + ".txt")); | |||
} | |||
long startTime = System.nanoTime(); | |||
boss.runTasks(); | |||
long endTime = System.nanoTime(); | |||
long durationMS = (endTime - startTime)/1000000; | |||
threadTotal+= durationMS; | |||
} | |||
x.add(i); | |||
y.add(threadTotal/20.0); //finds average | |||
} | |||
System.out.println(x); | |||
System.out.println(y); | |||
} | |||
} |
@ -0,0 +1,20 @@ | |||
/** | |||
* Simple method to be used by the task manager to do | |||
* file io. | |||
* | |||
* @author Jeffery Russell | |||
*/ | |||
public class ReadTask | |||
{ | |||
private String fileName; | |||
public ReadTask(String fileName) | |||
{ | |||
this.fileName = fileName; | |||
} | |||
public void runTask() | |||
{ | |||
FileReader.readFile(fileName); | |||
} | |||
} |
@ -0,0 +1,87 @@ | |||
import java.util.List; | |||
import java.util.Vector; | |||
/** | |||
* A class which enables user to run a large chunk of | |||
* tasks in parallel efficiently. | |||
* | |||
* @author Jeffery 1-29-19 | |||
*/ | |||
public class TaskManager | |||
{ | |||
/** Number of threads to use at once */ | |||
private int threadCount; | |||
/** Meaningless tasks to run in parallel */ | |||
private List<ReadTask> tasks; | |||
public TaskManager(int threadCount) | |||
{ | |||
this.threadCount = threadCount; | |||
//using vectors because they are thread safe | |||
this.tasks = new Vector<>(); | |||
} | |||
public void addTask(ReadTask t) | |||
{ | |||
tasks.add(t); | |||
} | |||
/** | |||
* This is the fun method. | |||
* | |||
* This will run all of the tasks in parallel using the | |||
* desired amount of threads untill all of the jobs are | |||
* complete. | |||
*/ | |||
public void runTasks() | |||
{ | |||
int desiredThreads = threadCount > tasks.size() ? | |||
tasks.size() : threadCount; | |||
Thread[] runners = new Thread[desiredThreads]; | |||
for(int i = 0; i < desiredThreads; i++) | |||
{ | |||
runners[i] = new Thread(()-> | |||
{ | |||
ReadTask t = null; | |||
while(true) | |||
{ | |||
//need synchronized block to prevent | |||
//race condition | |||
synchronized (tasks) | |||
{ | |||
if(!tasks.isEmpty()) | |||
t = tasks.remove(0); | |||
} | |||
if(t == null) | |||
{ | |||
break; | |||
} | |||
else | |||
{ | |||
t.runTask(); | |||
t = null; | |||
} | |||
} | |||
}); | |||
runners[i].start(); | |||
} | |||
for(int i = 0; i < desiredThreads; i++) | |||
{ | |||
try | |||
{ | |||
runners[i].join(); | |||
} | |||
catch (Exception e) | |||
{ | |||
e.printStackTrace(); | |||
} | |||
} | |||
} | |||
} |
@ -0,0 +1,13 @@ | |||
import matplotlib.pyplot as plt | |||
xList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64] | |||
yList = [230.5, 124.0, 84.65, 63.9, 51.6, 44.2, 39.15, 34.9, 31.9, 28.7, 27.2, 25.05, 24.25, 22.8, 21.25, 20.45, 19.8, 19.4, 18.6, 17.45, 17.0, 16.95, 16.4, 24.15, 15.2, 15.2, 15.0, 14.3, 14.7, 14.65, 14.65, 14.75, 13.85, 15.1, 14.35, 35.75, 15.3, 14.45, 14.25, 13.65, 14.45, 14.6, 13.95, 14.65, 14.5, 14.3, 14.85, 14.15, 15.0, 16.25, 14.25, 14.4, 14.15, 14.45, 14.25, 14.85, 14.3, 14.35, 15.35, 13.6, 14.3, 14.2, 14.3, 13.95] | |||
plt.plot(xList, yList) | |||
plt.xlabel('Number of Threads') | |||
plt.ylabel('Execution Time (MS)') | |||
plt.show() |
@ -0,0 +1,182 @@ | |||
sleep_log_entry_id,timestamp,overall_score,composition_score,revitalization_score,duration_score,deep_sleep_in_minutes,resting_heart_rate,restlessness | |||
26093459526,2020-02-27T06:04:30Z,80,20,19,41,65,60,0.11733046286329386 | |||
26081303207,2020-02-26T06:13:30Z,83,22,21,40,85,60,0.11318795430944964 | |||
26062481322,2020-02-25T06:00:30Z,82,22,21,39,95,60,0.12063492063492064 | |||
26045941555,2020-02-24T05:49:30Z,79,17,20,42,52,61,0.11122448979591837 | |||
26034268762,2020-02-23T08:35:30Z,75,20,16,39,43,59,0.15477386934673368 | |||
26022694306,2020-02-22T07:43:00Z,79,19,21,39,53,60,0.09750297265160524 | |||
26007961616,2020-02-21T06:35:30Z,81,22,17,42,89,58,0.12588832487309645 | |||
25988234988,2020-02-20T06:25:00Z,81,21,21,39,60,58,0.11811926605504587 | |||
25969165537,2020-02-19T06:34:00Z,88,22,20,46,91,59,0.12130177514792899 | |||
25952365608,2020-02-18T05:46:30Z,84,23,20,41,114,61,0.13891726251276812 | |||
25938189656,2020-02-17T06:19:00Z,86,22,22,42,89,63,0.09623430962343096 | |||
25926432422,2020-02-16T08:15:30Z,76,21,18,37,49,60,0.11136107986501688 | |||
25901113872,2020-02-14T06:34:00Z,78,18,19,41,74,58,0.12269938650306748 | |||
25883532376,2020-02-13T06:03:00Z,85,21,21,43,52,58,0.10491071428571429 | |||
25871057666,2020-02-12T06:28:30Z,81,22,17,42,88,58,0.1282316442605998 | |||
25860431526,2020-02-11T06:01:30Z,69,18,18,33,57,57,0.13793103448275862 | |||
25844332793,2020-02-10T06:34:00Z,86,22,22,42,88,57,0.10461538461538461 | |||
25829772076,2020-02-09T08:11:30Z,86,21,21,44,80,58,0.13311948676824378 | |||
25817419640,2020-02-08T08:17:00Z,87,22,20,45,132,59,0.13164556962025317 | |||
25803331988,2020-02-07T06:33:00Z,79,20,18,41,88,58,0.14084507042253522 | |||
25785877070,2020-02-06T05:50:00Z,81,21,18,42,80,57,0.11764705882352941 | |||
25769882127,2020-02-05T05:46:30Z,82,21,20,41,46,57,0.12259371833839919 | |||
25755117610,2020-02-04T05:47:00Z,83,22,19,42,83,58,0.16132478632478633 | |||
25742882864,2020-02-03T05:58:30Z,84,22,20,42,85,59,0.13249211356466878 | |||
25729700495,2020-02-02T08:13:30Z,78,19,15,44,100,57,0.17530631479736097 | |||
25717829971,2020-02-01T08:30:00Z,81,20,17,44,100,58,0.1504491017964072 | |||
25704549870,2020-01-31T06:35:30Z,82,22,19,41,103,57,0.1182108626198083 | |||
25684248305,2020-01-30T06:33:00Z,81,22,18,41,89,57,0.1384297520661157 | |||
25655144692,2020-01-29T06:33:00Z,83,21,21,41,107,59,0.12727272727272726 | |||
25642147792,2020-01-28T05:43:30Z,75,20,20,35,66,60,0.1445358401880141 | |||
25624216079,2020-01-27T06:30:30Z,75,20,17,38,87,59,0.14594594594594595 | |||
25613704007,2020-01-26T09:59:00Z,82,20,19,43,88,58,0.1306772908366534 | |||
25593158621,2020-01-25T08:56:00Z,73,18,17,38,75,57,0.14451382694023193 | |||
25584797887,2020-01-24T06:25:00Z,82,21,19,42,70,57,0.12525458248472504 | |||
25566089471,2020-01-23T05:46:00Z,82,21,22,39,79,58,0.11123470522803114 | |||
25553681127,2020-01-22T05:59:00Z,78,22,20,36,89,58,0.12290502793296089 | |||
25536165788,2020-01-21T05:45:00Z,76,21,20,35,67,59,0.13196814562002276 | |||
25523347864,2020-01-20T07:49:30Z,82,21,20,41,89,60,0.11534500514933059 | |||
25510939805,2020-01-19T07:52:00Z,81,19,21,41,44,60,0.10616784630940344 | |||
25498043781,2020-01-18T08:22:00Z,80,22,18,40,85,60,0.1424390243902439 | |||
25481521636,2020-01-17T06:33:00Z,77,22,20,35,84,60,0.11912225705329153 | |||
25464967288,2020-01-16T05:40:30Z,79,21,21,37,82,61,0.13427561837455831 | |||
25451954958,2020-01-15T07:03:30Z,72,18,18,36,75,61,0.1487778958554729 | |||
25433680148,2020-01-14T05:59:00Z,78,22,18,38,95,60,0.13448275862068965 | |||
25416046459,2020-01-13T06:12:30Z,59,15,15,29,71,58,0.12557077625570776 | |||
25404373453,2020-01-12T07:40:30Z,70,19,17,34,88,57,0.14871794871794872 | |||
25391754657,2020-01-11T07:00:00Z,82,22,19,41,95,57,0.13719512195121952 | |||
25376512937,2020-01-10T05:55:30Z,80,22,19,39,99,57,0.1457174638487208 | |||
25363137868,2020-01-09T07:16:30Z,82,22,18,42,96,57,0.17166494312306102 | |||
25342702306,2020-01-08T07:36:30Z,71,18,16,37,90,57,0.18043684710351376 | |||
25320701087,2020-01-07T06:27:30Z,76,19,17,40,94,58,0.14355948869223206 | |||
25302298657,2020-01-06T07:54:00Z,78,20,18,40,102,58,0.15831663326653306 | |||
25290153671,2020-01-05T08:39:30Z,76,20,18,38,135,58,0.18575553416746873 | |||
25277262941,2020-01-04T08:55:30Z,86,23,19,44,112,58,0.15954664341761116 | |||
25260231013,2020-01-03T08:02:30Z,77,23,17,37,112,58,0.16065911431513905 | |||
25246389288,2020-01-02T07:42:00Z,82,21,20,41,96,59,0.13477366255144033 | |||
25230986095,2020-01-01T08:17:00Z,87,22,20,45,96,58,0.1358974358974359 | |||
25223163489,2019-12-31T08:46:30Z,84,22,20,42,85,59,0.12800769971126083 | |||
25208075705,2019-12-30T09:02:30Z,86,23,18,45,121,59,0.16595012897678418 | |||
25192758070,2019-12-29T08:06:30Z,74,19,19,36,104,60,0.12307692307692308 | |||
25179626350,2019-12-28T07:47:00Z,75,23,20,32,109,60,0.13075060532687652 | |||
25167825845,2019-12-27T07:58:00Z,75,22,21,32,104,59,0.14196762141967623 | |||
25152307479,2019-12-26T07:11:00Z,82,23,18,41,135,60,0.13925327951564076 | |||
25141316140,2019-12-25T08:23:30Z,83,22,19,42,103,58,0.13015873015873017 | |||
25130549447,2019-12-24T06:42:30Z,70,18,17,35,66,58,0.16799091940976163 | |||
25119454863,2019-12-23T07:34:30Z,79,22,16,41,96,56,0.15461847389558234 | |||
25108672051,2019-12-22T07:50:30Z,82,21,20,41,91,57,0.14165890027958994 | |||
25098379524,2019-12-21T07:53:30Z,80,23,16,41,114,56,0.1527647610121837 | |||
25089476419,2019-12-20T07:36:30Z,79,22,19,38,103,56,0.11063372717508056 | |||
25072688276,2019-12-19T06:52:30Z,81,22,18,41,86,57,0.13789581205311544 | |||
25057861702,2019-12-18T06:12:00Z,78,22,20,36,119,57,0.14528101802757157 | |||
25043749264,2019-12-17T07:27:30Z,80,21,19,40,67,58,0.15663801337153774 | |||
25030710421,2019-12-16T07:14:30Z,87,22,19,46,97,57,0.13279132791327913 | |||
25017595333,2019-12-15T07:29:00Z,84,21,20,43,75,59,0.14136125654450263 | |||
25007218737,2019-12-14T08:30:00Z,88,22,21,45,98,60,0.12964563526361278 | |||
24997196150,2019-12-13T07:49:30Z,88,22,20,46,108,62,0.12952898550724637 | |||
24982127567,2019-12-12T07:47:30Z,82,21,21,40,66,64,0.14876847290640394 | |||
24972789521,2019-12-11T08:11:30Z,77,18,20,39,97,65,0.11817367949865712 | |||
24958854924,2019-12-10T08:58:30Z,64,17,13,34,53,63,0.18163054695562436 | |||
24944343209,2019-12-09T06:32:00Z,80,19,20,41,114,64,0.14519427402862986 | |||
24933856578,2019-12-08T08:27:30Z,72,19,20,33,68,66,0.15060240963855423 | |||
24924422010,2019-12-07T07:44:00Z,72,17,17,38,55,64,0.18670576735092864 | |||
24911112346,2019-12-06T06:02:00Z,74,21,19,34,76,63,0.13476070528967254 | |||
24901828393,2019-12-05T06:17:30Z,74,20,19,35,87,61,0.12682379349046016 | |||
24889394512,2019-12-04T05:57:30Z,81,23,18,40,107,60,0.1385809312638581 | |||
24866846291,2019-12-03T06:07:00Z,78,21,19,38,67,59,0.14748603351955308 | |||
24854583395,2019-12-02T06:33:30Z,72,20,15,37,87,57,0.1577350859453994 | |||
24845349137,2019-12-01T08:07:00Z,80,21,19,40,98,57,0.12749762131303521 | |||
24832170784,2019-11-30T06:43:30Z,75,19,17,39,89,56,0.1605550049554014 | |||
24823252695,2019-11-29T07:18:30Z,85,21,20,44,89,58,0.1431095406360424 | |||
24810734703,2019-11-28T08:16:30Z,78,19,21,38,108,59,0.13955555555555554 | |||
24800533035,2019-11-27T07:23:00Z,81,21,19,41,79,58,0.1814780168381665 | |||
24789018415,2019-11-26T06:19:00Z,78,18,19,41,99,58,0.13742690058479531 | |||
24775969508,2019-11-25T06:33:00Z,78,20,18,40,96,58,0.153 | |||
24775969507,2019-11-24T09:13:30Z,81,23,18,40,110,57,0.14246068455134134 | |||
24752259936,2019-11-23T05:36:00Z,81,18,21,42,91,59,0.1187308085977482 | |||
24743421450,2019-11-22T05:40:00Z,84,19,19,46,112,60,0.14511873350923482 | |||
24721924769,2019-11-21T05:39:00Z,80,20,19,41,114,60,0.1661600810536981 | |||
24705802084,2019-11-20T06:03:30Z,83,18,20,45,102,61,0.15812720848056538 | |||
24692804362,2019-11-19T05:59:30Z,68,19,15,34,66,59,0.232163080407701 | |||
24679720563,2019-11-18T06:45:30Z,81,21,20,40,110,59,0.1457378551787351 | |||
24668519678,2019-11-17T07:16:30Z,71,18,18,35,93,58,0.1624874623871615 | |||
24661537014,2019-11-16T07:34:30Z,82,21,19,42,97,59,0.14965312190287414 | |||
24645635181,2019-11-15T06:37:00Z,79,18,22,39,83,60,0.12270531400966184 | |||
24632260941,2019-11-14T06:10:30Z,63,17,18,28,66,58,0.13878080415045396 | |||
24622178551,2019-11-13T06:46:00Z,81,22,19,40,98,58,0.16093117408906882 | |||
24607642569,2019-11-12T06:02:00Z,76,18,21,37,103,58,0.1277330264672037 | |||
24594911463,2019-11-11T06:48:30Z,80,21,20,39,82,59,0.14729458917835672 | |||
24583710526,2019-11-10T07:27:30Z,83,21,21,41,113,59,0.10933081998114987 | |||
24573188107,2019-11-09T08:19:00Z,83,23,19,41,111,59,0.14476190476190476 | |||
24561443781,2019-11-08T06:33:00Z,83,21,20,42,70,60,0.1506276150627615 | |||
24548001288,2019-11-07T06:30:30Z,75,20,20,35,88,60,0.1248513674197384 | |||
24536346513,2019-11-06T06:32:00Z,80,22,17,41,84,59,0.16270218839200762 | |||
24525485244,2019-11-05T05:59:30Z,79,22,19,38,84,60,0.12485681557846506 | |||
24511902336,2019-11-04T06:55:30Z,80,21,18,41,107,60,0.1648675171736997 | |||
24496648737,2019-11-03T06:37:30Z,61,16,15,30,77,58,0.204739336492891 | |||
24489140894,2019-11-02T08:16:30Z,87,22,20,45,96,59,0.13217866909753875 | |||
24475953124,2019-11-01T06:45:00Z,81,22,22,37,94,60,0.10235294117647059 | |||
24463734399,2019-10-31T06:14:00Z,41,17,13,11,75,58,0.14906832298136646 | |||
24449968899,2019-10-30T06:39:30Z,82,22,19,41,94,58,0.13818860877684408 | |||
24437579612,2019-10-29T06:22:30Z,76,19,21,36,73,58,0.13719185423365488 | |||
24424386780,2019-10-28T06:44:30Z,84,21,21,42,90,59,0.11209439528023599 | |||
24413032462,2019-10-27T06:49:30Z,69,21,14,34,71,56,0.15770609318996415 | |||
24402887048,2019-10-26T05:37:00Z,75,21,19,35,93,56,0.11956521739130435 | |||
24390995549,2019-10-25T06:45:30Z,81,20,19,42,95,56,0.12195121951219512 | |||
24377443892,2019-10-24T07:12:30Z,75,22,18,35,83,56,0.1470292044310171 | |||
24366941680,2019-10-23T06:35:30Z,84,22,22,40,113,58,0.1330603889457523 | |||
24355822433,2019-10-22T06:45:30Z,82,23,18,41,110,58,0.13891726251276812 | |||
24341953249,2019-10-21T06:47:00Z,79,18,20,41,65,57,0.13636363636363635 | |||
24341953248,2019-10-20T07:45:30Z,85,20,21,44,110,56,0.11251049538203191 | |||
24318195646,2019-10-19T08:19:30Z,79,21,20,38,86,56,0.1321266968325792 | |||
24306066115,2019-10-18T07:12:00Z,84,24,20,40,127,56,0.11683168316831684 | |||
24289622902,2019-10-17T06:36:30Z,75,21,20,34,69,56,0.15337423312883436 | |||
24278460408,2019-10-16T06:21:00Z,79,21,21,37,117,57,0.10526315789473684 | |||
24269469092,2019-10-15T07:59:00Z,84,22,21,41,93,58,0.11545988258317025 | |||
24250954876,2019-10-14T05:13:00Z,76,19,20,37,77,58,0.1293833131801693 | |||
24242836711,2019-10-13T09:18:30Z,63,21,14,28,60,56,0.15173237753882915 | |||
24235096825,2019-10-12T08:10:00Z,82,22,20,40,107,57,0.1335914811229429 | |||
24219310077,2019-10-11T06:49:30Z,71,20,19,32,97,58,0.1372328458942632 | |||
24207395605,2019-10-10T06:22:00Z,71,20,16,35,74,57,0.14365256124721604 | |||
24192906384,2019-10-09T06:52:00Z,83,21,22,40,81,58,0.12016293279022404 | |||
24178673308,2019-10-08T06:19:30Z,81,20,21,40,91,59,0.11836283185840708 | |||
24157324429,2019-10-07T07:33:30Z,77,19,19,39,78,59,0.17323556370302476 | |||
24138872551,2019-10-06T09:19:30Z,78,21,16,41,134,60,0.23254139668826493 | |||
24131744325,2019-10-05T06:37:30Z,80,22,20,38,98,60,0.1513903192584964 | |||
24118453273,2019-10-04T06:23:30Z,81,22,19,40,92,60,0.13224043715846995 | |||
24107294203,2019-10-03T06:11:00Z,76,19,21,36,77,61,0.14412136536030343 | |||
24094261384,2019-10-02T06:49:30Z,80,22,19,39,125,61,0.155053974484789 | |||
24081125459,2019-10-01T06:36:00Z,79,21,20,38,73,60,0.12017167381974249 | |||
24067314952,2019-09-30T06:08:30Z,76,20,19,37,51,59,0.14870689655172414 | |||
24054803851,2019-09-29T07:21:00Z,78,22,19,37,92,59,0.1380065717415115 | |||
24043257064,2019-09-28T07:00:30Z,66,18,19,29,86,58,0.15037593984962405 | |||
24032032616,2019-09-27T06:47:30Z,85,22,21,42,101,59,0.11288711288711288 | |||
24018795264,2019-09-26T06:36:00Z,73,18,17,38,92,58,0.12582781456953643 | |||
24008259982,2019-09-25T07:42:00Z,82,20,18,44,77,58,0.15384615384615385 | |||
23995153240,2019-09-24T06:20:30Z,83,22,20,41,98,58,0.13559322033898305 | |||
23983598772,2019-09-23T06:47:00Z,81,20,20,41,108,59,0.143796992481203 | |||
23973042208,2019-09-22T07:31:00Z,77,19,17,41,101,58,0.16177957532861476 | |||
23973042207,2019-09-21T07:15:00Z,79,19,20,40,124,57,0.1359126984126984 | |||
23947975535,2019-09-20T06:42:00Z,86,20,21,45,117,59,0.11261261261261261 | |||
23933467238,2019-09-19T06:19:00Z,79,17,17,45,85,57,0.14273356401384082 | |||
23910315823,2019-09-17T05:13:30Z,66,17,19,30,98,56,0.16644113667117727 | |||
23891736899,2019-09-16T06:40:00Z,84,21,21,42,80,57,0.12987012987012986 | |||
23880011727,2019-09-15T07:25:30Z,77,20,18,39,89,57,0.1579466929911155 | |||
23869387147,2019-09-14T07:18:00Z,70,17,18,35,87,56,0.14772727272727273 | |||
23857222270,2019-09-13T06:42:00Z,70,21,17,32,128,55,0.12357217030114226 | |||
23843106439,2019-09-12T06:29:30Z,78,22,18,38,85,54,0.15171650055370986 | |||
23828701593,2019-09-11T05:59:00Z,81,22,20,39,86,55,0.1271186440677966 | |||
23813261926,2019-09-10T06:18:30Z,77,21,19,37,68,55,0.13847900113507378 | |||
23800207430,2019-09-09T06:37:00Z,81,21,20,40,78,55,0.12413108242303873 | |||
23779847904,2019-09-08T07:02:30Z,85,23,20,42,117,56,0.13186813186813187 | |||
23767509651,2019-09-07T07:03:00Z,75,21,19,35,77,55,0.11543287327478043 | |||
23753447582,2019-09-06T06:41:30Z,79,21,18,40,91,56,0.15695952615992104 | |||
23738011029,2019-09-05T06:13:00Z,78,21,21,36,80,57,0.1261574074074074 | |||
23724233662,2019-09-04T06:43:30Z,82,22,19,41,95,56,0.13779128672745694 | |||
23709362778,2019-09-03T06:31:00Z,85,23,20,42,115,55,0.12966804979253113 | |||
23696231032,2019-09-02T07:38:30Z,79,20,20,39,88,56,0.17092337917485265 | |||
23684345925,2019-09-01T07:15:30Z,84,22,21,41,95,56,0.1332675222112537 | |||
23673204871,2019-08-31T07:11:00Z,74,18,21,35,73,56,0.10270270270270271 | |||
23661278483,2019-08-30T06:34:00Z,73,17,19,37,50,55,0.12108559498956159 | |||
23646265400,2019-08-29T05:55:00Z,80,21,21,38,61,57,0.11296076099881094 |
@ -0,0 +1,43 @@ | |||
76561198188400721 jrtechs | |||
76561198049526995 Noosh | |||
76561198067517157 nweis76 | |||
76561198131175960 Delta_∆ | |||
76561198084464357 Ceta | |||
76561198085584420 PureMaths | |||
76561198068647768 Void Cause | |||
76561198094968588 Dumcumpster | |||
76561198107069713 yankeeman1081 | |||
76561198086854442 jspike397 | |||
76561198273751201 Kyon | |||
76561198083124245 drichardson005 | |||
76561198035606013 BK🐻 | |||
76561198255835078 Zelazny | |||
76561198170096391 Greata | |||
76561198306786411 fazeboojujee | |||
76561198062501319 Cantankerous | |||
76561198036270560 Toaster | |||
76561198306443796 numstudequals1 | |||
76561198133044936 Panda | |||
76561198095814450 Tbonedog | |||
76561198069739846 Alminikar | |||
76561198233398192 Saxophones of Death™ | |||
76561198162654610 Raydan | |||
76561198047367972 Oberyn Martell | |||
76561198057450983 TraceTheKitteh | |||
76561198176504246 shistthis | |||
76561198111538799 sergiozygmunt | |||
76561198853827591 theramendragon | |||
76561198055948417 Xaldin31 | |||
76561198137304077 lilsar419 | |||
76561198406334664 wywyit | |||
76561198098761042 wee haw | |||
76561198192510666 Rebel | |||
76561198066260593 NUT | |||
76561198099625445 DAW Legacy | |||
76561198017734545 Which Ones Pink? | |||
76561198036176189 Ben | |||
76561198069739485 Rkames517 | |||
76561198062300654 Rawls | |||
76561198068098265 Brendy Flannel | |||
76561198065642391 Therefore | |||
76561198121369685 DataFrogman |
@ -0,0 +1,320 @@ | |||
76561198035606013 76561198069739846 | |||
76561198035606013 76561198065642391 | |||
76561198035606013 76561198057450983 | |||
76561198035606013 76561198131175960 | |||
76561198035606013 76561198094968588 | |||
76561198035606013 76561198036176189 | |||
76561198084464357 76561198036270560 | |||
76561198084464357 76561198017734545 | |||
76561198084464357 76561198065642391 | |||
76561198084464357 76561198133044936 | |||
76561198084464357 76561198085584420 | |||
76561198084464357 76561198306786411 | |||
76561198084464357 76561198111538799 | |||
76561198084464357 76561198057450983 | |||
76561198084464357 76561198255835078 | |||
76561198084464357 76561198069739485 | |||
76561198084464357 76561198176504246 | |||
76561198084464357 76561198086854442 | |||
76561198084464357 76561198107069713 | |||
76561198084464357 76561198406334664 | |||
76561198084464357 76561198069739846 | |||
76561198084464357 76561198068098265 | |||
76561198084464357 76561198062300654 | |||
76561198084464357 76561198131175960 | |||
76561198084464357 76561198094968588 | |||
76561198084464357 76561198036176189 | |||
76561198036270560 76561198084464357 | |||
76561198036270560 76561198095814450 | |||
76561198036270560 76561198062300654 | |||
76561198036270560 76561198049526995 | |||
76561198036270560 76561198057450983 | |||
76561198036270560 76561198131175960 | |||
76561198036270560 76561198255835078 | |||
76561198121369685 76561198068098265 | |||
76561198121369685 76561198192510666 | |||
76561198121369685 76561198085584420 | |||
76561198121369685 76561198162654610 | |||
76561198121369685 76561198086854442 | |||
76561198065642391 76561198035606013 | |||
76561198065642391 76561198084464357 | |||
76561198065642391 76561198017734545 | |||
76561198065642391 76561198133044936 | |||
76561198065642391 76561198306786411 | |||
76561198065642391 76561198095814450 | |||
76561198065642391 76561198057450983 | |||
76561198065642391 76561198069739485 | |||
76561198065642391 76561198176504246 | |||
76561198065642391 76561198069739846 | |||
76561198065642391 76561198137304077 | |||
76561198065642391 76561198062300654 | |||
76561198065642391 76561198049526995 | |||
76561198065642391 76561198083124245 | |||
76561198065642391 76561198047367972 | |||
76561198065642391 76561198131175960 | |||
76561198065642391 76561198094968588 | |||
76561198065642391 76561198036176189 | |||
76561198085584420 76561198107069713 | |||
76561198085584420 76561198084464357 | |||
76561198085584420 76561198406334664 | |||
76561198085584420 76561198068098265 | |||
76561198085584420 76561198121369685 | |||
76561198085584420 76561198192510666 | |||
76561198085584420 76561198162654610 | |||
76561198085584420 76561198086854442 | |||
76561198095814450 76561198036270560 | |||
76561198095814450 76561198065642391 | |||
76561198095814450 76561198133044936 | |||
76561198095814450 76561198306786411 | |||
76561198095814450 76561198099625445 | |||
76561198095814450 76561198057450983 | |||
76561198095814450 76561198069739485 | |||
76561198095814450 76561198255835078 | |||
76561198095814450 76561198069739846 | |||
76561198095814450 76561198062300654 | |||
76561198095814450 76561198049526995 | |||
76561198095814450 76561198047367972 | |||
76561198095814450 76561198131175960 | |||
76561198095814450 76561198036176189 | |||
76561198111538799 76561198107069713 | |||
76561198111538799 76561198084464357 | |||
76561198111538799 76561198406334664 | |||
76561198111538799 76561198068098265 | |||
76561198111538799 76561198192510666 | |||
76561198111538799 76561198162654610 | |||
76561198111538799 76561198086854442 | |||
76561198057450983 76561198035606013 | |||
76561198057450983 76561198084464357 | |||
76561198057450983 76561198036270560 | |||
76561198057450983 76561198017734545 | |||
76561198057450983 76561198098761042 | |||
76561198057450983 76561198065642391 | |||
76561198057450983 76561198133044936 | |||
76561198057450983 76561198306786411 | |||
76561198057450983 76561198095814450 | |||
76561198057450983 76561198255835078 | |||
76561198057450983 76561198069739485 | |||
76561198057450983 76561198176504246 | |||
76561198057450983 76561198069739846 | |||
76561198057450983 76561198137304077 | |||
76561198057450983 76561198062300654 | |||
76561198057450983 76561198049526995 | |||
76561198057450983 76561198306443796 | |||
76561198057450983 76561198036176189 | |||
76561198099625445 76561198069739846 | |||
76561198099625445 76561198095814450 | |||
76561198099625445 76561198094968588 | |||
76561198099625445 76561198176504246 | |||
76561198255835078 76561198084464357 | |||
76561198255835078 76561198036270560 | |||
76561198255835078 76561198069739846 | |||
76561198255835078 76561198017734545 | |||
76561198255835078 76561198095814450 | |||
76561198255835078 76561198062300654 | |||
76561198255835078 76561198057450983 | |||
76561198255835078 76561198131175960 | |||
76561198233398192 76561198137304077 | |||
76561198233398192 76561198066260593 | |||
76561198233398192 76561198133044936 | |||
76561198233398192 76561198170096391 | |||
76561198055948417 76561198306786411 | |||
76561198086854442 76561198107069713 | |||
76561198086854442 76561198084464357 | |||
76561198086854442 76561198406334664 | |||
76561198086854442 76561198068098265 | |||
76561198086854442 76561198121369685 | |||
76561198086854442 76561198192510666 | |||
76561198086854442 76561198085584420 | |||
76561198086854442 76561198111538799 | |||
76561198176504246 76561198084464357 | |||
76561198176504246 76561198065642391 | |||
76561198176504246 76561198306786411 | |||
76561198176504246 76561198099625445 | |||
76561198176504246 76561198057450983 | |||
76561198176504246 76561198131175960 | |||
76561198107069713 76561198084464357 | |||
76561198107069713 76561198068098265 | |||
76561198107069713 76561198192510666 | |||
76561198107069713 76561198085584420 | |||
76561198107069713 76561198111538799 | |||
76561198107069713 76561198162654610 | |||
76561198107069713 76561198086854442 | |||
76561198406334664 76561198084464357 | |||
76561198406334664 76561198068098265 | |||
76561198406334664 76561198085584420 | |||
76561198406334664 76561198111538799 | |||
76561198406334664 76561198086854442 | |||
76561198137304077 76561198066260593 | |||
76561198137304077 76561198065642391 | |||
76561198137304077 76561198133044936 | |||
76561198137304077 76561198062300654 | |||
76561198137304077 76561198047367972 | |||
76561198137304077 76561198057450983 | |||
76561198137304077 76561198170096391 | |||
76561198137304077 76561198233398192 | |||
76561198062300654 76561198084464357 | |||
76561198062300654 76561198036270560 | |||
76561198062300654 76561198017734545 | |||
76561198062300654 76561198065642391 | |||
76561198062300654 76561198133044936 | |||
76561198062300654 76561198095814450 | |||
76561198062300654 76561198057450983 | |||
76561198062300654 76561198255835078 | |||
76561198062300654 76561198069739485 | |||
76561198062300654 76561198069739846 | |||
76561198062300654 76561198137304077 | |||
76561198062300654 76561198049526995 | |||
76561198062300654 76561198131175960 | |||
76561198062300654 76561198094968588 | |||
76561198062300654 76561198036176189 | |||
76561198083124245 76561198065642391 | |||
76561198083124245 76561198036176189 | |||
76561198047367972 76561198017734545 | |||
76561198047367972 76561198137304077 | |||
76561198047367972 76561198065642391 | |||
76561198047367972 76561198133044936 | |||
76561198047367972 76561198095814450 | |||
76561198047367972 76561198049526995 | |||
76561198047367972 76561198131175960 | |||
76561198047367972 76561198069739485 | |||
76561198094968588 76561198035606013 | |||
76561198094968588 76561198084464357 | |||
76561198094968588 76561198069739846 | |||
76561198094968588 76561198017734545 | |||
76561198094968588 76561198065642391 | |||
76561198094968588 76561198062300654 | |||
76561198094968588 76561198099625445 | |||
76561198094968588 76561198036176189 | |||
76561198170096391 76561198137304077 | |||
76561198170096391 76561198066260593 | |||
76561198170096391 76561198133044936 | |||
76561198170096391 76561198233398192 | |||
76561198036176189 76561198035606013 | |||
76561198036176189 76561198084464357 | |||
76561198036176189 76561198069739846 | |||
76561198036176189 76561198098761042 | |||
76561198036176189 76561198065642391 | |||
76561198036176189 76561198133044936 | |||
76561198036176189 76561198095814450 | |||
76561198036176189 76561198062300654 | |||
76561198036176189 76561198083124245 | |||
76561198036176189 76561198057450983 | |||
76561198036176189 76561198094968588 | |||
76561198036176189 76561198069739485 | |||
76561198017734545 76561198084464357 | |||
76561198017734545 76561198069739846 | |||
76561198017734545 76561198133044936 | |||
76561198017734545 76561198098761042 | |||
76561198017734545 76561198065642391 | |||
76561198017734545 76561198062300654 | |||
76561198017734545 76561198049526995 | |||
76561198017734545 76561198047367972 | |||
76561198017734545 76561198057450983 | |||
76561198017734545 76561198094968588 | |||
76561198017734545 76561198255835078 | |||
76561198017734545 76561198069739485 | |||
76561198133044936 76561198084464357 | |||
76561198133044936 76561198017734545 | |||
76561198133044936 76561198066260593 | |||
76561198133044936 76561198065642391 | |||
76561198133044936 76561198095814450 | |||
76561198133044936 76561198057450983 | |||
76561198133044936 76561198233398192 | |||
76561198133044936 76561198069739485 | |||
76561198133044936 76561198062501319 | |||
76561198133044936 76561198069739846 | |||
76561198133044936 76561198137304077 | |||
76561198133044936 76561198062300654 | |||
76561198133044936 76561198049526995 | |||
76561198133044936 76561198067517157 | |||
76561198133044936 76561198047367972 | |||
76561198133044936 76561198170096391 | |||
76561198133044936 76561198036176189 | |||
76561198098761042 76561198017734545 | |||
76561198098761042 76561198057450983 | |||
76561198098761042 76561198306443796 | |||
76561198098761042 76561198036176189 | |||
76561198066260593 76561198133044936 | |||
76561198066260593 76561198137304077 | |||
76561198066260593 76561198170096391 | |||
76561198066260593 76561198233398192 | |||
76561198306786411 76561198084464357 | |||
76561198306786411 76561198069739846 | |||
76561198306786411 76561198065642391 | |||
76561198306786411 76561198095814450 | |||
76561198306786411 76561198057450983 | |||
76561198306786411 76561198131175960 | |||
76561198306786411 76561198055948417 | |||
76561198306786411 76561198176504246 | |||
76561198162654610 76561198107069713 | |||
76561198162654610 76561198121369685 | |||
76561198162654610 76561198192510666 | |||
76561198162654610 76561198085584420 | |||
76561198162654610 76561198111538799 | |||
76561198069739485 76561198084464357 | |||
76561198069739485 76561198017734545 | |||
76561198069739485 76561198069739846 | |||
76561198069739485 76561198065642391 | |||
76561198069739485 76561198133044936 | |||
76561198069739485 76561198095814450 | |||
76561198069739485 76561198062300654 | |||
76561198069739485 76561198049526995 | |||
76561198069739485 76561198047367972 | |||
76561198069739485 76561198057450983 | |||
76561198069739485 76561198131175960 | |||
76561198069739485 76561198036176189 | |||
76561198062501319 76561198133044936 | |||
76561198069739846 76561198035606013 | |||
76561198069739846 76561198084464357 | |||
76561198069739846 76561198017734545 | |||
76561198069739846 76561198065642391 | |||
76561198069739846 76561198133044936 | |||
76561198069739846 76561198306786411 | |||
76561198069739846 76561198095814450 | |||
76561198069739846 76561198099625445 | |||
76561198069739846 76561198057450983 | |||
76561198069739846 76561198069739485 | |||
76561198069739846 76561198255835078 | |||
76561198069739846 76561198062300654 | |||
76561198069739846 76561198131175960 | |||
76561198069739846 76561198094968588 | |||
76561198069739846 76561198036176189 | |||
76561198068098265 76561198107069713 | |||
76561198068098265 76561198084464357 | |||
76561198068098265 76561198406334664 | |||
76561198068098265 76561198121369685 | |||
76561198068098265 76561198192510666 | |||
76561198068098265 76561198085584420 | |||
76561198068098265 76561198111538799 | |||
76561198068098265 76561198086854442 | |||
76561198192510666 76561198107069713 | |||
76561198192510666 76561198068098265 | |||
76561198192510666 76561198121369685 | |||
76561198192510666 76561198085584420 | |||
76561198192510666 76561198111538799 | |||
76561198192510666 76561198162654610 | |||
76561198192510666 76561198086854442 | |||
76561198049526995 76561198036270560 | |||
76561198049526995 76561198017734545 | |||
76561198049526995 76561198065642391 | |||
76561198049526995 76561198133044936 | |||
76561198049526995 76561198095814450 | |||
76561198049526995 76561198062300654 | |||
76561198049526995 76561198047367972 | |||
76561198049526995 76561198057450983 | |||
76561198049526995 76561198069739485 | |||
76561198067517157 76561198133044936 | |||
76561198131175960 76561198035606013 | |||
76561198131175960 76561198084464357 | |||
76561198131175960 76561198036270560 | |||
76561198131175960 76561198069739846 | |||
76561198131175960 76561198065642391 | |||
76561198131175960 76561198306786411 | |||
76561198131175960 76561198095814450 | |||
76561198131175960 76561198062300654 | |||
76561198131175960 76561198047367972 | |||
76561198131175960 76561198255835078 | |||
76561198131175960 76561198069739485 | |||
76561198131175960 76561198176504246 | |||
76561198306443796 76561198098761042 | |||
76561198306443796 76561198057450983 |
@ -0,0 +1,39 @@ | |||
76561198084464357 0.22637059 0.17309421 -0.047417082 -0.19539477 -0.376943 -0.022090694 0.12190686 0.006333136 0.17078407 -0.16434675 -0.14344274 0.0707061 0.03752186 0.09877573 -0.22592762 0.10418106 0.14492817 0.15903844 -0.18958774 -0.024045361 -0.13320665 -0.06923964 -0.12813589 -0.3280573 0.13117692 -0.015366782 -0.12967604 -0.035129875 0.01031167 -0.011651808 -0.12473403 0.074550755 -0.06524019 -0.08758856 -0.019999007 -0.022523584 -0.004174753 -0.03748225 -0.046775363 -0.013586961 -0.2888517 -0.04860712 -0.19155592 -0.0029932323 0.2037822 0.18742456 -0.24540155 0.3507938 -0.109798744 -0.10331786 | |||
76561198057450983 0.18881463 0.10484256 -0.07110202 -0.24082139 -0.40187156 0.11362265 0.18980016 0.06074355 0.3114207 -0.35041252 -0.084652916 -0.03986029 -0.057815213 0.061492413 -0.12260288 0.022724794 0.15843162 0.15134184 -0.07626594 -0.10567249 -0.31308064 -0.016841307 -0.04648596 -0.18032297 0.20023072 -0.10150606 -0.183425 0.035480183 0.12023826 0.01781087 -0.08787196 0.0135735255 -0.09438313 -0.040423732 0.025793772 -0.16082627 -0.02614664 -0.043824583 -0.03541194 0.101386406 -0.26133397 0.01812578 -0.14152019 -0.016886769 0.11592071 0.14048438 -0.213555 0.26810238 -0.23459966 0.022427179 | |||
76561198065642391 0.16117236 0.12707286 -0.049071565 -0.22475749 -0.38269418 0.08124416 0.16345559 0.026218422 0.24946508 -0.29118553 -0.032005124 -0.013123474 -0.037144214 0.099733986 -0.16442856 0.017743498 0.20041893 0.15649626 -0.115774125 -0.076802604 -0.273641 -0.037228003 -0.05052939 -0.20305239 0.17849866 -0.09719955 -0.15639313 0.03444168 0.1260998 -0.019039676 -0.0982309 0.04167126 -0.12563835 -0.03058053 0.0019653616 -0.16748299 -0.019394407 -0.07811248 -0.04692965 0.08688936 -0.31315535 -0.0038551528 -0.1597786 0.021446709 0.13752647 0.1296905 -0.24591756 0.2978024 -0.24371934 0.029849164 | |||
76561198133044936 0.079512894 0.07041713 -0.018858409 -0.22705422 -0.407911 0.13462968 0.19161797 -0.023506047 0.3192814 -0.27165064 -0.23337689 -0.11832532 -0.07606436 0.053831678 -0.05066651 0.08262957 0.31861186 0.18440625 -0.06490549 -0.10523448 -0.28386927 0.10107621 -0.14824352 -0.13747391 0.22416355 0.052063297 -0.07368989 0.029049309 0.21563941 0.14961143 -0.14053574 0.07976514 -0.10555467 -0.09587351 -0.0548718 -0.1019019 -0.11951104 0.014595861 -0.13663863 0.020653818 -0.25344658 -0.022718936 -0.22289884 -0.048778895 0.0401405 0.12216337 -0.3172736 0.09288634 -0.070460975 0.05220961 | |||
76561198062300654 0.22250521 0.11693102 -0.077717416 -0.2627228 -0.43860975 0.102072835 0.2164471 0.08948511 0.31378153 -0.39153564 -0.044383664 0.002873929 -0.037035033 0.08218612 -0.17385834 0.02304037 0.14096145 0.1758448 -0.09229181 -0.12743269 -0.30886117 -0.040116988 -0.024903556 -0.21198611 0.18670943 -0.15098059 -0.19961299 0.06701814 0.11677947 -0.029612694 -0.08474066 0.019907234 -0.09353158 -0.0077796727 0.055685442 -0.1557845 0.0004210872 -0.074875124 0.0012693922 0.12909964 -0.242743 0.020810105 -0.08904973 0.022175908 0.08994497 0.08945654 -0.1655352 0.25148526 -0.26067913 0.031106705 | |||
76561198069739846 0.19302638 0.10344062 -0.05425505 -0.23925813 -0.37238845 0.10448243 0.18253765 0.0435905 0.30280897 -0.3441143 -0.0683461 -0.031187892 -0.05977858 0.076245785 -0.13491338 0.014964683 0.1530082 0.17164314 -0.06370337 -0.109781586 -0.31881398 -0.027924553 -0.05530244 -0.17358772 0.2097243 -0.121022895 -0.20274468 0.06456121 0.15158892 0.0050261877 -0.092144236 0.020480443 -0.12846431 -0.032061853 0.0320777 -0.17494796 -0.01790394 -0.062649004 -0.033561904 0.1082481 -0.30862418 0.020739578 -0.1329093 -0.009725911 0.10687202 0.109754115 -0.22186637 0.27921742 -0.26998332 0.053189274 | |||
76561198095814450 0.16667746 0.091015086 -0.07347555 -0.26523334 -0.40914062 0.14942275 0.24062552 0.09428762 0.32831088 -0.3834571 -0.02174694 -0.08062243 -0.0940943 0.08172432 -0.097146705 -0.028984185 0.16745195 0.17733684 -0.04802745 -0.10639211 -0.3449221 -0.010498022 -0.034632627 -0.12991816 0.24422307 -0.14980032 -0.19625974 0.036451112 0.14554851 0.006842924 -0.06748595 0.02676372 -0.12196199 0.015600681 0.06910712 -0.22079591 -0.046598632 -0.06303662 -0.03742557 0.14238463 -0.30833668 -0.0024973517 -0.112285316 -0.0047185267 0.1459727 0.14589567 -0.20610014 0.294961 -0.288551 0.05864515 | |||
76561198036176189 0.2181946 0.1456158 -0.063216165 -0.23596789 -0.44432867 0.08354943 0.22378144 0.05557387 0.29959002 -0.37387443 -0.013365661 -0.011593603 -0.06839467 0.093986765 -0.19268224 -0.020571794 0.14974935 0.1518645 -0.10864363 -0.10048686 -0.34091967 -0.03928709 -0.001949952 -0.19133992 0.19132295 -0.16518652 -0.21802539 0.0792085 0.14096105 -0.05009671 -0.111111246 0.024421113 -0.122660846 -0.032062966 0.030396989 -0.19005105 0.007291107 -0.07750875 0.018624594 0.12822498 -0.2684167 0.019973218 -0.106695384 0.008099264 0.07790111 0.06015877 -0.18536285 0.2666641 -0.29988953 0.06108308 | |||
76561198017734545 0.1844068 0.10791857 -0.055086304 -0.22677076 -0.42117056 0.1191463 0.24901557 0.0691128 0.34359846 -0.38548806 -0.073591605 -0.05741242 -0.07418889 0.10757234 -0.14173773 0.0137533955 0.21219616 0.17369936 -0.079123504 -0.096924774 -0.39793384 0.011017707 -0.06763745 -0.1768744 0.2463748 -0.15990648 -0.23136435 0.07388335 0.20901404 0.0055857403 -0.124804035 0.017127799 -0.13264523 -0.030653091 0.05313412 -0.23143743 -0.043516915 -0.06925246 -0.014446211 0.10092704 -0.2313569 0.017327696 -0.060766846 -0.028390046 0.01359708 0.024991293 -0.17798783 0.22584164 -0.24291082 0.085779786 | |||
76561198131175960 0.18709633 0.1159048 -0.06235683 -0.24904335 -0.41933104 0.1329422 0.23412463 0.06185049 0.3241728 -0.36808455 -0.06263462 -0.054166023 -0.0819914 0.093538426 -0.13308565 0.002593986 0.18274297 0.1613406 -0.06707555 -0.10734584 -0.34892014 -0.018364865 -0.03199263 -0.1609787 0.20114924 -0.11629508 -0.1870345 0.048710063 0.14726876 0.0050412286 -0.096454464 0.0032559463 -0.12326516 -0.014995486 0.0456062 -0.19881293 -0.03276473 -0.06482951 -0.027943596 0.114527665 -0.24728297 0.013423705 -0.10039417 -0.001298922 0.08140864 0.082277365 -0.18818747 0.23623629 -0.23898323 0.06907876 | |||
76561198069739485 0.16863635 0.10223341 -0.060545985 -0.23197044 -0.41741177 0.10444429 0.2316712 0.06514049 0.30053082 -0.33041558 -0.05668571 -0.05348813 -0.054245885 0.0888209 -0.119278625 0.05207464 0.19055451 0.17565472 -0.09638077 -0.093090564 -0.3223323 0.007907617 -0.08228502 -0.19251926 0.23392947 -0.09926177 -0.18060961 0.024472993 0.14110212 0.039337307 -0.08071854 0.032271996 -0.111653715 0.0015317283 0.034901317 -0.16781302 -0.04611637 -0.038588554 -0.064283356 0.07447686 -0.24495794 0.019286042 -0.12717813 0.001665474 0.09649522 0.13303445 -0.18640113 0.24702369 -0.21232006 0.042585194 | |||
76561198049526995 0.16421597 0.08703316 -0.014224388 -0.28656122 -0.4452673 0.1730569 0.24652794 0.0893594 0.33507857 -0.3432222 -0.04287437 -0.09887701 -0.08301029 0.0785178 -0.10616222 0.033054214 0.22304797 0.17388679 -0.0842754 -0.110752985 -0.37500057 0.02052552 -0.08197923 -0.16772889 0.2477338 -0.10421696 -0.18422544 0.051990423 0.17595439 0.03956827 -0.09467426 0.047493536 -0.12648419 0.016369984 0.054430306 -0.18480542 -0.054272182 -0.060079213 -0.053671844 0.106657766 -0.23742117 -0.014950159 -0.09810321 0.0019860014 0.08148887 0.08952626 -0.17329475 0.19852565 -0.20817707 0.056783915 | |||
76561198086854442 0.34254107 0.30957827 -0.11524153 -0.18334594 -0.45872745 -0.16210774 0.062599085 -0.084785044 0.085214816 -0.03368019 -0.32834852 0.25391206 0.14481808 0.11519705 -0.35920364 0.29045287 0.10589501 0.12952629 -0.29110923 -0.01102346 0.08528755 -0.12225788 -0.22754893 -0.49886554 0.037407905 0.17435938 -0.011043183 -0.18952647 -0.21453218 -0.017247276 -0.24563341 0.078471065 0.010968881 -0.21681622 -0.15290259 0.26152828 0.020307522 0.054162256 -0.06659027 -0.18470995 -0.25736004 -0.024604902 -0.3297332 -0.0099238 0.4460233 0.4319575 -0.2738786 0.45831376 0.04806938 -0.38181412 | |||
76561198085584420 0.32387844 0.29968905 -0.09340624 -0.17020656 -0.4588123 -0.17199877 0.09759802 -0.07764273 0.08653636 -0.04453819 -0.33883795 0.23766832 0.15137453 0.105054416 -0.36854342 0.28447026 0.12303037 0.14410329 -0.30316597 -0.010570295 0.046115037 -0.1285634 -0.22102548 -0.5085482 0.042155243 0.12994027 -0.024931712 -0.1772889 -0.20540316 -0.039178245 -0.22197098 0.081810065 0.019409591 -0.19457516 -0.11883437 0.22094813 0.027794816 0.04066784 -0.057719074 -0.16206896 -0.22455785 -0.04280631 -0.2705832 0.00254194 0.37553343 0.34916008 -0.2524561 0.41834506 0.03628819 -0.34442592 | |||
76561198068098265 0.32968754 0.29224247 -0.09760475 -0.17074688 -0.4280352 -0.15662102 0.08407618 -0.07047733 0.1104908 -0.049096562 -0.30009216 0.2276259 0.13768554 0.10759053 -0.33203432 0.25383678 0.10350801 0.13466042 -0.28075787 0.010627751 0.05177611 -0.119647026 -0.21901429 -0.4779795 0.054432567 0.14214997 -0.025383443 -0.16434667 -0.18549423 -0.009664651 -0.20851217 0.07405772 0.009354706 -0.19233598 -0.110344075 0.20606421 0.018651392 0.052316774 -0.05603669 -0.15958522 -0.21974984 -0.0388657 -0.26515332 -0.0037708012 0.35297117 0.33556804 -0.23458849 0.39969453 0.05403758 -0.32730108 | |||
76561198255835078 0.20422879 0.1337637 -0.055301018 -0.23732188 -0.41868728 0.08202576 0.21261728 0.07931523 0.26944122 -0.3411403 -0.003033904 -0.009268218 -0.051814515 0.07968477 -0.15937214 -0.0101328 0.13801226 0.15221834 -0.10284773 -0.09293722 -0.3116927 -0.033873197 -0.030841395 -0.19593075 0.19186153 -0.16313156 -0.18322457 0.05660241 0.11838679 -0.026428936 -0.071605235 0.030191686 -0.09954815 0.00139449 0.040899087 -0.19298099 -0.004946959 -0.091355175 -0.014682736 0.109668195 -0.26626796 0.022318676 -0.115954876 0.0015445307 0.12967266 0.14838426 -0.2004102 0.31037828 -0.25866765 0.026230749 | |||
76561198094968588 0.23099363 0.15101755 -0.049652692 -0.2500952 -0.40849155 0.08924417 0.19487293 0.034900554 0.2942292 -0.36203057 -0.062242344 0.024216892 -0.048077025 0.08870414 -0.19530663 -0.01682613 0.1369601 0.16583551 -0.072400734 -0.11296437 -0.30924445 -0.06823371 -0.016871605 -0.2022507 0.17886162 -0.12835509 -0.18100967 0.06528005 0.09193228 -0.052074566 -0.11000872 0.009431187 -0.11892662 -0.038558077 0.0154938055 -0.17211698 0.003627009 -0.07355131 0.002812495 0.13359915 -0.27408114 0.024543943 -0.09876224 -0.003284637 0.10332882 0.06608704 -0.17527495 0.26352975 -0.27293444 0.01622719 | |||
76561198306786411 0.23577496 0.15582335 -0.019733993 -0.26907524 -0.46246845 0.12697245 0.17553708 0.06440576 0.2933275 -0.35662764 0.089201055 0.04344786 -0.049513053 0.13977818 -0.2230863 -0.032304075 0.1711684 0.15170828 -0.11081198 -0.12706006 -0.40165755 -0.10961717 -0.049708348 -0.23554803 0.20453718 -0.20538126 -0.20086817 0.07469057 0.14608128 -0.10709947 -0.08981632 0.041590784 -0.15272382 0.013766062 0.018011538 -0.23727441 0.03338206 -0.14506945 0.03026656 0.19288088 -0.24228245 0.027329555 -0.062434774 0.01310837 0.16087131 0.09016839 -0.11262507 0.2550445 -0.2581555 0.011757311 | |||
76561198137304077 0.05084607 0.06377567 0.029904949 -0.28008777 -0.40055475 0.16508777 0.18005909 -0.033626378 0.34804904 -0.24664168 -0.24834043 -0.17009543 -0.08987903 0.07188041 -0.029420521 0.10113487 0.3681934 0.18576343 -0.062915765 -0.112020835 -0.3517709 0.12343172 -0.18351123 -0.12096594 0.24584693 0.068532 -0.096090384 0.02159829 0.2517719 0.18457109 -0.16981202 0.07980096 -0.14879091 -0.08591049 -0.061774842 -0.10609378 -0.13957348 -0.0063995877 -0.14989343 0.025805552 -0.242199 -0.054443225 -0.20876794 -0.06542156 0.010888981 0.086591795 -0.3248936 0.029740417 -0.020795887 0.080167554 | |||
76561198047367972 0.15275417 0.09440066 -0.046161544 -0.24256153 -0.39044595 0.10920197 0.17191173 0.01972117 0.29987305 -0.29182997 -0.157382 -0.048863977 -0.038603302 0.08367885 -0.11625347 0.07863301 0.23812206 0.19126749 -0.08724187 -0.10746165 -0.28421468 0.039807376 -0.108612075 -0.18033825 0.2031557 -0.012254289 -0.12654842 0.03660974 0.16271141 0.07516582 -0.13266632 0.05608405 -0.11699921 -0.06430921 -0.008142919 -0.09756316 -0.057883263 -0.016529424 -0.05701254 0.055081207 -0.25308317 -0.020628037 -0.15820476 -0.03139943 0.07289092 0.11251792 -0.2497786 0.17986298 -0.14975126 0.020175178 | |||
76561198111538799 0.3036404 0.27613953 -0.10101969 -0.20036869 -0.47141036 -0.12553287 0.06401144 -0.119364664 0.104999974 -0.011282191 -0.41150567 0.22151628 0.12879363 0.112925746 -0.32282853 0.29434735 0.15068853 0.14617495 -0.2649083 -0.0025120883 0.04731047 -0.06054026 -0.25552198 -0.46518323 0.080555245 0.20927878 0.0035025629 -0.19554582 -0.14960007 0.028762102 -0.2655043 0.120591745 -0.0017705827 -0.22710508 -0.17538425 0.25740537 -0.0070566335 0.08758394 -0.09060272 -0.21231057 -0.22795713 -0.058392636 -0.33592728 -0.031041555 0.3482926 0.33693632 -0.29145777 0.32310814 0.11992054 -0.34634903 | |||
76561198192510666 0.3474313 0.30692083 -0.10706236 -0.1990391 -0.47386932 -0.16174832 0.053934477 -0.11045854 0.103935435 -0.01870137 -0.39013398 0.2555468 0.16538395 0.09464734 -0.36461172 0.30979285 0.10817218 0.15884669 -0.3080719 0.013434673 0.0859855 -0.10265159 -0.23406328 -0.51304233 0.052208208 0.20126481 -0.013518984 -0.19859777 -0.20180504 0.002393528 -0.23610297 0.0953092 0.02466766 -0.23664194 -0.16356464 0.29505062 0.017506557 0.092672825 -0.06693318 -0.2342259 -0.22791708 -0.03342698 -0.33860508 -0.028792575 0.38162994 0.38219008 -0.28770107 0.3755938 0.095116146 -0.38313824 | |||
76561198107069713 0.38418534 0.33296037 -0.12762368 -0.17852028 -0.45819336 -0.19529031 0.07528587 -0.083179004 0.10940843 -0.059054233 -0.37238896 0.2905615 0.16192137 0.108712904 -0.40243933 0.2736475 0.081959985 0.15972969 -0.31503195 -0.0012036243 0.07953631 -0.13735458 -0.21672371 -0.5389489 0.0392174 0.15120299 -0.027223136 -0.18476981 -0.22191137 -0.05411894 -0.23175688 0.07529672 0.052297886 -0.23222485 -0.110240415 0.23511553 0.035543308 0.05762436 -0.024124298 -0.16959715 -0.2048569 -0.050579876 -0.25984573 -0.0026981186 0.36232162 0.34324473 -0.21938014 0.41711733 0.057436377 -0.37593263 | |||
76561198036270560 0.14397192 0.08334548 -0.04469934 -0.2561699 -0.4225368 0.14867412 0.21092238 0.058282316 0.313992 -0.35724682 -0.040337965 -0.095076576 -0.06561623 0.09265195 -0.09453865 0.045526065 0.2606633 0.16861185 -0.05913528 -0.12292606 -0.35649815 0.033481017 -0.07746854 -0.12556142 0.2294217 -0.11348743 -0.16947931 0.07688432 0.19763827 0.049573503 -0.09148916 0.03140501 -0.14623797 0.00046233187 0.02777242 -0.17530276 -0.056076273 -0.050583236 -0.06638729 0.10550991 -0.27991408 0.012155746 -0.14809363 0.016292194 0.07506183 0.112898804 -0.2201068 0.20800517 -0.22228128 0.055588257 | |||
76561198035606013 0.22403184 0.13860935 -0.07170239 -0.23633002 -0.3851042 0.06962776 0.25138408 0.049882714 0.35110667 -0.39081424 -0.0784561 -0.031130273 -0.063622996 0.10138198 -0.16820188 -0.02749013 0.14189342 0.17802821 -0.08234558 -0.08815543 -0.33991873 -0.052402038 -0.01718193 -0.18273875 0.22613233 -0.13184868 -0.22050497 0.039693583 0.12279355 0.005959421 -0.09681493 -0.018152623 -0.114482865 -0.03636636 0.03285335 -0.20866942 -0.000112431924 -0.08251096 0.0045912866 0.10603749 -0.2362029 0.043653633 -0.06954407 -0.021909706 0.073642775 0.074181 -0.18845314 0.27974162 -0.2565502 0.06752613 | |||
76561198176504246 0.2284575 0.14545225 -0.046393584 -0.23783854 -0.41206592 0.09284343 0.15882511 0.028858747 0.2785178 -0.31970385 -0.050608598 0.04732327 -0.03284202 0.10197963 -0.21470807 0.023948532 0.17378537 0.16852878 -0.11449056 -0.108416624 -0.288645 -0.08230517 -0.071623296 -0.23142359 0.17396913 -0.09209991 -0.13887164 0.03040408 0.06400619 -0.041824076 -0.12375758 0.041198444 -0.10426776 -0.03620996 0.008661757 -0.11931847 -0.0121125085 -0.06188938 -0.0022041074 0.12413089 -0.25194913 -6.069077e-05 -0.10160189 0.013302347 0.16848335 0.11541641 -0.15720437 0.24258807 -0.20898528 -0.041242257 | |||
76561198121369685 0.36825195 0.32509533 -0.11736185 -0.17219964 -0.4916117 -0.20539656 0.05276573 -0.11258646 0.04586855 -0.00970232 -0.3958037 0.2975072 0.18550335 0.10964625 -0.41070074 0.33184403 0.10514816 0.15209007 -0.33077535 0.0050268155 0.112141736 -0.124768175 -0.24047749 -0.5607367 0.029459236 0.18100987 0.010657332 -0.22585817 -0.2490769 -0.0405968 -0.23392515 0.09480492 0.053320188 -0.24275787 -0.14380261 0.29350024 0.035643235 0.085761555 -0.05726756 -0.21882486 -0.22846258 -0.040771533 -0.32726178 0.014338213 0.40005514 0.3836112 -0.25366268 0.43122298 0.078945294 -0.40346253 | |||
76561198162654610 0.34695917 0.32070547 -0.10050611 -0.17910023 -0.4568615 -0.21021856 0.08406304 -0.104268186 0.10773384 -0.029855613 -0.42233047 0.28087804 0.18237478 0.11074125 -0.38688207 0.3250932 0.14440548 0.17826994 -0.33091044 0.025190417 0.090570636 -0.113041535 -0.25421536 -0.562643 0.05482017 0.20456815 -0.008464956 -0.18983297 -0.19874062 0.004034344 -0.2416712 0.10931306 0.037552014 -0.2335336 -0.13965298 0.2631763 -0.0011963076 0.070183724 -0.091388926 -0.22647984 -0.22218983 -0.0494376 -0.3240695 -0.017113559 0.3604048 0.36381122 -0.3040433 0.39249942 0.10331354 -0.36881155 | |||
76561198406334664 0.28305718 0.25869372 -0.095679 -0.18264408 -0.41270575 -0.13238613 0.06889177 -0.07670079 0.12410099 -0.067683905 -0.3341638 0.19581027 0.13485932 0.092432775 -0.31416708 0.2555328 0.11869398 0.14523543 -0.26656982 -0.019504383 0.03910543 -0.09800471 -0.22110392 -0.44035456 0.05997275 0.15466471 -0.022513755 -0.15973592 -0.16345102 0.003923755 -0.20436099 0.07741159 0.0051217885 -0.19334693 -0.12499778 0.19843556 0.008181473 0.055967722 -0.076557904 -0.15694065 -0.21828173 -0.034587182 -0.28119585 -0.013511817 0.33842176 0.35085726 -0.2671838 0.3721947 0.050504435 -0.32589602 | |||
76561198098761042 0.21111481 0.124898545 -0.06675497 -0.25015622 -0.36927617 0.07900296 0.24098006 0.10832148 0.37492865 -0.4189536 -0.09497082 -0.07379196 -0.08979049 0.04720399 -0.13692069 -0.04665753 0.10380948 0.19285686 -0.08932293 -0.08939387 -0.3550219 -0.020346515 -0.03026678 -0.16322915 0.2378477 -0.15314841 -0.24570547 0.03311747 0.15484545 0.020133022 -0.096255824 -0.00013513748 -0.09627935 -0.03387609 0.08945824 -0.25980866 -0.026094073 -0.08544189 0.00920267 0.11699284 -0.24506095 0.035363454 -0.0669694 -0.082532644 0.04892704 0.10205599 -0.21944775 0.28150722 -0.27296388 0.10587777 | |||
76561198170096391 0.0069788 0.005919656 0.051495407 -0.32079914 -0.4073266 0.23348217 0.171251 -0.06311195 0.373394 -0.2241381 -0.36583677 -0.24454768 -0.089249425 0.05788221 0.033699363 0.16043496 0.47002196 0.20430273 -0.04187704 -0.15235455 -0.3499455 0.20683546 -0.2217468 -0.06541704 0.2695047 0.19451709 -0.049059104 0.024842022 0.32965752 0.31723747 -0.24643245 0.111958995 -0.17807698 -0.12467712 -0.09345244 -0.034506533 -0.21199925 0.03258025 -0.21684842 -0.013332772 -0.261481 -0.07761844 -0.26663408 -0.0844894 -0.049469367 0.061394736 -0.42410803 -0.10678735 0.03989682 0.13155942 | |||
76561198066260593 -0.0012319235 0.0018281628 0.023123825 -0.33053738 -0.3924185 0.2472896 0.16956325 -0.0608233 0.3843416 -0.2237018 -0.33327287 -0.23764051 -0.09602595 0.043903504 0.056503646 0.14061612 0.4795503 0.20970406 -0.050004832 -0.14200833 -0.33629456 0.21809374 -0.22140649 -0.051260374 0.30881768 0.20381816 -0.030661566 0.03181241 0.3603506 0.34539744 -0.24437547 0.12426482 -0.16791798 -0.15895678 -0.13545848 -0.0553565 -0.20505448 0.045219764 -0.22169755 -0.04982665 -0.24254869 -0.07196838 -0.29574284 -0.09731388 -0.031014172 0.08635339 -0.43166023 -0.100182384 0.07344307 0.119933665 | |||
76561198233398192 0.002090749 -0.019404763 0.03552148 -0.33156437 -0.3981038 0.26195565 0.16810834 -0.040420774 0.40588227 -0.21742727 -0.37480575 -0.26947838 -0.09307771 0.045861054 0.052752934 0.14719073 0.46502012 0.22194266 -0.025898535 -0.15193766 -0.35606676 0.22763512 -0.21730317 -0.049230706 0.30872586 0.21986806 -0.06211104 0.04279583 0.37989628 0.36092278 -0.26809344 0.12603697 -0.19916567 -0.12780918 -0.106969945 -0.05540217 -0.22773463 0.03833827 -0.22044288 -0.023669915 -0.24687687 -0.1123604 -0.2749139 -0.115704335 -0.06394924 0.035009824 -0.4492996 -0.14808506 0.086609416 0.14714402 | |||
76561198099625445 0.2055478 0.12837608 -0.05503023 -0.2344446 -0.4076341 0.11420073 0.21084942 0.06502717 0.30410096 -0.36516762 0.00718494 0.0005491337 -0.05003054 0.11183439 -0.16368742 -0.01161308 0.15040927 0.17278118 -0.076006725 -0.10837558 -0.35160053 -0.06839973 -0.012475045 -0.19501446 0.1951187 -0.18213958 -0.20493712 0.082270525 0.12650141 -0.051296666 -0.08864778 0.011173826 -0.12863064 -0.005714577 0.03197137 -0.18616295 0.007001383 -0.09139288 0.01735045 0.104694255 -0.26359707 0.032273732 -0.10945158 0.017646449 0.12599283 0.09992092 -0.18550509 0.29857588 -0.261369 0.013124895 | |||
76561198306443796 0.20952201 0.1082174 -0.058894258 -0.22635081 -0.36429945 0.08868942 0.2145234 0.118072115 0.34663963 -0.38532454 -0.057764117 -0.09209741 -0.08521907 0.036962103 -0.13144097 -0.010477377 0.10396321 0.19054501 -0.096804455 -0.06677834 -0.34803393 -0.038097873 -0.059931688 -0.19666065 0.21909525 -0.14953011 -0.25832 0.040402032 0.1349521 0.011416193 -0.0735839 0.01511647 -0.08712464 -0.049181025 0.07137101 -0.21843548 -0.016298052 -0.07046689 0.012860036 0.114801824 -0.24479301 0.029679382 -0.086947955 -0.070472956 0.060814783 0.10588453 -0.2316168 0.31899905 -0.24149619 0.039814994 | |||
76561198083124245 0.18784085 0.11630195 -0.06590356 -0.20987189 -0.37137064 0.080536194 0.22644602 0.080131985 0.337934 -0.38297108 0.0010978709 -0.041674294 -0.07443796 0.10718557 -0.16031294 -0.045074925 0.11317768 0.18544613 -0.07911185 -0.09390654 -0.35544115 -0.06825034 -0.03126699 -0.19823997 0.23052976 -0.17158622 -0.2493543 0.049892716 0.14350945 -0.005205546 -0.0673639 -0.008497373 -0.12741543 0.0050176787 0.07148565 -0.24560645 -0.007314682 -0.09385316 0.015243395 0.15861993 -0.28863758 0.036965366 -0.072681546 -0.025075842 0.08361631 0.07841974 -0.19370948 0.3200258 -0.3049125 0.07649351 | |||
76561198062501319 0.06587496 0.054355495 -0.01758024 -0.28811067 -0.408295 0.2000756 0.21908408 0.005989786 0.36173987 -0.27244255 -0.25412953 -0.21298829 -0.096377134 0.07297794 -0.014620238 0.07513211 0.3740009 0.17620595 -0.0563191 -0.12347753 -0.35775837 0.124346405 -0.13421129 -0.08276982 0.26213446 0.04821704 -0.12654042 0.039581597 0.31390294 0.21367665 -0.20093554 0.0543149 -0.17631225 -0.1054289 -0.034343824 -0.13611986 -0.15922198 -0.013324192 -0.1355989 0.021675432 -0.2505345 -0.054176256 -0.1918642 -0.07296861 -0.021516832 0.0506421 -0.34379992 0.056857232 -0.09682778 0.13625515 | |||
76561198055948417 0.24326533 0.2160671 -0.02706927 -0.2864412 -0.4753786 0.10273929 0.14638449 0.032030385 0.28945908 -0.32167968 0.04248631 0.0785814 -0.036810715 0.15118515 -0.24673927 -0.047023214 0.158946 0.14187415 -0.12522215 -0.11113887 -0.3256903 -0.11801299 -0.055638634 -0.24089533 0.18373406 -0.15424119 -0.14814895 -0.0064601693 0.06938204 -0.121468335 -0.103591695 0.028775329 -0.13639693 0.013498841 0.006718703 -0.19217138 0.018144151 -0.13041031 0.03014829 0.16025434 -0.24780382 -0.033504553 -0.044934288 -0.005349496 0.21337706 0.09522274 -0.07615483 0.2574353 -0.20301828 -0.036485445 | |||
76561198067517157 0.045390874 0.04874821 -0.0034944667 -0.27203554 -0.38045105 0.20452732 0.22411284 -0.0021262174 0.3592525 -0.2700214 -0.26435822 -0.239218 -0.118945226 0.07518768 -0.013540715 0.06506123 0.37545067 0.19849579 -0.054887153 -0.1295746 -0.38225782 0.13126 -0.16380523 -0.08588551 0.2648634 0.06802869 -0.1167201 0.03737488 0.3099814 0.23071188 -0.19691646 0.059150826 -0.1732653 -0.09852894 -0.020030558 -0.15594837 -0.17611912 -0.011522908 -0.15991443 0.0257558 -0.25372055 -0.060826913 -0.18793182 -0.07687972 -0.007320919 0.08122364 -0.34911227 0.060074463 -0.08621058 0.13632911 |
@ -0,0 +1,284 @@ | |||
{ | |||
"cells": [ | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 1, | |||
"metadata": {}, | |||
"outputs": [], | |||
"source": [ | |||
"import gensim\n" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 4, | |||
"metadata": {}, | |||
"outputs": [], | |||
"source": [ | |||
"model = gensim.models.KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', binary=True) " | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 6, | |||
"metadata": {}, | |||
"outputs": [ | |||
{ | |||
"data": { | |||
"text/plain": [ | |||
"[('hi', 0.654898464679718),\n", | |||
" ('goodbye', 0.639905571937561),\n", | |||
" ('howdy', 0.6310957074165344),\n", | |||
" ('goodnight', 0.5920578241348267),\n", | |||
" ('greeting', 0.5855878591537476),\n", | |||
" ('Hello', 0.5842196941375732),\n", | |||
" (\"g'day\", 0.5754077434539795),\n", | |||
" ('See_ya', 0.5688871145248413),\n", | |||
" ('ya_doin', 0.5643119812011719),\n", | |||
" ('greet', 0.5636603832244873)]" | |||
] | |||
}, | |||
"execution_count": 6, | |||
"metadata": {}, | |||
"output_type": "execute_result" | |||
} | |||
], | |||
"source": [ | |||
"model.most_similar(\"hello\")" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 8, | |||
"metadata": {}, | |||
"outputs": [ | |||
{ | |||
"data": { | |||
"text/plain": [ | |||
"[('coders', 0.6104331612586975),\n", | |||
" ('coder', 0.6063331365585327),\n", | |||
" ('Coding', 0.5804804563522339),\n", | |||
" ('formatting', 0.5671651363372803),\n", | |||
" ('soluble_receptors', 0.5576372146606445),\n", | |||
" ('ICD9', 0.5571348667144775),\n", | |||
" ('refactoring', 0.5495434999465942),\n", | |||
" ('database_schemas', 0.5372464656829834),\n", | |||
" ('recode', 0.534299373626709),\n", | |||
" ('XHTML_CSS', 0.5328801870346069)]" | |||
] | |||
}, | |||
"execution_count": 8, | |||
"metadata": {}, | |||
"output_type": "execute_result" | |||
} | |||
], | |||
"source": [ | |||
"model.most_similar(\"coding\")" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 9, | |||
"metadata": {}, | |||
"outputs": [ | |||
{ | |||
"data": { | |||
"text/plain": [ | |||
"[('cats', 0.8099379539489746),\n", | |||
" ('dog', 0.7609456777572632),\n", | |||
" ('kitten', 0.7464985251426697),\n", | |||
" ('feline', 0.7326233983039856),\n", | |||
" ('beagle', 0.7150583267211914),\n", | |||
" ('puppy', 0.7075453996658325),\n", | |||
" ('pup', 0.6934291124343872),\n", | |||
" ('pet', 0.6891531348228455),\n", | |||
" ('felines', 0.6755931377410889),\n", | |||
" ('chihuahua', 0.6709762215614319)]" | |||
] | |||
}, | |||
"execution_count": 9, | |||
"metadata": {}, | |||
"output_type": "execute_result" | |||
} | |||
], | |||
"source": [ | |||
"model.most_similar(\"cat\")" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 16, | |||
"metadata": {}, | |||
"outputs": [ | |||
{ | |||
"name": "stdout", | |||
"output_type": "stream", | |||
"text": [ | |||
"hi globe \n" | |||
] | |||
} | |||
], | |||
"source": [ | |||
"def transformSentence(sentence):\n", | |||
" outputSentence = \"\"\n", | |||
" \n", | |||
" for word in sentence.split(\" \"):\n", | |||
" try:\n", | |||
" outputSentence += model.most_similar(word)[0][0] + \" \"\n", | |||
" except Exception:\n", | |||
" outputSentence += word + \" \"\n", | |||
" return outputSentence\n", | |||
"\n", | |||
"print(transformSentence(\"hello world\"))" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 12, | |||
"metadata": {}, | |||
"outputs": [ | |||
{ | |||
"name": "stdout", | |||
"output_type": "stream", | |||
"text": [ | |||
"looks Mom No hand \n" | |||
] | |||
} | |||
], | |||
"source": [ | |||
"print(transformSentence(\"look mom no hands\"))" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 17, | |||
"metadata": {}, | |||
"outputs": [ | |||
{ | |||
"name": "stdout", | |||
"output_type": "stream", | |||
"text": [ | |||
"This gen_eral concept of Clustering was to groups Data wtih similiar trait \n" | |||
] | |||
} | |||
], | |||
"source": [ | |||
"print(transformSentence(\"The general idea of clustering is to group data with similar traits\"))" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 52, | |||
"metadata": {}, | |||
"outputs": [ | |||
{ | |||
"name": "stdout", | |||
"output_type": "stream", | |||
"text": [ | |||
"This manager concept of clusters was to groups datasets wtih similiar traits. \n" | |||
] | |||
} | |||
], | |||
"source": [ | |||
"def removeFromString(string, chars):\n", | |||
" for c in chars:\n", | |||
" string = string.replace(c, \"\")\n", | |||
" return string\n", | |||
"\n", | |||
"\n", | |||
"def transformSentenceWithHeuristic(sentence):\n", | |||
" outputSentence = \"\"\n", | |||
" \n", | |||
" for word in sentence.split(\" \"):\n", | |||
" try:\n", | |||
" changed = False\n", | |||
" for w, _ in model.most_similar(word):\n", | |||
" clean = removeFromString(w, [' ', '_']).lower()\n", | |||
" if clean not in word.lower() and \"_\" not in w:\n", | |||
" outputSentence += w + \" \"\n", | |||
" changed = True\n", | |||
" break\n", | |||
" outputSentence = outputSentence if changed else outputSentence + word + \" \"\n", | |||
" except Exception:\n", | |||
" outputSentence += word + \" \"\n", | |||
" return outputSentence\n", | |||
"print(transformSentenceWithHeuristic(\"The general idea of clustering is to group data with similar traits.\"))" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 53, | |||
"metadata": {}, | |||
"outputs": [ | |||
{ | |||
"name": "stdout", | |||
"output_type": "stream", | |||
"text": [ | |||
"Relax up and grabbing a drinks but that was day it I talking abut this hallucinogenic trips it was this 1981 film Fever Treatment. \n" | |||
] | |||
} | |||
], | |||
"source": [ | |||
"print(transformSentenceWithHeuristic(\"Sit down and grab a drink because it is time that we talk about the LSD trip that is the 1981 movie Shock Treatment.\"))" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
"execution_count": 54, | |||
"metadata": {}, | |||
"outputs": [], | |||
"source": [ | |||
"from sklearn.decomposition import IncrementalPCA # inital reduction\n", | |||
"from sklearn.manifold import TSNE # final reduction\n", | |||
"import numpy as np # array handling\n", | |||
"\n", | |||
"\n", | |||
"def reduce_dimensions(model):\n", | |||
" num_dimensions = 2 # final num dimensions (2D, 3D, etc)\n", | |||
"\n", | |||
" vectors = [] # positions in vector space\n", | |||
" labels = [] # keep track of words to label our data again later\n", | |||
" for word in model.wv.vocab:\n", | |||
" vectors.append(model.wv[word])\n", | |||
" labels.append(word)\n", | |||
"\n", | |||
" # convert both lists into numpy vectors for reduction\n", | |||
" vectors = np.asarray(vectors)\n", | |||
" labels = np.asarray(labels)\n", | |||
"\n", | |||
" # reduce using t-SNE\n", | |||
" vectors = np.asarray(vectors)\n", | |||
" tsne = TSNE(n_components=num_dimensions, random_state=0)\n", | |||
" vectors = tsne.fit_transform(vectors)\n", | |||
"\n", | |||
" x_vals = [v[0] for v in vectors]\n", | |||
" y_vals = [v[1] for v in vectors]\n", | |||
" return x_vals, y_vals, labels\n", | |||
"\n", | |||
"\n", | |||
"#x_vals, y_vals, labels = reduce_dimensions(model)" | |||
] | |||
} | |||
], | |||
"metadata": { | |||
"kernelspec": { | |||
"display_name": "Python 3", | |||
"language": "python", | |||
"name": "python3" | |||
}, | |||
"language_info": { | |||
"codemirror_mode": { | |||
"name": "ipython", | |||
"version": 3 | |||
}, | |||
"file_extension": ".py", | |||
"mimetype": "text/x-python", | |||
"name": "python", | |||
"nbconvert_exporter": "python", | |||
"pygments_lexer": "ipython3", | |||
"version": "3.8.1" | |||
} | |||
}, | |||
"nbformat": 4, | |||
"nbformat_minor": 4 | |||
} |
@ -0,0 +1,82 @@ | |||
# Python program for Dijkstra's single | |||
# source shortest path algorithm. The program is | |||
# for adjacency matrix representation of the graph | |||
# Library for INT_MAX | |||
import sys | |||
class Graph(): | |||
def __init__(self, vertices): | |||
self.V = vertices | |||
self.graph = [[0 for column in range(vertices)] | |||
for row in range(vertices)] | |||
def printSolution(self, dist): | |||
print "Vertex tDistance from Source" | |||
for node in range(self.V): | |||
print node, "t", dist[node] | |||
# A utility function to find the vertex with | |||
# minimum distance value, from the set of vertices | |||
# not yet included in shortest path tree | |||
def minDistance(self, dist, sptSet): | |||
# Initilaize minimum distance for next node | |||
min = sys.maxint | |||
# Search not nearest vertex not in the | |||
# shortest path tree | |||
for v in range(self.V): | |||
if dist[v] < min and sptSet[v] == False: | |||
min = dist[v] | |||
min_index = v | |||
return min_index | |||
# Funtion that implements Dijkstra's single source | |||
# shortest path algorithm for a graph represented | |||
# using adjacency matrix representation | |||
def dijkstra(self, src): | |||
dist = [sys.maxint] * self.V | |||
dist[src] = 0 | |||
sptSet = [False] * self.V | |||
for cout in range(self.V): | |||
# Pick the minimum distance vertex from | |||
# the set of vertices not yet processed. | |||
# u is always equal to src in first iteration | |||
u = self.minDistance(dist, sptSet) | |||
# Put the minimum distance vertex in the | |||
# shotest path tree | |||
sptSet[u] = True | |||
# Update dist value of the adjacent vertices | |||
# of the picked vertex only if the current | |||
# distance is greater than new distance and | |||
# the vertex in not in the shotest path tree | |||
for v in range(self.V): | |||
if self.graph[u][v] > 0 and sptSet[v] == False and \ | |||
dist[v] > dist[u] + self.graph[u][v]: | |||
dist[v] = dist[u] + self.graph[u][v] | |||
self.printSolution(dist) | |||
# Driver program | |||
g = Graph(9) | |||
g.graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0], | |||
[4, 0, 8, 0, 0, 0, 0, 11, 0], | |||
[0, 8, 0, 7, 0, 4, 0, 0, 2], | |||
[0, 0, 7, 0, 9, 14, 0, 0, 0], | |||
[0, 0, 0, 9, 0, 10, 0, 0, 0], | |||
[0, 0, 4, 14, 10, 0, 2, 0, 0], | |||
[0, 0, 0, 0, 0, 2, 0, 1, 6], | |||
[8, 11, 0, 0, 0, 0, 1, 0, 7], | |||
[0, 0, 2, 0, 0, 0, 6, 7, 0] | |||
]; | |||
g.dijkstra(0); | |||
@ -0,0 +1,52 @@ | |||
""" | |||
Jeffery Russell | |||
12-1-18 | |||
""" | |||
def knapsack(V, W, capacity): | |||
""" | |||
Dynamic programming implementation of the knapsack problem | |||
:param V: List of the values | |||
:param W: List of weights | |||
:param capacity: max capacity of knapsack | |||
:return: List of tuples of objects stolen in form (w, v) | |||
""" | |||
choices = [[[] for i in range(capacity + 1)] for j in range(len(V) + 1)] | |||
cost = [[0 for i in range(capacity + 1)] for j in range(len(V) + 1)] | |||
for i in range(0, len(V)): | |||
for j in range(0, capacity + 1): | |||
if W[i] > j: # don't include another item | |||
cost[i][j] = cost[i -1][j] | |||
choices[i][j] = choices[i - 1][j] | |||
else: # Adding another item | |||
cost[i][j] = max(cost[i-1][j], cost[i-1][j - W[i]] + V[i]) | |||
if cost[i][j] != cost[i-1][j]: | |||
choices[i][j] = choices[i - 1][j - W[i]] + [(W[i], V[i])] | |||
else: | |||
choices[i][j] = choices[i - 1][j] | |||
return choices[len(V) -1][capacity] | |||
def printSolution(S): | |||
""" | |||
Takes the output of knapsack and prints it in a | |||
pretty format. | |||
:param S: list of tuples representing items stolen | |||
:return: None | |||
""" | |||
print("Thief Took:") | |||
for i in S: | |||
print("Weight: " + str(i[0]) + "\tValue: \t" + str(i[1])) | |||
print() | |||
print("Total Value Stolen: " + str(sum(int(v[0]) for v in S))) | |||
print("Total Weight in knapsack: " + str(sum(int(v[1]) for v in S))) | |||
values = [99,1,1,1,1, 1,1] | |||
weights = [5,1,2,3,4,5,1] | |||
printSolution(knapsack(values, weights, 6)) |
@ -0,0 +1,129 @@ | |||
""" | |||
Jeffery Russell | |||
2019-4-21 | |||
Simple program to reformat paragraphs in markdown text files | |||
to follow a specific col limit. | |||
""" | |||
import os | |||
import sys | |||
def formatChunk(stringContent, charLimit): | |||
""" | |||
Formats a markdown section with with a specific | |||
col limit. This only makes changes if the section is a | |||
paragraph and nothing else. | |||
The only guarantee for the input is that there | |||
are no lines which only contain a new line or space. | |||
:param stringContent: string of markdown chunk | |||
:param charLimit: max character limit | |||
:return: formatted string | |||
""" | |||
if len(stringContent.strip(" ")) == 0: | |||
return "" | |||
elif not stringContent[0].isalpha(): | |||
return stringContent | |||
result = "" | |||
line = "" | |||
stringContent = stringContent.replace("\n", " ") | |||
words = stringContent.split(" ") | |||
for word in words: | |||
if len(line) == 0 or len(line) + len(word) < charLimit: | |||
if not len(line) == 0: | |||
line = line + " " | |||
line = line + word | |||
else: | |||
result = result + line + "\n" | |||
line = word | |||
if line != "": | |||
result = result + line + "\n" | |||
return result | |||
def writeToFile(fileName, content): | |||
""" | |||
Writes to a file, overwriting the existing | |||
output. | |||
:param fileName: | |||
:param content: | |||
:return: | |||
""" | |||
f = open(fileName, "w+") | |||
f.write(content) | |||
f.close() | |||
def wrapMarkdownParagraphsToColLimit(fileName, charLimit): | |||
""" | |||
Breaks apart a markdown file into chunks. A chunks are | |||
separated by a blank lines. Each chunk is then | |||
rendered according to our 80 char rules defined | |||
in the formatChunk section. | |||
:param fileName: | |||
:param charLimit: | |||
:return: | |||
""" | |||
result = "" | |||
tempResult = "" | |||
inCodeBlock = False | |||
with open(fileName) as file: | |||
for line in file: | |||
if line.startswith("```"): | |||
inCodeBlock = not inCodeBlock | |||
result = result + line | |||
elif inCodeBlock: | |||
result = result + line | |||
elif line.strip(" ") == "\n": | |||
result = result + formatChunk(tempResult, charLimit) | |||
tempResult = "" | |||
result = result + "\n" | |||
else: | |||
tempResult = tempResult + line | |||
if tempResult != "": | |||
result = result + formatChunk(tempResult, charLimit) | |||
return result | |||
def print_usage(): | |||
""" | |||
Prints script usage. | |||
:return: | |||
""" | |||
print("Usage: file name -t (optional)") | |||
print("\t-p simply prints the formatted output.") | |||
print("\tfile name -- runs the command overwriting the existing file.") | |||
def main(): | |||
""" | |||
Checks command line input and calls the proper formatting | |||
functions. | |||
:return: | |||
""" | |||
if len(sys.argv) > 1: | |||
fileName = os.getcwd() + "/" + sys.argv[1] | |||
if len(sys.argv) == 3 and sys.argv[2].lower() == "-p": | |||
print(wrapMarkdownParagraphsToColLimit(fileName, 70)) | |||
else: | |||
writeToFile(fileName, | |||
wrapMarkdownParagraphsToColLimit(fileName, 70)) | |||
else: | |||
print_usage() | |||
""" | |||
Makes sure that other scripts don't execute the main | |||
""" | |||
if __name__ == '__main__': | |||
try: | |||
main() | |||
except KeyboardInterrupt: | |||
panic() |
@ -0,0 +1,162 @@ | |||
import math | |||
""" | |||
Jeffery Russell | |||
11-13-18 | |||
""" | |||
def extraSpace(S, M, i, j): | |||
""" | |||
Computes the number of extra characters at the end of | |||
the line. | |||
Between each word there is only once space. | |||
:param S: List of words | |||
:param M: Max length of line | |||
:param i: start word index | |||
:param j: end word index | |||
""" | |||
extraSpaces = M - j + i | |||
for x in range(i, j + 1): | |||
extraSpaces -= len(S[x]) | |||
return extraSpaces | |||
def badnessLine(S, M, i, j): | |||
""" | |||
Computes Line badness. This is the number of | |||
extra spaces or infinity if the length exceeds M | |||
:param S: List of words | |||
:param M: Max length of line | |||
:param i: start word index | |||
:param j: end word index | |||
""" | |||
es = extraSpace(S, M, i, j) | |||
if es < 0: | |||
return math.inf | |||
return es | |||
def minBad(S, M, i): | |||
""" | |||
Computes the badness of a paragraph as the | |||
badness of the worst line in the paragraph not | |||
including the last line. | |||
*this is recursive | |||
:param S: List of words | |||
:param M: Max length of line | |||
:param i: start word index | |||
""" | |||
if badnessLine(S, M, i, len(S) -1) != math.inf: | |||
return 0 | |||
min = math.inf | |||
for k in range(i + 1, len(S)): | |||
end = minBad(S, M, k) | |||
front = badnessLine(S, M, i, k - 1) | |||
max = end if end > front else front | |||
min = min if min < max else max | |||
return min | |||
def minBadDynamic(S, M): | |||
""" | |||
Write a procedure minBadDynamic that implements | |||
the function mb' using dynamic program- | |||
ming. It should take only two parameters: S and M | |||
:param S: List of words | |||
:param M: Max length of line | |||
""" | |||
cost = [math.inf for i in range(len(S))] | |||
for i in range(0, len(S)): | |||
if badnessLine(S, M, 0, i) != math.inf: | |||
cost[i] = badnessLine(S, M, 0, i) | |||
if i == len(S) -1: | |||
return 0 #Everything fit on one line | |||
else: | |||
min = math.inf | |||
for k in range(0, i): | |||
before = cost[k] | |||
after = badnessLine(S, M, k + 1, i) | |||
if i == len(S) -1 and badnessLine(S, M, k+1, i) != math.inf: | |||
after = 0 # Last Line | |||
max = before if before > after else after | |||
min = min if min < max else max | |||
cost[i] = min | |||
return cost[len(S) -1] | |||
def minBadDynamicChoice(S, M): | |||
""" | |||
Write a procedure minBadDynamicChoice that implements | |||
the function mb' using dynamic | |||
programming. In addition to returning mb(S, M ), it | |||
should also return the choices made | |||
:param S: List of words | |||
:param M: Max length of line | |||
""" | |||
cost = [math.inf for i in range(len(S))] | |||
# List of tuples indicating start/end indices of line | |||
choice = [[] for i in range(len(S))] | |||
for i in range(0, len(S)): | |||
if badnessLine(S, M, 0, i) != math.inf: | |||
cost[i] = badnessLine(S, M, 0, i) | |||
choice[i] = [(0, i)] | |||
if i == len(S) - 1: | |||
return 0, [(0,i)] # One line | |||
else: | |||
min = math.inf | |||
choiceCanidate = [] | |||
for k in range(0, i): # Finds the optimal solution | |||
before = cost[k] # Previously computed minimum | |||
after = badnessLine(S, M, k + 1, i) # Badness of new slice | |||
if i == len(S) - 1 and badnessLine(S, M, k+1, i) != math.inf: | |||
after = 0 # Last line | |||
max = before if before > after else after | |||
if min > max: | |||
# Captures where slice is being taken | |||
choiceCanidate = choice[k] + [(k+1, i)] | |||
min = max | |||
choice[i] = choiceCanidate | |||
cost[i] = min | |||
return cost[len(S) -1], choice[len(S) -1] | |||
def printParagraph(S, M): | |||
""" | |||
which takes two parameters: S and M that displays the words in S on | |||
the screen using the choices of minBadDynamicChoice. | |||
What is the asymptotic running time of your | |||
algorithm? | |||
This program will run asymptotically in O(n^2) due | |||
to the characteristic of calculating the minBad | |||
for each sub sequence and then looping through a | |||
maximum of |S| to find the optimal solution. | |||
:param S: List of words | |||
:param M: Max length of line | |||
""" | |||
cost, choice = minBadDynamicChoice(S, M) | |||
print() | |||
for i in range(0, len(choice)): | |||
for x in range(choice[i][0], choice[i][1] + 1): | |||
print(str(S[x]), end=" ") | |||
print() | |||
print(minBadDynamicChoice(["aaa", "aaa"], 6)) | |||
printParagraph(["jjjjjj","aaa", "bb", "cc", "ff", "mm", "ddddd", "ddddd"], 6) | |||
printParagraph(["jjjjjj"], 6) |
@ -0,0 +1,65 @@ | |||
import numpy as np | |||
class Perceptron(object): | |||
""" | |||
Perceptron classifier | |||
___________________ | |||
parameters | |||
__________________ | |||
eta: float | |||
learning rate betweeen 0.0 and 1.0 | |||
n_iter: int | |||
Passes over the training dataset | |||
___________________ | |||
Attributes | |||
___________________ | |||
w_: 1d array | |||
weights after training | |||
errors_: list | |||
Number of msiclassifications for every epoch | |||
""" | |||
def __init__(self, eta, n_iter): | |||
self.eta = eta | |||
self.n_iter = n_iter | |||
def fit(self, X, y): | |||
""" | |||
Fit training data | |||
______________________ | |||
parameters | |||
______________________ | |||
X: {array-like}, shape = [n_samples, n_features] | |||
Training vectors where n_samples is the number of samples | |||
and n_features is the number of features | |||
y: array-like, shape = [n_samples] | |||
Target values | |||
____________________ | |||
Returns | |||
____________________ | |||
self: object | |||
""" | |||
self.w_ = np.zeros(1 + X.shape[1]) | |||
self.errors_ = [] | |||
for _ in range(self.n_iter): | |||
errors = 0 | |||
for xi,target in zip(X, y): | |||
update = self.eta * (target - self.predict(xi)) | |||
self.w_[1:] += update * xi | |||
self.w_[0] += update | |||
errors += int(update != 0.0) | |||
self.errors_.append(errors) | |||
return self | |||
def net_input(self, X): | |||
""" | |||
Calculate net input | |||
""" | |||
return np.dot(X, self.w_[1:]) + self.w_[0] | |||
def predict(self, X): | |||
""" | |||
Return class label after unit step | |||
""" | |||
return np.where(self.net_input(X) >= 0.0, 1, -1) |
@ -0,0 +1,42 @@ | |||
from collections import defaultdict | |||
#--class for directed graph with adjacency list representation | |||
class Graph: | |||
#--Constructor of the class | |||
def __init__(self): | |||
#--default dictionary to store graph | |||
self.graph = defaultdict(list) | |||
''' | |||
--function to add an edge | |||
--inputs, starting point of the graph | |||
''' | |||
def addEdge(self,u,v): | |||
self.graph[u].append(v) | |||
''' | |||
--to print a BFS of graph | |||
--inputs, starting point of the graph | |||
--Prints the BFS starting from the input point | |||
''' | |||
def BFS(self, s): | |||
# Mark all the vertices as not visited | |||
visited = [False] * (len(self.graph)) | |||
queue = [] | |||
# Mark the source node as visited and enqueue it | |||
queue.append(s) | |||
visited[s] = True | |||
while queue: | |||
s = queue.pop(0) | |||
print (s, end = " ") | |||
for i in self.graph[s]: | |||
if visited[i] == False: | |||
queue.append(i) | |||
visited[i] = True | |||
@ -0,0 +1,39 @@ | |||
import math | |||
def jumpSearch( arr , x ): | |||
# Finding block size to be jumped | |||
n = len(arr) | |||
step = math.sqrt(n) | |||
# Finding the block where element is | |||
# present (if it is present) | |||
prev = 0 | |||
while arr[int(min(step, n)-1)] < x: | |||
prev = step | |||
step += math.sqrt(n) | |||
if prev >= n: | |||
return -1 | |||
# Doing a linear search for x in | |||
# block beginning with prev. | |||
while arr[int(prev)] < x: | |||
prev += 1 | |||
# If we reached next block or end | |||
# of array, element is not present. | |||
if prev == min(step, n): | |||
return -1 | |||
# If element is found | |||
if arr[int(prev)] == x: | |||
return int(prev) | |||
return -1 | |||
arr = [ 0, 1, 3, 4, 4, 5, 8, 13, 22, 24, 55, 59, 122, 213, 422, 555 ] | |||
x = 55 | |||
index = jumpSearch(arr, x) | |||
print("Number is at index {}".format(index)) | |||
@ -0,0 +1,33 @@ | |||
def search(arr, l, r, x): | |||
if r >= l: | |||
m = (l+r)/2 | |||
if arr[m] == x: | |||
return m | |||
if arr[m] > x: | |||
return search(arr, l, m-1, x) | |||
else: | |||
return search(arr, m, r, x) | |||
return -1 | |||
def exponentialSearch(arr, n, x): | |||
if arr[0] == x: | |||
return 0 | |||
i = 1 | |||
while i<n and arr[i] <=x: | |||
i = i*2 | |||
return search(arr, i/2, min(n, i), x) | |||
arr = [2, 3, 4, 7, 10, 40] | |||
n = len(arr) | |||
x = 10 | |||
r = exponentialSearch(arr, n, x) | |||
if r == -1: | |||
print "Element not found" | |||
else: | |||
print "Element is present at index %d" %(r) |
@ -0,0 +1,35 @@ | |||
def bucket_sort(alist): | |||
largest = max(alist) | |||
length = len(alist) | |||
size = largest/length | |||
buckets = [[] for _ in range(length)] | |||
for i in range(length): | |||
j = int(alist[i]/size) | |||
if j != length: | |||
buckets[j].append(alist[i]) | |||
else: | |||
buckets[length - 1].append(alist[i]) | |||
for i in range(length): | |||
insertion_sort(buckets[i]) | |||
result = [] | |||
for i in range(length): | |||
result = result + buckets[i] | |||
return result | |||
def insertion_sort(alist): | |||
for i in range(1, len(alist)): | |||
temp = alist[i] | |||
j = i - 1 | |||
while (j >= 0 and temp < alist[j]): | |||
alist[j + 1] = alist[j] | |||
j = j - 1 | |||
alist[j + 1] = temp | |||
alist = [54,26,93,17,77,31,44,55,20] | |||
print(bucket_sort(alist)) |
@ -0,0 +1,122 @@ | |||
""" | |||
:Author: James Sherratt | |||
:Date: 20/10/2019 | |||
:License: MIT | |||
:name: heapsort.py | |||
Heap sorts a list-like object. Note: this has been written with code-clarity | |||
in mind first, efficiency second. | |||
""" | |||
from random import randint | |||
def get_left(i): | |||
""" | |||
Get the left element index of a heap node for an array. | |||
:param i: The parent index. | |||
:return: the left element. | |||
""" | |||
return 2 * i + 1 | |||
def get_right(i): | |||
""" | |||
Get the right element index of a heap node for an array. | |||
:param i: The parent index. | |||
:return: the right element. | |||
""" | |||
return 2 * i + 2 | |||
def repair_heap(vals_list, root, arr_top): | |||
""" | |||
Sifts the root element of a heap to the correct position, to | |||
correct a max heap. This assumes the children of the root/ node are max heaps. | |||
:param vals_list: list of values, which represents a heap structure. | |||
:param root: the index of the node we're working from/ using as a root. | |||
:param arr_top: the largest value of the list we're interested in. | |||
:return: Reference to the passed list, with the root node in the correct position. | |||
""" | |||
# This is the value to swap. We want to swap the root value down, so we swap the root first. | |||
swap = root | |||
# Get left and right nodes of root. | |||
left = get_left(root) | |||
right = get_right(root) | |||
while left < arr_top: | |||
# Check if value to swap is less than the left child. | |||
if vals_list[swap] < vals_list[left]: | |||
swap = left | |||
# Check if value to swap is less than the right child (if exists). | |||
# Note: these 2 if's could be combined using "and", but then we're relying on lazy evaluation. | |||
if right < arr_top: | |||
if vals_list[swap] < vals_list[right]: | |||
swap = right | |||
# Check if the swap is still the root. If so, there's no more children to swap and we're done. | |||
if swap == root: | |||
return vals_list | |||
# Else, swap. | |||
else: | |||
vals_list[root], vals_list[swap] = vals_list[swap], vals_list[root] | |||
# New root, left and right node for the next iteration. | |||
root = swap | |||
left = get_left(root) | |||
right = get_right(root) | |||
return vals_list | |||
def max_heap(vals_list): | |||
""" | |||
Convert a list of values into a max heap tree. | |||
:param vals_list: list of numbers. | |||
:return: the same list as a max heap tree. | |||
""" | |||
# Create a max heap by repairing the heap, starting from the nodes one above the leaf nodes. | |||
len_list = len(vals_list) | |||
for root in range(len_list//2, -1, -1): | |||
repair_heap(vals_list, root, len_list) | |||
return vals_list | |||
def max_heap_to_sorted(vals_list): | |||
""" | |||
Convert a max heap list into a sorted list. | |||
:param vals_list: list containing max heap. | |||
:return: the same list of values, sorted. | |||
""" | |||
# i is the index of the last element of the slice of the array that needs sorting. | |||
for top in range(len(vals_list)-1, 0, -1): | |||
# Swap the root value (max) with the last value of the slice. | |||
vals_list[0], vals_list[top] = vals_list[top], vals_list[0] | |||
# Sift the new root to the correct position of the remainder of the max heap. | |||
# Another way of doing this is to pass a slice of the vals_list up to the value top, but python passes | |||
# slices by copy so there's a massive performance hit. | |||
repair_heap(vals_list, 0, top) | |||
return vals_list | |||
def heapsort(vals_list): | |||
""" | |||
Sort a list of values using heapsort. | |||
:param vals_list: list of sortable values. | |||
:return: the same list, sorted. | |||
""" | |||
max_heap(vals_list) | |||
return max_heap_to_sorted(vals_list) | |||
if __name__ == "__main__": | |||
list_len = 100000 | |||
vals_list = [randint(0, (2**16)) for i in range(list_len)] | |||
heap_sorted = heapsort(list(vals_list)) | |||
py_sorted = sorted(vals_list) | |||
print("Did the sort work? {}".format(heap_sorted == py_sorted)) |
@ -0,0 +1,39 @@ | |||
import clean_text | |||
# import all our functions | |||
from clean_text import * | |||
#!pylint cleantext | |||
import pandas as pd | |||
from sklearn.feature_extraction.text import CountVectorizer | |||
training = [ | |||
" I am master of all", | |||
"I am a absolute learner" | |||
] | |||
generalization = [ | |||
"I am absolute learner learner" | |||
] | |||
vectorization = CountVectorizer( | |||
stop_words = "english", | |||
preprocessor = process.master_clean_text) | |||
vectorization.fit(training) | |||
build_vocab = { | |||
value:key | |||
for key , value in vectorization.vocabulary_.items() | |||
} | |||
vocab = [build_vocab[i] for i in range(len(build_vocab))] | |||
extracted = pd.DataFrame( | |||
data = vectorization.transform(generalization).toarray(), | |||
index=["generalization"], | |||
columns=vocab | |||
) | |||
print(extracted) |
@ -0,0 +1,14 @@ | |||
This is a very simple program. | |||
Double click on grab StickyNotes.bat to backup your sticky notes | |||
into the current directory. | |||
Double click ReplaceCurrentStickyNotes.bat to replace your | |||
stickynotes with the ones in the current directory. | |||
** Note this will only work with windows 10 and up. | |||
Windows 10 uses the .sqlite format where windows 7 | |||
used a .snt file. |
@ -0,0 +1,9 @@ | |||
:: Author : Jeffery Russell 11-27-18 | |||
@echo off | |||
pushd %~dp0 | |||
dir | |||
copy %LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite | |||
pause |
@ -0,0 +1,9 @@ | |||
:: Author : Jeffery Russell 11-27-18 | |||
@echo off | |||
pushd %~dp0 | |||
dir | |||
copy plum.sqlite %LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite | |||
pause |