I am a Homo sapien who loves to play chess, longboard, and code. I decided to create this webpage to
showcase my personal projects. I hope to explain projects and why I decided to do them. They have tickled
my interests and taught me so much about computer science, mathematics, and physics. Perhaps they can
interest you to explore these topics as they did for me. :)
For a final project in Stanford's CS248 my
project partner and I wrote a raytracer in Rust. Our
features include textures, reflection, refraction, phong shading, different types of lights, and the ability
to import Wavefront (.obj)
files.
Bayesian Optimization and Search-based Optimization are two broad families of algorithms that try to find the
global optima of a function with the goal of minimizing the number of function evaluations without requiring
its derivative. A large body of existing work deals with the single-fidelity setting, where function
evaluations are exact but may be expensive. Multi-fidelity evalution takes advantage of the fact that we may have access to
low-fidelity functions that approximate our objective function and are much cheaper to evalute. Multi-fidelity
Hybrid (MF-Hybrid) combines the best attributes of both families of algorithms and outperfomrs existing
single-fidelity and multi-fidelity optimization algorithms. Black-box global optimization has applications in
Machine Learning, Physics, Engineering, and much more. My report was selected as the best two-page student
abstract in AAAI-18 where I won first
place in a Three Minute Thesis student
abstract presentation competition.
In computer graphics, fluid is used to describe systems like fire, smoke, and dust. It is notoriously hard to
simulate fluid in real-time, so particle systems are usually used to approximate them. However, non-particle
based fluid simulations can make fluid effects more realistic and visually interesting. I created a real-time
fluid simulation using fast algorithms
based on the Navier-Stokes equations accelerated by the GPU with OpenCL. From this project I have learned
about fluid dynamics, the architecture of the GPU, how to manage memory efficiently with OpenCL, and the
interoperability between OpenGL and OpenCL.
For a given set of points, called sites, a Voronoi diagram is usually defined to be a partition of regions on the plane such that
the set of all points within each region are closer to their corresponding site than any other site. Its dual,
the Delaunay triangulation,
has no sites inside the circumcircle of any triangle. Both of these are very useful for nearest neighbor
queries and generating nice triangulations, respectively. There is no reason they must be restriced to the
plane and so my program constructs Voronoi diagrams from a set of sites on the unit sphere. Since speed was a
major concern, I designed a multithreaded implementation of Fortune's algorithm to generate
a Voronoi diagram from thousands of sites in a fraction of a second.
The Rubik's cube is a fascinating puzzle that has entertained me for much of my life. Finding optimal
solutions (20 moves or fewer) can consume a large amount
of time and memory due to its enormous search space of 43,252,003,274,489,856,000 cube states for the 3x3x3. I used Thistlethwaite's algorithm to solve
arbitrary cubes using about 35 moves in about 15 milliseconds with 43 MB of pregenerated table data. I used
OpenGL for rendering and SDL for window and event management. This project is an interesting application for
group theory, combinatorics, and graph traversal algorithms.