I had a great group for this project, and enjoyed optimizing global read alignment algorithms for a GPU. For longer (10k bp) sequences, our project "NeedleTail" (on an NVIDIA Titan XP) beats the parallel SIMD baseline ParaSail (on an Intel Xeon E5-2697) by ~30x, and the recent GPU research work GASAL2 by ~10x. Unfortunately for shorter (100 bp) sequences (more common in practice), ParaSail was ~5x faster and GASAL2 was ~25x faster than our work.
Although this course project cost me my entire Spring Break, it is probably the project I was most glad to finally complete. I designed an unordered MESI cache coherence protocol from scratch and formally verified it using the Murphi verification system. This type of programming is fraught with innumerable race conditions and edge cases, and was great practice for deep thinking and careful debugging.
This project was my first experience designing hardware using SystemVerilog. My project group chose to accelerate Guppy, the current leading nanopore basecaller. Although our design and simulation were successful, the chip requirements proved too large for practical use on an FPGA.
I tried my hand at game development in Unity, and realized it's not for me. Although Unity is an incredible tool, creating a polished product requires a huge time investment and just as much artistic ability as coding. I started working on a frog-jumping puzzle game inspired by Club Penguin's "Thin Ice", but eventually moved on to other projects.
I've written bots before to play online games on my laptop better than I ever could, but before this project I didn't know how to write one which could play apps on my phone. As a proof-of-concept, I selected the simple app Stick Hero, and spent a weekend messing around with MonkeyRunner. It performs far better than most humans (my bot's high score is 336, while mine is only 20), but due to fundamental timing inaccuracies isn't quite perfect.
I want to develop juggling balls which can identify the pattern in which they're being juggled in real time. Persevering through some exploding batteries, I now have a working hardware prototype which consists of a Raspberry Pi Zero W, a 6-axis accelerometer/gyroscope, a LiPo battery, and some circuitry for voltage conversion and overdischarge protection.
For EE senior design we designed, built, and programmed a quadcopter. When switched into autonomous flight mode, it would search for a series of QR codes placed on the ground and land.
A solver for semidefinite optimization problems written in MATLAB. Used as a reference solver for my CUDA C++ implementation, it was naively implemented and can only solve small optimization problems due to large memory usage.
I wrote the AES encryption algorithm in Python from scratch for our chat program containing a chat server and multiple clients. Messages are only legible for clients who connect to the chat server using the same secret key.
For EE junior lab we used op amps, 555 timers, resistors, and capacitors to create a PID controller. Photoresistors and a servo motor enable the robot's head to swivel and track a moving light source.
For CS350 I worked with four friends to build the Cyber Reconnaissance And Targeted Offensive Rover. It was composed of a remote controlled (RC) car, a Jetson TX1 computing module, a Raspberry Pi, several Arduino microcontrollers, a GPS sensor, an accelerometer, a magnetometer, and an LCD touchscreen display. The rover intercepts WiFi broadcast signals and generates signal-strength maps of nearby networks, visible in real-time for our web server. I also worked on path detection algorithms for outdoor navigation.
For our AI project, we wrote our own tank-battling game and trained tanks to battle against one another using a genetic algorithm. Tanks were given limited information (their radar could detect the presence of bullets, enemies, and walls within each region), and learned strategies to be the last tank alive. After several hundred generations, tanks learned basic dodging tactics and that they should shoot at their enemies.
For a compilers course, I wrote a basic PASCAL to x86 Assembly compiler in C using Lex and Yacc. Although it does not have full language support (no strings), most of the important functionality such as control flow statements, function calls, recursion, and real and floating point data types are supported.
During my sophomore year, the webmaster for the Honors Program started developing a new student website and then abandoned the project. I volunteered to take over, and have since been responsible for completing the website, creating a textbook exchange, and enabling easier submission and recording of service hours for over one hundred students.
Because I was curious to learn how 3D rendering works in video games and movies, I wrote this ray tracer from scratch in C++, following several online references. It performs anti-aliasing, handles reflections, and can depict standard geometric objects such as planes, spheres, and polyhedra. Here's an example GIF rendering!
For my introduction to programming class, Sam and I programmed a TurtleBot to store a 3D voxel map of obstacles as it is driven around a room. This map is then flattened into two dimensions, and the user can select a point on the map for the robot to navigate to.
After about a year or so of solving small toy problems, I wanted to work on a larger project and so I wrote a program to automate Sudoku puzzle solving.