Dijkstra's Pathfinding Algorithm Visualization

This project focuses on visualizing the Dijkstra's Pathfinding Algorithm in real time. I was introduced to pathfinding visualization a few years ago and knew I wanted to make a project like this ever since. This project allows the user to draw their own walls on the grid to create their own paths, or they can generate a random one. Visual elements displayed on the grid can also be changed by the user. Click here to see it!

This project was made with TypeScript, HTML/CSS, and I used Angular as a front-end framework. This website is deployed and hosted through Github Pages.

Patent Art Twitter Bot

This project tweets out a random U.S. Patent from Google Patents each hour. I think Patent art is super cool looking and is often very detailed, so I decided to make this bot to see what kind of patents are out there. Tweets include the patent name/number, the current owner/inventor, a link to the Google Patent page, 1-4 images, and an abstract in the replies if available. Only patents with pictures are tweeted.

Below is an example of a random tweet. Throughout working on this project I have found so many interesting/useful/useless/intricate patents that I would have never known about othewrwise.

This project was made with Python, Twitter API v2, and runs on a cron schedule through GitHub actions.

NFL Fantasy Football Point Predictor

Im a big fan of fantasy football, so for my Capstone project my partner and I decided to make a score predictor model trained on data we sourced. The predictions displayed are for the current NFL week. This was my first introduction to training models and using Scikit learn. We sourced all of our data from Pro Football Reference. Our search function includes autofill for all fantasy players. Real-time game status is also displayed for each player which is sourced from ESPN. On top of predictions, historical fantasy data tables are also provided which can be filtered by NFL team/position/year and can be sorted by any table value.

This project was made with Python, we used Flask for our front-end framework and the Scikit-learn package for our model.

Y86-64 Simulator

This project includes a Y86-64 Simulator written fully in C/C++. Y86-64 simplifies many aspects of a real-world architecture like x86-64 to focus on core concepts such as pipelining, instruction execution, and memory hierarchy. This simulator handles all instrcution set architecture, memory calls, piping, loading, debugging, and compiling. This project allowed me to understand computer architecture/memory a lot better, which, in-turn made me a better programmer.

Below is a sample input file written in y86 assembly, this code resembles a function that finds the absolute value of a number.

      .pos 0
    irmovq list, %rax
    mrmovq (%rax), %rdx
    xorq %rcx, %rcx
    nop
    nop
    subq %rdx, %rcx
    cmovl %rdx, %rcx
    rmmovq %rcx, (%rax)
    irmovq 8, %rsi
    addq %rsi, %rax
    mrmovq (%rax), %rdx
    xorq %rcx, %rcx
    nop
    nop
    subq %rdx, %rcx
    cmovl %rdx, %rcx
    rmmovq %rcx, (%rax)
    addq %rsi, %rax
    mrmovq (%rax), %rdx
    xorq %rcx, %rcx
    nop
    nop
    subq %rdx, %rcx
    cmovl %rdx, %rcx
    rmmovq %rcx, (%rax)
    addq %rsi, %rax
    mrmovq (%rax), %rdx
    xorq %rcx, %rcx
    nop
    nop
    subq %rdx, %rcx
    cmovl %rdx, %rcx
    rmmovq %rcx, (%rax)
    addq %rsi, %rax
    mrmovq (%rax), %rdx
    xorq %rcx, %rcx
    nop
    nop
    subq %rdx, %rcx
    cmovl %rdx, %rcx
    rmmovq %rcx, (%rax)
    addq %rsi, %rax
    halt
    
          .align 8
    list: .quad -2            #at end: 2
          .quad 5             #at end: 5 
          .quad -15           #at end: f
          .quad 0             #at end: 0
          .quad -1            #at end: 1
    

That input code was then compiled into a y86 assembly object that could then be read by the simulator.

