I started photography at the end of my senior year in order to capture my favorite places around UC San Diego. Since then I've joined the Blue and Gold Yearbook team at Berkeley in order to photograph campus events, and I'm also an active member of the UCSD Photography club. My favorite photography is architecture, macro, and landscape.
In addition to the photos on this website, I also have other work available at my Flickr Photostream. I also have included some of my favorite photos below
Liquid Graph was the implementation of (what will most likely become) my Master's Thesis at UC Berkeley. To summarize in Layman's terms, it rolls a ball out of a maze.
To summarize in more scientific terms, it performs an interesting hybrid algorithm between Artifical Intelligence and Computational Geometry to determine a series of rotations to roll a small particle out of a 2D polygonal mesh. It uses parametric equations for all of the geometric math and search space exploration, so the computational time is quite efficient (in contrast to using something like Euler integration). The AI search exploration step corresponds to tracing out samples from the current concave vertex -- this search is animated on the screen as the algorithm runs (resulting in a nice visual result).
Eventually I'll write up a formal paper for this algorithm, but for now the Github source will have to suffice. I also highly recommend checking out the demo of the algorithm running!
Algorithm Demo HackerNews Discussion GithubGenetic GPU was a really fun final project I completed for ME202 at UC Berkeley. It essentially performs Non-Convex Optimization on the GPU with WebGL by using some clever shader hacks. It can sample from any N-Dimensional space (despite only having a 2D grid of vertices) and optimizes most surfaces quite quickly. It runs about 55x faster than Matlab without extra optimizations (and while drawing the surface for the user).
I also added realtime clustering support -- users can send the link to a friend and automatically join a "computational room" where the search space is divided up and global minimums are compared across workers. I used the excellent Now.JS for this part of the project. Between the realtime clustering and the parallel nature of GPU work, I titled this project "Massively Parallel Genetic Algorithms."
I completed a writeup on the algorithm for the class; it's from a very high level but should give an idea of the strategies used perform such rapid optimization. The Github Source and a link to the application are below as well
Github Source Project Writeup Application DemoIn order to learn WebGl and the Facebook graph API over winter break, I wanted to tackle a project that combined them together into a unique application experience. With so many diverse and interesting personal stories on Facebook, it can be hard to really appreciate the beauty of the diverse collection of friends we have. I sought out to visualize these geographic relationships (both in present and in the past) and display them interactively.
There was a sizeable amount to learn for this project; I had to dive into the WebGL shader language, the intricacies of the Facebook graph API, GPU data buffering, off-frame rendering, and several other complex ideas I had never approached before. There was also a considerable design challenge to represent this rich graph of relationships in memory. Because all the data from the Facebook graph arrives asychronously, the graph essentially has to be constructed in any order at any time. Multiply queries are usually required to resolve the GPS coordinates of a particular place, so several layers of asychronous requests have to be made (and cascaded) as data is available or not. After a large amount of abstraction, I obtained a pretty robust system that all operates independently.
Links to the Application, the Github page, and a video showing the application are below:
Application Youtube Video Github PageThe best assignment (by far) for CS 184 was programming a complete ray tracer in C++. It was incredibly exciting (and sometimes intimidating) to build everything from the ground up; ray-sphere intersection tests, transformation matrices, homogenous coordinates, camera locations, and everything else was coded from scratch. At the end of the assignment though, I had a piece of software that I was really proud of.
After getting the basics down, I went the extra mile and implemented some other features. I got soft-shadows working (as well as non-linear projection). To make some nice final renders, I wrote a python script to generate interesting scene files.
We also completed a small assignment on Parametric surface subdivision, using both a uniform and adaptive algorithm. The assignment was rather simple, but it was really exciting to see an application of such a theoretical concept into actual code to produce a real model. The triangle-based adaptive subdivision algorithm was also fun to code and produces really intricate patterns in the final models.
My final project for CS 184 was a gravity particle simulator with user interaction. Once complete, I was able to watch orbits evolve over time from different configurations. It still astounds me how such random positions and velocities (when put into a gravity simulator) can draw out such mathematically beautiful orbit paths.
This assignment was tricky in certain places though. I had to use a 3-2-1 set of Euler angles for camera position and orientation, and then I had to map angular velocities about each of the Euler basis vectors back into changes in each Euler angle. Ray picking from user clicks and getting the particle insertion GUI flow down was difficult (but rewarding) as well.
Report PDF Poster PDF Youtube VideoME 280A was by far the hardest (and most rewarding) class of my academic career. Before taking the class, I thought I understood the finite element method - stiffness matrices, loading vectors, and everything else was quite intuitive and my Matlab scripts worked great.
Little did I know that my understanding only brushed the surface of the wonders of the finite element method. Basis functions, Galerkins method, the Best Approximation theroem, and the derivation of the weak form were all unknown to me. After Professor Zohdi's lectures, seven rigorous homework assignments, and an intense final test I finally feel like I have a deep understanding of the subject. I also loved hearing about the history of FEM and how a lot of this original NASTRAN software actually brought us to the moon.
Our last major programming assignment was implementing the finite element method on a thermal conductivity ODE over a two dimensional arch. We had to write both a uniform and adaptive arch mesher to actually produce the connectivity matrix and nodal locations; after this challenge was complete, we had to implement the entire FEM method from scratch in two dimensions. I chose to implement everything in terms of anonymous functions (similar to a Scheme approach) which simplified some of my functionality down the line.
PDFThe final exam was the first (and only) test we had on the theoretical parts of the class. After 15 weeks of pure theoretical lectures, we had a lot to study to prepare :O For three straight days, three other students and I studied in Blum Hall's basement on campus and endlessly drilled on the theoretical parts of the class.
The interesting thing is that after these three days, I actually understood everything. It wasn't like a typical class where you memorize the important concepts and regurgitate them on the test... this was something else altogether. At the end of those three days, we all knew how to derive the weak form for any ODE (whether or not it was non-linear, spatially variant, three dimensional, time-variant, etc etc). We derived (by ourselves) the variables for the Conjugate Gradient method, the process of linearizing and iterating through a non-linear time-variant ODE, the geometric error as a function of the Jacobian mapping, the divergence theorem, Galerkin's best approximation theorem, and many others. It was a crazy 72 hours of my life, but I left that classroom feeling like a graduate student for the first time.
Last HW PDFMy time at UC Berkeley has been absolutely priceless. The research on campus (in all engineering disciplines) is absolutely brilliant, and being surrounded by such successful peers has driven me to excel in everything that I do. The campus has a great deal of legacy as well, which makes me try even harder to fill the giant shoes left behind by previous Berkeley alumni classes.
I left the MS/PhD program with my Masters of Science to pursue even greater goals while working at Facebook, but I still remain very connected to Berkeley's campus.
My ResumeI actually studied Mechanical Engineering at UC San Diego for my undergraduate degree. When I began college, I found the introductory CS classes to be fairly straight-forward as someone with a previous programming background. In order to get the most out of my degree, I wanted a major where I was challenged in every class and exposed to completely new concepts. I found exactly that in Mechanical Engineering.
Mechanical study is a completely different (and amazing) beast as compared to computer science. The Navier Stokes equation, electrical design, thermodynamics, heat transfer, fluid mechanics, intermediate dynamics - all of these subjects had a rigorous theoretical basis that really expanded my mind and taught me to think in new and entirely different ways. I decided to teach myself programming in my spare time while taking mechanical classes to get the best of both worlds. I owe a lot of my intellectual ability to the mechanical classes I took and the ways they challenged me.
The most rewarding experience of my undergraduate degree (after the curriculum) was serving as a University College Ambassador for two years. I had never been the strongest public speaker in high school, and I highly admired the confidence and ease with which the tour guides at UCSD presented. After taking on other jobs to gain experience, I finally applied, trained, and graduated to a university tour guide my junior year.
After the 10 week training program, I finally reached the presentation / public speaking "zen" that other tour guides displayed so prominently. After enough practice and worry and stress about being the "perfect" public speaker during training, I finally abandoned that entire mode of thought and instead decided to just present as myself. It was this change in mindset that led to me to become a great tour guide, and I had the pleasure of speaking to thousands of UC San Diego visitors over the course of my career.
A photo of other tour guides and myself in a UCSD brochure
I absolutely loved living in San Diego for four years. The weather was excellent, the beach was right next to campus, and the entire city has focus on living a healthy lifestyle. Sometimes I think that Silicon Valley could benefit from some of the "laid back" atmosphere that San Diego exemplifies :P
After running cross country in high school, I ran a marathon my sophomore year (2:47) and then switched to triathlon full time. In addition to photography, I love to swim, bike, and run all over whichever city I currently reside in. I also try to keep up to date with technology news, and sometimes I steal away time to practice my secret hobby of ceramics
At the San Diego Zoo