Added files
This commit is contained in:
parent
723e5c3976
commit
7868c17358
121
Graph.py
Normal file
121
Graph.py
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
import math
|
||||||
|
import random
|
||||||
|
import pygame
|
||||||
|
from parse import parse_input
|
||||||
|
from Node import Node
|
||||||
|
from globals import *
|
||||||
|
|
||||||
|
def createColorFromString(s):
|
||||||
|
i = hash(s)
|
||||||
|
r = (i & 0xFF0000) >> 16
|
||||||
|
g = (i & 0x00FF00) >> 8
|
||||||
|
b = (i & 0x0000FF) + 125;
|
||||||
|
return (r,g,b%125 + 100)
|
||||||
|
|
||||||
|
def generateRandomVelocity():
|
||||||
|
dx = random.uniform(NODE_MIN_VEL, NODE_MAX_VEL)
|
||||||
|
dy = random.uniform(NODE_MIN_VEL, NODE_MAX_VEL)
|
||||||
|
randomVelocity = (dx, dy)
|
||||||
|
return randomVelocity
|
||||||
|
|
||||||
|
class Graph(object):
|
||||||
|
# A directed graph which contains nodes
|
||||||
|
def __init__(self, surface, nodes=[], links=[], file=""):
|
||||||
|
self.surface = surface
|
||||||
|
self.nodes = nodes
|
||||||
|
self.links = links
|
||||||
|
self.hashLink= {} # This will provide faster access to links
|
||||||
|
self.file = file
|
||||||
|
self.font = pygame.font.SysFont(None, 15)
|
||||||
|
|
||||||
|
self.nodesUnderMouse = []
|
||||||
|
|
||||||
|
def fromFile(self, initializeWithRandomVels=True):
|
||||||
|
# Parse from file
|
||||||
|
self.nodes, self.links = parse_input(self.file)
|
||||||
|
|
||||||
|
# Set the position of each node
|
||||||
|
square = math.ceil(math.sqrt(len(self.nodes)))
|
||||||
|
for i in range(square):
|
||||||
|
for j in range(square):
|
||||||
|
if (i*square + j < len(self.nodes)):
|
||||||
|
self.nodes[i*square + j].pos = (int((WIDTH)/(square) * i + 20), int((HEIGHT)/(square) * j + 20))
|
||||||
|
if (initializeWithRandomVels):
|
||||||
|
self.nodes[i*square + j].vel = generateRandomVelocity()
|
||||||
|
else:
|
||||||
|
self.nodes[i*square + j].vel = (0, 0)
|
||||||
|
self.nodes[i*square + j].color = createColorFromString(self.nodes[square*i + j].text)
|
||||||
|
|
||||||
|
|
||||||
|
def updateNodePositions(self, dt):
|
||||||
|
for i in self.nodes:
|
||||||
|
i.update(dt) # Update the position for velocity
|
||||||
|
|
||||||
|
def randomNodes(self):
|
||||||
|
# Populate nodes with random ones
|
||||||
|
for i in range(10):
|
||||||
|
for j in range(10):
|
||||||
|
position = (20 + i * 80, 20 + j * 80)
|
||||||
|
color=random.choice([RED,GREEN,BLUE])
|
||||||
|
radius=random.randint(5, 15)
|
||||||
|
text=random.choice(list("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
|
||||||
|
self.nodes.append(Node(position, generateRandomVelocity(), color, radius, text))
|
||||||
|
|
||||||
|
def randomLinks(self):
|
||||||
|
for i in range(random.randint(1, 1000)):
|
||||||
|
# Each link is (source, destination, weight)
|
||||||
|
self.links.append((random.choice(self.nodes), random.choice(self.nodes), 1, "BRUH"))
|
||||||
|
|
||||||
|
def updateHashLinks(self):
|
||||||
|
# This will also calculate the radius for each node
|
||||||
|
for i in self.links:
|
||||||
|
# Hash links appear in the dictionary as:
|
||||||
|
# source_node : [(node1, weight1, description1), (node2, weight2, description2)]
|
||||||
|
if (i[0] not in self.hashLink.keys()):
|
||||||
|
self.hashLink[i[0]] = []
|
||||||
|
self.hashLink[i[0]].append((i[1], i[2], i[3]))
|
||||||
|
for i in self.nodes:
|
||||||
|
if (i in self.hashLink.keys()):
|
||||||
|
i.radius = max(min(len(self.hashLink[i]), NODE_MAX_RADIUS), NODE_MIN_RADIUS)
|
||||||
|
else:
|
||||||
|
# The node has no outer links
|
||||||
|
i.radius = NODE_MIN_RADIUS
|
||||||
|
|
||||||
|
def drawLinks(self, node):
|
||||||
|
# Draw all of the links from one node to all of its neighbors
|
||||||
|
if (node in self.hashLink.keys()):
|
||||||
|
for i in self.hashLink[node]:
|
||||||
|
pygame.gfxdraw.line(self.surface, int(node.pos[0]), int(node.pos[1]), int(i[0].pos[0]), int(i[0].pos[1]), RED)
|
||||||
|
midPoint = ((i[0].pos[0] + node.pos[0])/2, (i[0].pos[1] + node.pos[1])/2)
|
||||||
|
render=self.font.render(i[0].text, True, WHITE)
|
||||||
|
self.surface.blit(render, midPoint)
|
||||||
|
render=self.font.render(i[2], True, WHITE)
|
||||||
|
self.surface.blit(render, (midPoint[0] + 10, midPoint[1]+10))
|
||||||
|
else:
|
||||||
|
for i in self.links:
|
||||||
|
if i[0] == node:
|
||||||
|
pygame.gfxdraw.line(self.surface, int(node.pos[0]), int(node.pos[1]), int(i[1].pos[0]), int(i[1].pos[1]), RED)
|
||||||
|
midPoint = (abs(i[1].pos[0] + node.pos[0])/2, abs(i[1].pos[1] + node.pos[1])/2)
|
||||||
|
render=self.font.render(i[1].text, True, WHITE)
|
||||||
|
self.surface.blit(render, midPoint)
|
||||||
|
render=self.font.render(i[3], True, WHITE)
|
||||||
|
self.surface.blit(render, (midPoint[0] + 10, midPoint[1]+10))
|
||||||
|
|
||||||
|
def draw(self):
|
||||||
|
# Draw the graph for i in nodes:
|
||||||
|
mouseX = pygame.mouse.get_pos()[0]
|
||||||
|
mouseY = pygame.mouse.get_pos()[1]
|
||||||
|
|
||||||
|
if (self.nodesUnderMouse):
|
||||||
|
# If the node is under the mouse draw the links and the node
|
||||||
|
# content
|
||||||
|
for i in self.nodesUnderMouse:
|
||||||
|
self.drawLinks(i)
|
||||||
|
node=i
|
||||||
|
render=self.font.render(node.text, True, WHITE)
|
||||||
|
self.surface.blit(render, (node.pos[0]+node.radius, node.pos[1]+node.radius))
|
||||||
|
|
||||||
|
# Now we can finally draw the nodes!
|
||||||
|
for i in self.nodes:
|
||||||
|
i.draw(self.surface)
|
||||||
|
|
43
Node.py
Normal file
43
Node.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import random
|
||||||
|
import pygame
|
||||||
|
from pygame import gfxdraw
|
||||||
|
from globals import *
|
||||||
|
|
||||||
|
class Node(object):
|
||||||
|
# A node object contains data for each node
|
||||||
|
def __init__(self, pos=(1,1), vel=(1,1), color=RED, radius=10, text="A"):
|
||||||
|
self.pos = pos # This position is the center of the node
|
||||||
|
self.vel = vel # Velocity vector
|
||||||
|
self.color = color
|
||||||
|
self.radius = radius
|
||||||
|
self.text = text
|
||||||
|
self.updateB= True
|
||||||
|
self.font = pygame.font.SysFont(None, int(self.radius * 2.4))
|
||||||
|
|
||||||
|
def update(self, dt):
|
||||||
|
if (self.updateB):
|
||||||
|
if (self.pos[0] <= 0):
|
||||||
|
self.vel = (random.uniform(NODE_MIN_VEL, NODE_MAX_VEL), self.vel[1])
|
||||||
|
if (self.pos[0] >= WIDTH):
|
||||||
|
self.vel = (-random.uniform(NODE_MIN_VEL, NODE_MAX_VEL), self.vel[1])
|
||||||
|
if (self.pos[1] <= 0):
|
||||||
|
self.vel = (self.vel[0], random.uniform(NODE_MIN_VEL, NODE_MAX_VEL))
|
||||||
|
if (self.pos[1] >= HEIGHT):
|
||||||
|
self.vel = (self.vel[0], -random.uniform(NODE_MIN_VEL, NODE_MAX_VEL))
|
||||||
|
|
||||||
|
x = self.pos[0] + self.vel[0] * dt
|
||||||
|
y = self.pos[1] + self.vel[1] * dt
|
||||||
|
self.pos = (x,y)
|
||||||
|
|
||||||
|
def draw(self, surface):
|
||||||
|
# Draw the node
|
||||||
|
gfxdraw.aacircle(surface, int(self.pos[0]), int(self.pos[1]), self.radius, self.color)
|
||||||
|
gfxdraw.filled_circle(surface, int(self.pos[0]), int(self.pos[1]), self.radius, self.color)
|
||||||
|
|
||||||
|
# Draw the text at the center of the node
|
||||||
|
textItem = self.font.render(self.text[0], True, BLACK)
|
||||||
|
textWidth = textItem.get_rect().width
|
||||||
|
textHeight = textItem.get_rect().height
|
||||||
|
surface.blit(textItem, (int(self.pos[0] - textWidth/2), int(self.pos[1] - textHeight/2)))
|
||||||
|
|
||||||
|
|
76
builder.py
Normal file
76
builder.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import pygame
|
||||||
|
from Graph import Graph
|
||||||
|
from Node import Node
|
||||||
|
from globals import *
|
||||||
|
|
||||||
|
def main():
|
||||||
|
pygame.init()
|
||||||
|
screen = pygame.display.set_mode((WIDTH, HEIGHT))
|
||||||
|
clock = pygame.time.Clock()
|
||||||
|
|
||||||
|
running = True
|
||||||
|
graph = Graph(screen, file="finalGraph.txt")
|
||||||
|
graph.fromFile(False)
|
||||||
|
isNodeUnderMouse = False
|
||||||
|
node1 = None
|
||||||
|
node2 = None
|
||||||
|
|
||||||
|
while (running):
|
||||||
|
isNodeUnderMouse = False
|
||||||
|
for event in pygame.event.get():
|
||||||
|
if event.type == pygame.QUIT:
|
||||||
|
file = open(input("Where would you like to save the graph: "),"w")
|
||||||
|
for i in graph.links:
|
||||||
|
file.write(i[0].text + " " + i[1].text + " " + str(i[2]) + " " + i[3] + "\n")
|
||||||
|
file.close()
|
||||||
|
running = False
|
||||||
|
if event.type == pygame.KEYDOWN:
|
||||||
|
if event.key == pygame.K_SPACE:
|
||||||
|
find = input("Name of node: ")
|
||||||
|
for i in graph.nodes:
|
||||||
|
if i.text == find:
|
||||||
|
i.color = BLUE
|
||||||
|
if event.type == pygame.MOUSEBUTTONUP:
|
||||||
|
mouseX, mouseY = pygame.mouse.get_pos()
|
||||||
|
for i in graph.nodes:
|
||||||
|
if(mouseX > i.pos[0] - i.radius and \
|
||||||
|
mouseY > i.pos[1] - i.radius and \
|
||||||
|
mouseX < i.pos[0] + i.radius and \
|
||||||
|
mouseY < i.pos[1] + i.radius):
|
||||||
|
graph.drawLinks(i)
|
||||||
|
if (node1):
|
||||||
|
node2 = i
|
||||||
|
description = input("Description of link: ")
|
||||||
|
if (description != "no"):
|
||||||
|
graph.links.append([node1, node2, 1.0, description])
|
||||||
|
node2 = None
|
||||||
|
node1 = None
|
||||||
|
elif (not node1 and not node2):
|
||||||
|
node1 = i
|
||||||
|
isNodeUnderMouse = True
|
||||||
|
if (not isNodeUnderMouse):
|
||||||
|
newNode = Node(pos=(mouseX, mouseY), vel=(0,0), text = input("New node text: "))
|
||||||
|
graph.nodes.append(newNode)
|
||||||
|
node1 , node2 = (None, None)
|
||||||
|
screen.fill(BLACK)
|
||||||
|
|
||||||
|
graph.draw()
|
||||||
|
mouseX, mouseY = pygame.mouse.get_pos()
|
||||||
|
for i in graph.nodes:
|
||||||
|
if(mouseX > i.pos[0] - i.radius and \
|
||||||
|
mouseY > i.pos[1] - i.radius and \
|
||||||
|
mouseX < i.pos[0] + i.radius and \
|
||||||
|
mouseY < i.pos[1] + i.radius):
|
||||||
|
i.color = GREEN
|
||||||
|
if (i not in graph.nodesUnderMouse):
|
||||||
|
graph.nodesUnderMouse.append(i)
|
||||||
|
graph.drawLinks(i)
|
||||||
|
else:
|
||||||
|
if i in graph.nodesUnderMouse:
|
||||||
|
graph.nodesUnderMouse.remove(i)
|
||||||
|
if (i.color != BLUE):
|
||||||
|
i.color = RED
|
||||||
|
pygame.display.flip()
|
||||||
|
clock.tick(60)
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
308
finalGraph.txt
Normal file
308
finalGraph.txt
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
Set Cartesian_Product 0.7 Is an operand of
|
||||||
|
Cartesian_Product Product 0.9 Is a type of
|
||||||
|
Product Operation 1.0 Is an
|
||||||
|
Set Ordered 1.0 Can be
|
||||||
|
Ordered Unordered 1.0 Is opposite to
|
||||||
|
Unordered Ordered 1.0 Is opposite to
|
||||||
|
Set Unordered 1.0 Can be
|
||||||
|
Set Element 1.0 Contain many
|
||||||
|
Element Set 1.0 Is the smallest unit of
|
||||||
|
Sets Relation 0.6 Can describe
|
||||||
|
Relation Function 1.0 Is another word for
|
||||||
|
Function Mapping 1.0 Is another word for
|
||||||
|
Mapping Relation 1.0 Is another word for
|
||||||
|
Relation Function 1.0 Is another word for
|
||||||
|
Function Onto 0.7 Can be
|
||||||
|
Onto Function 0.7 Describes a property of
|
||||||
|
Function One_To_One 0.7 Can be
|
||||||
|
One_To_One Function 0.7 Describes a property of
|
||||||
|
Injective One_To_One 1.0 Is another word for
|
||||||
|
One_To_One Injective 1.0 Is another word for
|
||||||
|
Onto Bijective 0.5 Is half of requirements for
|
||||||
|
Onto Surjective 1.0 Is another word for
|
||||||
|
Surjective Onto 1.0 Is another word for
|
||||||
|
One_To_One Bijective 0.5 Is half of requirements for
|
||||||
|
Bijective Function 1.0 Is a type of
|
||||||
|
Bijective Onto 0.5 Requires
|
||||||
|
Bijective One_To_One 0.5 Requires
|
||||||
|
Function Quantifier 0.6 Can be bounded by
|
||||||
|
Quantifier Predicates 0.9 Can describe
|
||||||
|
Quantifier For_All 1.0 Includes
|
||||||
|
For_All Quantifier 1.0 Is a
|
||||||
|
For_All all() 1.0 Is the same as Python
|
||||||
|
Quantifier For_Each 1.0 Includes
|
||||||
|
For_Each Quantifier 1.0 Is a
|
||||||
|
For_Each any() 1.0 Is the same as Python
|
||||||
|
Quantifier DeMorgan_Laws 0.6 Is negated by
|
||||||
|
DeMorgan DeMorgan_Laws 1.0 Created
|
||||||
|
DeMorgan_Laws Logic_Gate 1.0 Describe negation of
|
||||||
|
DeMorgan_Laws Quantifier 1.0 Describe negation of
|
||||||
|
Relation Binary 0.4 Can be
|
||||||
|
Binary Function 0.8 Has 2 inputs for
|
||||||
|
Binary Number_System 0.9 Is a base 2
|
||||||
|
Binary Tree 0.9 Can be a
|
||||||
|
Relation And 1.0 Can be
|
||||||
|
And Logic_Gate 1.0 Is a
|
||||||
|
Logic_Gate Truth_Table 1.0 Determines output in
|
||||||
|
Truth_Table Boolean 1.0 Is represented in computer by a
|
||||||
|
Boolean Binary 1.0 Is represented by
|
||||||
|
Relation Or 0.7 Can be
|
||||||
|
Relation Xor 0.7 Can be
|
||||||
|
Relation Not 0.7 Can be
|
||||||
|
Relation Symmetric 1.0 Can be
|
||||||
|
Symmetric Undirected 1.0 Describes graph type
|
||||||
|
Relation Transitive 1.0 Can be
|
||||||
|
Relation Reflexive 1.0 Can be
|
||||||
|
Relation Equivalence 1.0 Can be type
|
||||||
|
Equivalence Binary 0.6 Requires type
|
||||||
|
Equivalence Modular_Arithmetic 0.8 Describes
|
||||||
|
Modular_Arithmetic Chinese_Remainder_Theorem 1.0 Soves linear systems by
|
||||||
|
Modular_Arithmetic Modulus 1.0 Is described by
|
||||||
|
Equivalence Congruence 0.8
|
||||||
|
Congruence Equivalence 0.8
|
||||||
|
Modulus Modular_Arithmetic 1.0 Describes
|
||||||
|
Sets Element 0.8 Is a combination of
|
||||||
|
Element Combination 0.6 Can be rearranged by
|
||||||
|
Combination Element 0.6 Rearrange
|
||||||
|
Combination Combinatorics_Probability 1.0 Is studied in
|
||||||
|
Element Permutation 0.6 Are rearranged by
|
||||||
|
Permutation Element 0.6 Rearrange
|
||||||
|
Permutation Combinatorics_Probability 1.0 Is Studied in
|
||||||
|
Permutation Factorial 0.8 Is calculated by
|
||||||
|
Combination Factorial 0.8 Is calculated by
|
||||||
|
Factorial Product 1.0 Is a
|
||||||
|
Permutation Seating 1.0 Can be represented by
|
||||||
|
Combination N_Choose_K 1.0 Is represented by
|
||||||
|
Set Subsets 1.0 Contain
|
||||||
|
Set Intersection 1.0 Is an operand for
|
||||||
|
Set Union 1.0 Is an operand for
|
||||||
|
Intersection Operation 1.0 Is an
|
||||||
|
Union Operation 1.0 Is an
|
||||||
|
Complex_Numbers Real_Numbers 1.0 Has subset of
|
||||||
|
Real_Numbers Complex_Numbers 1.0 Is a subset of
|
||||||
|
Real_Numbers Countable 0.6 Are not
|
||||||
|
Countable Cardinality 1.0 Has the same _ as N
|
||||||
|
Natural_Numbers Real_Numbers 1.0 Is a subset of
|
||||||
|
Real_Numbers Natural_Numbers 1.0 Contains
|
||||||
|
Natural_Numbers Integers 1.0 Is a subset of
|
||||||
|
Integers Real_Numbers 1.0 Is a subset of
|
||||||
|
Integers Number_Theory 1.0 Studies
|
||||||
|
Real_Numbers Real_Analysis 1.0 Is the study of
|
||||||
|
Supremum Real_Analysis 1.0 Is the greatest upper bound
|
||||||
|
Infimum Real_Analysis 1.0 Is the lowest lower bound
|
||||||
|
Complex_Numbers e^(i*pi) 0.7 Describe the relation
|
||||||
|
e^(i*pi) Eulers_Formula 1.0 Can be proved by
|
||||||
|
Eulers_Formula Euler 1.0 Was created by
|
||||||
|
Complex_Numbers Eigenvalues 1.0 Can be
|
||||||
|
Number_Theory Primes 1.0 Conjectures about
|
||||||
|
Primes log(n) 0.6 Below n is a ratio of
|
||||||
|
Number_Theory Alternate_Base_Repr 0.8 Deals with
|
||||||
|
Alternate_Base_Repr Binary 1.0 Can be
|
||||||
|
Binary Alternate_Base_Repr 1.0 Is a
|
||||||
|
Number_Theory Coprime 1.0 Two number can be
|
||||||
|
Coprime GCD 1.0 The GCD is 1
|
||||||
|
GCD Euclidean_GCD 1.0 Can be calculated by
|
||||||
|
Euclidean_GCD GCD 1.0 Calculates
|
||||||
|
Euclidean_GCD Modulus 1.0 Is calculated by
|
||||||
|
Number_Theory RSA 1.0 Describes
|
||||||
|
RSA Public_Key_Encryption 1.0 Is a type of
|
||||||
|
RSA Primes 1.0 Is a product of
|
||||||
|
Number_Theory Residue_Number_Systems 1.0 Studies
|
||||||
|
Residue_Number_Systems Modulus 1.0 Determined by
|
||||||
|
Modulus MMI 1.0 Is inverted by
|
||||||
|
Modulus Congruence_Relation 1.0 Is an example of a
|
||||||
|
Real_Analysis Real_Numbers 1.0 Is the study of
|
||||||
|
Real_Analysis Irrationality 1.0 Describes
|
||||||
|
Real_Analysis Cardinaility 1.0 Defines
|
||||||
|
Real_Analysis Set 1.0 Defines cardinality of
|
||||||
|
Set Bijective_Function 1.0 Has same cardinality when _ exists
|
||||||
|
Bijective_Function Bijective 1.0 Is
|
||||||
|
Cardinality Countable 1.0 Defines
|
||||||
|
Tree Graph 1.0 Is a more constrained version of
|
||||||
|
Graph Complete 1.0 Can be
|
||||||
|
Graph Wheel 1.0 Can be
|
||||||
|
Graph Bipartite 1.0 Can be
|
||||||
|
Bipartite Complete 1.0 Can be
|
||||||
|
Graph Cube 1.0 Can be a
|
||||||
|
Cube 2^n 1.0 Contains nodes
|
||||||
|
Graph Nodes 1.0 Contain
|
||||||
|
Nodes Vertices 1.0 Another word for
|
||||||
|
Vertices Nodes 1.0 Another word for
|
||||||
|
Nodes Degree 1.0 Has property
|
||||||
|
Degree Out_Degree 1.0 Can be type
|
||||||
|
Degree In_Degree 1.0 Can be type
|
||||||
|
Graph Undirected 1.0 Can be
|
||||||
|
Undirected Symmetric 1.0 Describes relation that is
|
||||||
|
Graph Directed 1.0 Can be
|
||||||
|
Graph Paths 1.0 Are explored by
|
||||||
|
Paths DFS 1.0 Can be generated by
|
||||||
|
Paths BFS 1.0 Can be generated by
|
||||||
|
BFS Stack 1.0 Uses
|
||||||
|
Stack Push 1.0 Has operation
|
||||||
|
Stack Pop 1.0 Has operation
|
||||||
|
Graph Cycles 1.0 Can contain
|
||||||
|
Graph Psuedo 1.0 Can be type
|
||||||
|
Psuedo Loops 1.0 Can contain
|
||||||
|
Graph Planar 1.0 Can be
|
||||||
|
Planar Intersection 1.0 Can be rewritten with no
|
||||||
|
Graph Non-Planar 1.0 Can be
|
||||||
|
Non-Planar Intersection 1.0 Cannot be rewritten without
|
||||||
|
Graph Multigraph 1.0 Can be type
|
||||||
|
Multigraph Edge 1.0 Has multiple
|
||||||
|
Graph Digraph 1.0 Can be type
|
||||||
|
Digraph Binary 1.0 Can be represented with relation of type
|
||||||
|
Graph Adjacency_Matrix 1.0 Can be represented by
|
||||||
|
Graph Incidence_Matrix 1.0 Can be represented by
|
||||||
|
Graph Subgraphs 1.0 Can have
|
||||||
|
Subgraph Subset 1.0 Is a _ of the original graph
|
||||||
|
Graph Intersection 1.0 Can be operand of
|
||||||
|
Graph Union 1.0 Can be operand
|
||||||
|
Graph Complement 1.0 Has property
|
||||||
|
Complement Complete 1.0 Contains non-present nodes in
|
||||||
|
Tree Rooted 1.0 Can be
|
||||||
|
Tree Branches 1.0 Contain
|
||||||
|
Branches Paths 1.0 Are explored by
|
||||||
|
Branches Leaves 1.0 Can extend to
|
||||||
|
Branches Arc 1.0 Is also known as
|
||||||
|
Branches Edge 1.0 Is also known as
|
||||||
|
Tree Perfect 1.0 Can be
|
||||||
|
Perfect 2^n 1.0 Has _ leaves
|
||||||
|
Tree Balanced 1.0 Can be
|
||||||
|
Tree Recursion 1.0 Can be explored by
|
||||||
|
Recursion log(n) 1.0 Generally bounded by
|
||||||
|
Tree AVL 1.0 Can be
|
||||||
|
Tree Parsing 1.0 Can describe
|
||||||
|
Parsing Language 1.0 Is a problem of
|
||||||
|
Parsing Finite_Automata 1.0 Determined by
|
||||||
|
Finite_Automata Nondeterministic_FA 1.0 Are constrained types of
|
||||||
|
Finite_Automata State_Machine 1.0 Is a type of
|
||||||
|
State_Machine Accepting 1.0 Has state
|
||||||
|
Accepting Boolean 1.0 Is a
|
||||||
|
State_Machine Rejecting 1.0 Has state
|
||||||
|
Rejectinve Boolean 1.0 Is a
|
||||||
|
Parsing Grammar 1.0 string is accepted by
|
||||||
|
Grammar Production 1.0 Is defined by many
|
||||||
|
Production Nonterminal 1.0 Contains
|
||||||
|
Production Terminal 1.0 Contains
|
||||||
|
Production Regular_Expression 1.0 Can be identified with
|
||||||
|
Regular_Expression Union 1.0 Is operand of
|
||||||
|
Regular_Expression Concatenation 1.0 Is operand of
|
||||||
|
Regular_Expression Star 1.0 Is operand of
|
||||||
|
Tree Permutation_Tree 1.0 Produces
|
||||||
|
Permuation_Tree Permutations 1.0 Explores all
|
||||||
|
Tree Binary 1.0 Can be
|
||||||
|
Tree Huffman_Tree 1.0 Can be a
|
||||||
|
Huffman_Tree Compression 1.0 Explores
|
||||||
|
Huffman_Tree Compression_Ratio 1.0 Has
|
||||||
|
Compression_Ratio Encoding 1.0 Determined by a fixed length
|
||||||
|
Huffman_Tree Balanced 1.0 Is better when not
|
||||||
|
Huffman_Tree Bottom_Up 1.0 Is built with
|
||||||
|
Tree Full 1.0 Can be
|
||||||
|
Tree Complete 1.0 Can be
|
||||||
|
Set Graph 1.0 Can describe the edges in a
|
||||||
|
Chinese_Remainder_Theorem Modular_Arithmetic 1.0 Uses
|
||||||
|
Incidence_Matrix Matrix 1.0 Is a
|
||||||
|
Bottom_Up Parsing 1.0 Is algorithm for
|
||||||
|
Full Tree 1.0 Describes a
|
||||||
|
Matrix Eigenvalues 1.0 If square contains
|
||||||
|
Combinatorics_Probability Combination 1.0 Studies
|
||||||
|
Combinatorics_Probability Permutation 1.0 Studies
|
||||||
|
Primes Coprime 1.0 Are always
|
||||||
|
Sets Set 1.0 Is the plural form
|
||||||
|
all() Function 1.0 Is a
|
||||||
|
any() Function 1.0 Is a
|
||||||
|
Seating Permutation 1.0 Is a problem good for
|
||||||
|
Permutations Permutation 1.0 Is the plural form of
|
||||||
|
Permutation Permutations 1.0 Is singular
|
||||||
|
Permutations Permuation_Tree 1.0 Are explored by
|
||||||
|
Permuation_Tree Tree 1.0 Is a type of
|
||||||
|
Permutation_Tree Permuation_Tree 1.0 Is a duplicate of
|
||||||
|
Nonterminal Production 1.0 Is part of a
|
||||||
|
Language Alphabet 1.0 Contains a
|
||||||
|
Alphabet Element 1.0 Is made up of
|
||||||
|
Production Grammar 1.0 Defines a
|
||||||
|
Arc Edge 1.0 Is synonymous to
|
||||||
|
Edge Arc 1.0 Is synonymous to
|
||||||
|
Edge Paths 1.0 Describes
|
||||||
|
Paths Edge 1.0 Follow
|
||||||
|
Directed Graph 1.0 Is a type of
|
||||||
|
Eigenvalues Matrix 1.0 Are properties of a square
|
||||||
|
log(n) Function 1.0 Is a
|
||||||
|
Subset Subsets 1.0 Is singular of
|
||||||
|
Subsets Subset 1.0 Is plural of
|
||||||
|
Subsets Set 1.0 Are contained in
|
||||||
|
Subset Set 1.0 Is a smaller part of
|
||||||
|
Adjacency_Matrix Matrix 1.0 Is a
|
||||||
|
Adjacency_Matrix Graph 1.0 Represents
|
||||||
|
AVL Tree 1.0 Is a type of
|
||||||
|
Subgraphs Graph 1.0 Are smaller parts of a
|
||||||
|
Xor Logic_Gate 1.0 Is a
|
||||||
|
Or Logic_Gate 1.0 Is a
|
||||||
|
Pop Stack 1.0 Is an operation of
|
||||||
|
Push Stack 1.0 Is an operation of
|
||||||
|
Push Operation 1.0 Is an
|
||||||
|
Pop Operation 1.0 Is an
|
||||||
|
Nondeterministic_FA Finite_Automata 1.0 Is an ambiguous form of
|
||||||
|
Balanced Tree 1.0 Describes
|
||||||
|
Transitive Relation 1.0 Describes a
|
||||||
|
Stars_And_Bars N_Multichoose_K 1.0 Are described by
|
||||||
|
Stars_And_Bars Combinatorics_Probability 1.0 Are studied in
|
||||||
|
N_Multichoose_K Stars_And_Bars 1.0 Describe
|
||||||
|
Combinatorics_Probability N_Multichoose_K 1.0 Studies
|
||||||
|
N_Choose_K Combination 1.0 Describe
|
||||||
|
Alphabet Language 1.0 Describe elements in a
|
||||||
|
Alphabet Terminal 1.0 Can be made of many
|
||||||
|
Alphabet Nonterminal 1.0 Can be made of many
|
||||||
|
Irrationality Real_Analysis 1.0 Is explored in
|
||||||
|
Not Logic_Gate 1.0 Is a
|
||||||
|
Alternate_Base_Repr Primes 1.0 Can be made of
|
||||||
|
Natural_Numbers Primes 1.0 Are products of
|
||||||
|
2^n Function 1.0 Is an exponential
|
||||||
|
Loops Python 1.0 Are in
|
||||||
|
Python Language 1.0 Is a
|
||||||
|
all() Python 1.0 Is in
|
||||||
|
any() Python 1.0 Is in
|
||||||
|
Complete Graph 1.0 Describes
|
||||||
|
Node Subgraphs 1.0 Is the smallest
|
||||||
|
Node Nodes 1.0 Is singular version of
|
||||||
|
Nodes Node 1.0 Is plural of
|
||||||
|
Out_Degree Nodes 1.0 Is property of
|
||||||
|
In_Degree Nodes 1.0 Is property of
|
||||||
|
Out_Degree Directed 1.0 Is not equal to in degree when
|
||||||
|
In_Degree Directed 1.0 Is not equal to out degree when graph is
|
||||||
|
Directed Edge 1.0 Describes property of
|
||||||
|
Edge Directed 1.0 Can be
|
||||||
|
Cardinaility Cardinality 1.0 Is a duplicate of
|
||||||
|
Wheel Graph 1.0 Descibes
|
||||||
|
Bipartite Graph 1.0 Describes
|
||||||
|
Bipartite Onto 1.0 Describes a graph that is
|
||||||
|
Cube Graph 1.0 Describes
|
||||||
|
Cycles Graph 1.0 Can be found in
|
||||||
|
Cycles DFS 1.0 Are found via
|
||||||
|
DFS Paths 1.0 Explores
|
||||||
|
Cycles Paths 1.0 Are types of
|
||||||
|
Rooted Tree 1.0 Describes a type of
|
||||||
|
Star Regular_Expression 1.0 Is an operation that forms
|
||||||
|
Concatenation Regular_Expression 1.0 Is an operation that forms
|
||||||
|
Concatenation Alphabet 1.0 Requires
|
||||||
|
None Python 1.0 Is in
|
||||||
|
Modulus Congruence 1.0 Is a type of
|
||||||
|
And Python 1.0 Is in
|
||||||
|
Function Python 1.0 Can be defined in
|
||||||
|
Terminal Alphabet 1.0 Can be part of
|
||||||
|
Function Codomain 1.0 Contain
|
||||||
|
Range Python 1.0 Is in
|
||||||
|
Function Range 1.0 Contain
|
||||||
|
Domain Function 1.0 Describes a
|
||||||
|
Codomain Function 1.0 Describes a
|
||||||
|
Range Codomain 1.0 Is a subset of
|
||||||
|
Codomain Range 1.0 Is a superset of
|
||||||
|
Real_Numbers Codomain 1.0 Is the _ for real-valued functions
|
||||||
|
Leaves Tree 1.0 Are the bottom of a
|
||||||
|
Psuedo Graph 1.0 Is a type of
|
||||||
|
Relation Graph 1.0 Describe the relations in
|
||||||
|
MMI Modulus 1.0 Finds the identity of a _ operation
|
||||||
|
Compression Encoding 1.0 Studies the best type of
|
||||||
|
Compression Huffman_Tree 1.0 Is explored by
|
||||||
|
Recursion Binary 1.0 Is used in binary search
|
||||||
|
Recursion Tree 1.0 Is the best way to explore a
|
15
globals.py
Normal file
15
globals.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
WIDTH =800
|
||||||
|
HEIGHT=800
|
||||||
|
|
||||||
|
WHITE=(255 , 255 , 255)
|
||||||
|
BLACK=(0 , 0 , 0 )
|
||||||
|
RED =(255 , 0 , 0 )
|
||||||
|
GREEN=(0 , 255 , 0 )
|
||||||
|
BLUE =(0 , 0 , 255)
|
||||||
|
|
||||||
|
NODE_MIN_VEL = 1.0
|
||||||
|
NODE_MAX_VEL = 2.0
|
||||||
|
|
||||||
|
NODE_MIN_RADIUS = 8
|
||||||
|
NODE_MAX_RADIUS = 30
|
||||||
|
|
73
main.py
Normal file
73
main.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Author: Logan Hunt
|
||||||
|
|
||||||
|
import pygame
|
||||||
|
from Graph import Graph
|
||||||
|
from Node import Node
|
||||||
|
from globals import * # Global variables
|
||||||
|
|
||||||
|
pygame.init()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
screen = pygame.display.set_mode((WIDTH,HEIGHT))
|
||||||
|
clock = pygame.time.Clock()
|
||||||
|
|
||||||
|
running = True
|
||||||
|
update = True
|
||||||
|
graph = Graph(screen, file="finalGraph.txt")
|
||||||
|
graph.fromFile()
|
||||||
|
graph.updateHashLinks()
|
||||||
|
|
||||||
|
nodeUnderMouse = None
|
||||||
|
|
||||||
|
while(running):
|
||||||
|
# Main loop
|
||||||
|
for event in pygame.event.get():
|
||||||
|
if event.type == pygame.QUIT:
|
||||||
|
# If the user closed the window
|
||||||
|
running = False
|
||||||
|
if event.type == pygame.KEYDOWN:
|
||||||
|
if event.key == pygame.K_f:
|
||||||
|
searchTerm = input("What would you like to search for? ")
|
||||||
|
for i in graph.nodes:
|
||||||
|
if searchTerm in i.text:
|
||||||
|
graph.nodesUnderMouse.append(i)
|
||||||
|
if event.key == pygame.K_c:
|
||||||
|
graph.nodesUnderMouse = []
|
||||||
|
if event.key == pygame.K_SPACE:
|
||||||
|
if (update):
|
||||||
|
update = False
|
||||||
|
else:
|
||||||
|
update = True
|
||||||
|
if event.key == pygame.K_p:
|
||||||
|
for i in graph.nodes:
|
||||||
|
if (i not in graph.nodesUnderMouse):
|
||||||
|
graph.nodesUnderMouse.append(i)
|
||||||
|
|
||||||
|
if event.type == pygame.MOUSEBUTTONUP:
|
||||||
|
mouseX, mouseY = pygame.mouse.get_pos()
|
||||||
|
for i in graph.nodes:
|
||||||
|
if(mouseX > i.pos[0] - i.radius and \
|
||||||
|
mouseY > i.pos[1] - i.radius and \
|
||||||
|
mouseX < i.pos[0] + i.radius and \
|
||||||
|
mouseY < i.pos[1] + i.radius):
|
||||||
|
i.updateB = False
|
||||||
|
if (i not in graph.nodesUnderMouse):
|
||||||
|
graph.nodesUnderMouse.append(i)
|
||||||
|
else:
|
||||||
|
if i in graph.nodesUnderMouse:
|
||||||
|
graph.nodesUnderMouse.remove(i)
|
||||||
|
i.updateB = True
|
||||||
|
|
||||||
|
screen.fill(BLACK)
|
||||||
|
|
||||||
|
if (update):
|
||||||
|
graph.updateNodePositions(1)
|
||||||
|
graph.draw()
|
||||||
|
|
||||||
|
pygame.display.flip()
|
||||||
|
clock.tick(60)
|
||||||
|
|
||||||
|
pygame.quit()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
46
parse.py
Normal file
46
parse.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
from globals import *
|
||||||
|
from Node import Node
|
||||||
|
|
||||||
|
def findNode(node, listOfNodes):
|
||||||
|
for i in range(len(listOfNodes)):
|
||||||
|
if node.text == listOfNodes[i].text:
|
||||||
|
return i
|
||||||
|
return len(listOfNodes)
|
||||||
|
|
||||||
|
# Each file is in the form
|
||||||
|
# <source> <destination> <weight>
|
||||||
|
def parse_input(filename):
|
||||||
|
nodes = []
|
||||||
|
links = []
|
||||||
|
|
||||||
|
lines = open(filename, "r").readlines()
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
# Parse each line and add to links array
|
||||||
|
if (not line == "\n"): # Line isn't empty
|
||||||
|
line_split = line.split(" ")
|
||||||
|
currSrc = Node(text=line_split[0])
|
||||||
|
currDest = Node(text=line_split[1])
|
||||||
|
|
||||||
|
currSrc_index, currDest_index = (findNode(currSrc, nodes), findNode(currDest, nodes))
|
||||||
|
appendSrc, appendDest = (False, False)
|
||||||
|
if (currSrc_index == len(nodes)):
|
||||||
|
appendSrc = True
|
||||||
|
if (currDest_index == len(nodes)):
|
||||||
|
appendDest = True
|
||||||
|
if (appendSrc):
|
||||||
|
nodes.append(currSrc)
|
||||||
|
currSrc_index = len(nodes)-1
|
||||||
|
if (appendDest):
|
||||||
|
nodes.append(currDest)
|
||||||
|
currDest_index = len(nodes)-1
|
||||||
|
|
||||||
|
if (len(line_split) > 2):
|
||||||
|
connection_description = "".join([str(x).strip() + " " for x in line_split[3::]])
|
||||||
|
else:
|
||||||
|
connection_description = ""
|
||||||
|
# Append the connection to links
|
||||||
|
links.append((nodes[currSrc_index], nodes[currDest_index], float(line_split[2]), connection_description))
|
||||||
|
|
||||||
|
return [nodes, links]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user