0x000:                      |       .pos 0
0x000: 30f0b000000000000000 | irmovq list, %rax
0x00a: 50200000000000000000 | mrmovq (%rax), %rdx
0x014: 6311                 | xorq %rcx, %rcx
0x016: 10                   | nop
0x017: 10                   | nop
0x018: 6121                 | subq %rdx, %rcx
0x01a: 2221                 | cmovl %rdx, %rcx
0x01c: 40100000000000000000 | rmmovq %rcx, (%rax)
0x026: 30f60800000000000000 | irmovq 8, %rsi
0x030: 6060                 | addq %rsi, %rax
0x032: 50200000000000000000 | mrmovq (%rax), %rdx
0x03c: 6311                 | xorq %rcx, %rcx
0x03e: 10                   | nop
0x03f: 10                   | nop
0x040: 6121                 | subq %rdx, %rcx
0x042: 2221                 | cmovl %rdx, %rcx
0x044: 40100000000000000000 | rmmovq %rcx, (%rax)
0x04e: 6060                 | addq %rsi, %rax
0x050: 50200000000000000000 | mrmovq (%rax), %rdx
0x05a: 6311                 | xorq %rcx, %rcx
0x05c: 10                   | nop
0x05d: 10                   | nop
0x05e: 6121                 | subq %rdx, %rcx
0x060: 2221                 | cmovl %rdx, %rcx
0x062: 40100000000000000000 | rmmovq %rcx, (%rax)
0x06c: 6060                 | addq %rsi, %rax
0x06e: 50200000000000000000 | mrmovq (%rax), %rdx
0x078: 6311                 | xorq %rcx, %rcx
0x07a: 10                   | nop
0x07b: 10                   | nop
0x07c: 6121                 | subq %rdx, %rcx
0x07e: 2221                 | cmovl %rdx, %rcx
0x080: 40100000000000000000 | rmmovq %rcx, (%rax)
0x08a: 6060                 | addq %rsi, %rax
0x08c: 50200000000000000000 | mrmovq (%rax), %rdx
0x096: 6311                 | xorq %rcx, %rcx
0x098: 10                   | nop
0x099: 10                   | nop
0x09a: 6121                 | subq %rdx, %rcx
0x09c: 2221                 | cmovl %rdx, %rcx
0x09e: 40100000000000000000 | rmmovq %rcx, (%rax)
0x0a8: 6060                 | addq %rsi, %rax
0x0aa: 00                   | halt
                            | 
0x0b0:                      |       .align 8
0x0b0: feffffffffffffff     | list: .quad -2            #at end: 2
0x0b8: 0500000000000000     |       .quad 5             #at end: 5 
0x0c0: f1ffffffffffffff     |       .quad -15           #at end: f
0x0c8: 0000000000000000     |       .quad 0             #at end: 0
0x0d0: ffffffffffffffff     |       .quad -1            #at end: 1

Once the simulator is run with the compiled code, the following ouput is produced. This shows how the simulator steps through the program, and keeps track of registers, flags, memory values, pipelines, etc... The following output is cut short for performance reasons.

At end of cycle 0:
F: predPC: 00a
D: stat: 1 icode: 3 ifun: 0 rA: f rB: 0 valC: 00000000000000b0 valP: 00a
E: stat: 1 icode: 1 ifun: 0 valC: 0000000000000000 valA: 0000000000000000
E: valB: 0000000000000000 dstE: f dstM: f srcA: f srcB: f
M: stat: 1 icode: 1 Cnd: 0 valE: 0000000000000000 valA: 0000000000000000 dstE: f dstM: f
W: stat: 1 icode: 1 valE: 0000000000000000 valM: 0000000000000000 dstE: f dstM: f

ZF: 0 SF: 0 OF: 0
%rax: 0000000000000000 %rcx: 0000000000000000 %rdx: 0000000000000000 %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 1:
F: predPC: 014
D: stat: 1 icode: 5 ifun: 0 rA: 2 rB: 0 valC: 0000000000000000 valP: 014
E: stat: 1 icode: 3 ifun: 0 valC: 00000000000000b0 valA: 0000000000000000
E: valB: 0000000000000000 dstE: 0 dstM: f srcA: f srcB: f
M: stat: 1 icode: 1 Cnd: 0 valE: 0000000000000000 valA: 0000000000000000 dstE: f dstM: f
W: stat: 1 icode: 1 valE: 0000000000000000 valM: 0000000000000000 dstE: f dstM: f

