blog

Personal blog
git clone git://git.laack.co/blog.git
Log | Files | Refs

prim-rlib.py (4763B)


      1 import pyray as pr
      2 import statistics
      3 import heapq
      4 import random
      5 import math
      6 import time
      7 
      8 fts = []
      9 first_time = []
     10 
     11 
     12 pr.init_window(5120,1440, "prim")
     13 texture = pr.load_render_texture(5120,1440)
     14 
     15 for _ in range(0,10):
     16     VERTICES = 2500
     17     EDGES = 25000
     18     RADIUS = 5
     19 
     20 
     21     class Vertex():
     22         def __init__(self, x, y):
     23             self.x = x
     24             self.y = y
     25             self.visited = False
     26         def draw_vertex(self):
     27             if self.visited:
     28                 pr.draw_circle(int(self.x),int(self.y), RADIUS, pr.WHITE)
     29             else:
     30                 pr.draw_circle(int(self.x),int(self.y), RADIUS, pr.GRAY)
     31     class Edge():
     32         def __init__(self, v1, v2):
     33             self.v1 = v1
     34             self.v2 = v2
     35             self.dist = math.sqrt(((v1.x - v2.x) ** 2) + ((v1.y - v2.y) ** 2))
     36         def draw_edge(self, c):
     37             pr.draw_line(int(self.v1.x), int(self.v1.y), int(self.v2.x), int(self.v2.y), c)
     38 
     39         def __lt__(self,otr):
     40             return self.dist < otr.dist
     41 
     42 
     43     graph = {}
     44 
     45     for i in range(0,VERTICES):
     46         x = random.random() * 5120
     47         y = random.random() * 1440
     48         graph[Vertex(x,y)] = []
     49 
     50 
     51     edge_list = []
     52     keys = list(graph.keys())
     53 
     54     for i in range(0,EDGES):
     55         k1 = None
     56         k2 = None
     57         while k1 == k2:
     58             k1 = random.choice(keys)
     59             k2 = random.choice(keys)
     60 
     61         edge = Edge(k1,k2)
     62         graph[k1].append(edge)
     63         graph[k2].append(edge)
     64         edge_list.append(edge)
     65 
     66 
     67     edge_heap = []
     68     visited_vertices = set()
     69 
     70 
     71     start = random.choice(keys)
     72     start.visited = True
     73     visited_vertices.add(start)
     74     for edge in graph[start]:
     75         heapq.heappush(edge_heap, edge)
     76 
     77 
     78     first = True
     79 
     80     to_draw_vert = []
     81     to_draw_edge = []
     82 
     83     while True:
     84 
     85 
     86         if first:
     87             start = time.monotonic_ns()
     88             pr.begin_texture_mode(texture)
     89             pr.clear_background(pr.BLACK)
     90 
     91             edge_times = []
     92             vertex_times = []
     93 
     94             for edge in edge_list:
     95                 es = time.monotonic_ns()
     96                 edge.draw_edge(pr.DARKGRAY)
     97                 ee = time.monotonic_ns()
     98                 edge_times.append(ee - es)
     99             for vertex in graph:
    100                 vs = time.monotonic_ns()
    101                 vertex.draw_vertex()
    102                 ve = time.monotonic_ns()
    103                 vertex_times.append(ve - vs)
    104             first = False
    105             pr.end_texture_mode()
    106             source_rec = pr.Rectangle(0, 0, 5120, 1440)
    107             dest_rec = pr.Rectangle(0, 0, 5120,1440)
    108             pr.begin_drawing()
    109             pr.draw_texture_pro(texture.texture, source_rec, dest_rec, pr.Vector2(0, 0), 0, pr.WHITE)
    110             pr.end_drawing()
    111             end = time.monotonic_ns()
    112             first_time.append(end - start)
    113 
    114             print("Edge time avg: " + str(sum(edge_times) / len(edge_times)))
    115             print("Vertex time avg: " + str(sum(vertex_times) / len(vertex_times)))
    116 
    117             continue
    118 
    119 
    120         if len(to_draw_edge) != 0 or len(to_draw_vert) != 0:
    121             start = time.monotonic_ns()
    122             pr.begin_texture_mode(texture)
    123             for edge in to_draw_edge:
    124                 edge.draw_edge(pr.WHITE)
    125             for vert in to_draw_vert:
    126                 vert.draw_vertex()
    127             pr.end_texture_mode()
    128             source_rec = pr.Rectangle(0, 0, 5120, 1440)
    129             dest_rec = pr.Rectangle(0, 0, 5120,1440)
    130 
    131             pr.begin_drawing()
    132             pr.draw_texture_pro(texture.texture, source_rec, dest_rec, pr.Vector2(0, 0), 0, pr.WHITE)
    133             pr.end_drawing()
    134             end = time.monotonic_ns()
    135             fts.append(end - start)
    136             to_draw_vert = []
    137             to_draw_edge = []
    138 
    139 
    140         item = None
    141         while edge_heap:
    142             candidate = heapq.heappop(edge_heap)
    143             if (candidate.v1 in visited_vertices) != (candidate.v2 in visited_vertices):
    144                 item = candidate
    145                 break
    146 
    147         if item is None:
    148             break
    149 
    150         new_vertex = item.v2 if item.v1 in visited_vertices else item.v1
    151         visited_vertices.add(new_vertex)
    152         new_vertex.visited = True
    153 
    154         to_draw_vert.append(new_vertex)
    155         to_draw_edge.append(item)
    156 
    157         for edge in graph[new_vertex]:
    158             if not edge.v1 in visited_vertices or not edge.v2 in visited_vertices:
    159                 heapq.heappush(edge_heap, edge)
    160 
    161 
    162 pr.unload_render_texture(texture)
    163 pr.close_window()
    164 
    165 print("Average frame time (ns): " + str(sum(fts) / len(fts)))
    166 print("Std. deviation frame time (ns): " + str(statistics.stdev(fts)))
    167 
    168 print("Average first frame time (ns): " + str(sum(first_time) / len(first_time)))
    169 print("Std. deviation first frame time (ns): " + str(statistics.stdev(first_time)))