ZF: 0 SF: 0 OF: 0
%rax: 0000000000000000 %rcx: 0000000000000000 %rdx: 0000000000000000 %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 2:
F: predPC: 016
D: stat: 1 icode: 6 ifun: 3 rA: 1 rB: 1 valC: 0000000000000000 valP: 016
E: stat: 1 icode: 5 ifun: 0 valC: 0000000000000000 valA: 0000000000000000
E: valB: 00000000000000b0 dstE: f dstM: 2 srcA: f srcB: 0
M: stat: 1 icode: 3 Cnd: 0 valE: 00000000000000b0 valA: 0000000000000000 dstE: 0 dstM: f
W: stat: 1 icode: 1 valE: 0000000000000000 valM: 0000000000000000 dstE: f dstM: f

ZF: 0 SF: 0 OF: 0
%rax: 0000000000000000 %rcx: 0000000000000000 %rdx: 0000000000000000 %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 3:
F: predPC: 017
D: stat: 1 icode: 1 ifun: 0 rA: f rB: f valC: 0000000000000000 valP: 017
E: stat: 1 icode: 6 ifun: 3 valC: 0000000000000000 valA: 0000000000000000
E: valB: 0000000000000000 dstE: 1 dstM: f srcA: 1 srcB: 1
M: stat: 1 icode: 5 Cnd: 0 valE: 00000000000000b0 valA: 0000000000000000 dstE: f dstM: 2
W: stat: 1 icode: 3 valE: 00000000000000b0 valM: 0000000000000000 dstE: 0 dstM: f

ZF: 0 SF: 0 OF: 0
%rax: 0000000000000000 %rcx: 0000000000000000 %rdx: 0000000000000000 %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 4:
F: predPC: 018
D: stat: 1 icode: 1 ifun: 0 rA: f rB: f valC: 0000000000000000 valP: 018
E: stat: 1 icode: 1 ifun: 0 valC: 0000000000000000 valA: 0000000000000000
E: valB: 0000000000000000 dstE: f dstM: f srcA: f srcB: f
M: stat: 1 icode: 6 Cnd: 0 valE: 0000000000000000 valA: 0000000000000000 dstE: 1 dstM: f
W: stat: 1 icode: 5 valE: 00000000000000b0 valM: fffffffffffffffe dstE: f dstM: 2

ZF: 1 SF: 0 OF: 0
%rax: 00000000000000b0 %rcx: 0000000000000000 %rdx: 0000000000000000 %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 5:
F: predPC: 01a
D: stat: 1 icode: 6 ifun: 1 rA: 2 rB: 1 valC: 0000000000000000 valP: 01a
E: stat: 1 icode: 1 ifun: 0 valC: 0000000000000000 valA: 0000000000000000
E: valB: 0000000000000000 dstE: f dstM: f srcA: f srcB: f
M: stat: 1 icode: 1 Cnd: 0 valE: 0000000000000000 valA: 0000000000000000 dstE: f dstM: f
W: stat: 1 icode: 6 valE: 0000000000000000 valM: 0000000000000000 dstE: 1 dstM: f

ZF: 1 SF: 0 OF: 0
%rax: 00000000000000b0 %rcx: 0000000000000000 %rdx: fffffffffffffffe %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 6:
F: predPC: 01c
D: stat: 1 icode: 2 ifun: 2 rA: 2 rB: 1 valC: 0000000000000000 valP: 01c
E: stat: 1 icode: 6 ifun: 1 valC: 0000000000000000 valA: fffffffffffffffe
E: valB: 0000000000000000 dstE: 1 dstM: f srcA: 2 srcB: 1
M: stat: 1 icode: 1 Cnd: 0 valE: 0000000000000000 valA: 0000000000000000 dstE: f dstM: f
W: stat: 1 icode: 1 valE: 0000000000000000 valM: 0000000000000000 dstE: f dstM: f

ZF: 1 SF: 0 OF: 0
%rax: 00000000000000b0 %rcx: 0000000000000000 %rdx: fffffffffffffffe %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 7:
F: predPC: 026
D: stat: 1 icode: 4 ifun: 0 rA: 1 rB: 0 valC: 0000000000000000 valP: 026
E: stat: 1 icode: 2 ifun: 2 valC: 0000000000000000 valA: fffffffffffffffe
E: valB: 0000000000000000 dstE: 1 dstM: f srcA: 2 srcB: f
M: stat: 1 icode: 6 Cnd: 0 valE: 0000000000000002 valA: fffffffffffffffe dstE: 1 dstM: f
W: stat: 1 icode: 1 valE: 0000000000000000 valM: 0000000000000000 dstE: f dstM: f

ZF: 0 SF: 0 OF: 0
%rax: 00000000000000b0 %rcx: 0000000000000000 %rdx: fffffffffffffffe %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 8:
F: predPC: 030
D: stat: 1 icode: 3 ifun: 0 rA: f rB: 6 valC: 0000000000000008 valP: 030
E: stat: 1 icode: 4 ifun: 0 valC: 0000000000000000 valA: 0000000000000002
E: valB: 00000000000000b0 dstE: f dstM: f srcA: 1 srcB: 0
M: stat: 1 icode: 2 Cnd: 0 valE: fffffffffffffffe valA: fffffffffffffffe dstE: f dstM: f
W: stat: 1 icode: 6 valE: 0000000000000002 valM: 0000000000000000 dstE: 1 dstM: f

ZF: 0 SF: 0 OF: 0
%rax: 00000000000000b0 %rcx: 0000000000000000 %rdx: fffffffffffffffe %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *

At end of cycle 9:
F: predPC: 032
D: stat: 1 icode: 6 ifun: 0 rA: 6 rB: 0 valC: 0000000000000000 valP: 032
E: stat: 1 icode: 3 ifun: 0 valC: 0000000000000008 valA: 0000000000000000
E: valB: 0000000000000000 dstE: 6 dstM: f srcA: f srcB: f
M: stat: 1 icode: 4 Cnd: 0 valE: 00000000000000b0 valA: 0000000000000002 dstE: f dstM: f
W: stat: 1 icode: 2 valE: fffffffffffffffe valM: 0000000000000000 dstE: f dstM: f

ZF: 0 SF: 0 OF: 0
%rax: 00000000000000b0 %rcx: 0000000000000002 %rdx: fffffffffffffffe %rbx: 0000000000000000
%rsp: 0000000000000000 %rbp: 0000000000000000 %rsi: 0000000000000000 %rdi: 0000000000000000
% r8: 0000000000000000 % r9: 0000000000000000 %r10: 0000000000000000 %r11: 0000000000000000
%r12: 0000000000000000 %r13: 0000000000000000 %r14: 0000000000000000 

000: 0000000000b0f030 0000000020500000 1010116300000000 0000104021222161 
020: f630000000000000 0000000000000008 0000000020506060 1010116300000000 
040: 0000104021222161 6060000000000000 0000000000002050 2161101011630000 
060: 0000000010402122 2050606000000000 0000000000000000 2122216110101163 
080: 0000000000001040 0000205060600000 1163000000000000 1040212221611010 
0a0: 0000000000000000 0000000000006060 fffffffffffffffe 0000000000000005 
0c0: fffffffffffffff1 0000000000000000 ffffffffffffffff 0000000000000000 
0e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 *
...
Automated Gym Reservation Bot

As a freshman at App State, I made my first practical coding project amid COVID-19. Throughout the pandemic, there were social distancing restrictions at my university gym. With just 10 slots available every hour, and a high demand among 20,000+ students, securing a workout time online became a challenge. Driven by my interest in Python automation at the time, I developed a bot using Selenium to automate the reservation process. I was able to secure a spot every day without the worry of missing out until the restrictions were lifted.