Welcome
I am a Software Engineer, focused on back-end engineering. In my past life I was a Civil Engineer. In addition to my full-time job, I am currently studying a Master's degree from Harvard in the field of Software Engineering.
My interests are in CS theory, algorithms, and mathematics.
Interesting Projects
A collection of interesting projects I've done, either through courses I've taken or pet projects. Since many of these are assignments from my studies, my code implementation is not included for public viewing.
-
CS 124: Random Minimum Spanning Trees
This document contains the accompanying write-up to my implementation of a Minimum Spanning Tree (MST) algorithm for complete, undirected, and random graphs. The goal of this experiment was to investigate how the average weight of the MST grows as a function of n. The experiment was carried out on four different variations of the complete, undirected, and random graph.
-
CS 124: Strassen's Matrix Multiplication Crossover
This document contains the accompanying write-up to my implementation of Strassen’s divide and combine matrix multiplication algorithm for n by n matrices. The goal of this experiment was to determine the optimal crossover point at which the base case of the recursive Strassen’s algorithm is invoked. Specifically, the base case uses the conventional method of matrix multiplication on the subproblems of Strassen’s divide and combine strategy. In the context of this experiment, the optimal crossover point is defined to be the matrix dimension size that allows Strassen’s algorithm to outperform the running time of the conventional matrix multiplication method. This experiment includes both analytical and experimental analysis when comparing the running times of both methods.
-
CS 124: Metaheuristic Algorithms for a NP-complete Problem
This experiment first provides a solution to the Number Partition problem using a dynamic programming approach. Then the deterministic algorithm Karmarkar-Karp algorithm which uses a differencing method is discussed briefly, along with the different forms of solutions to the Number Partition problem and how to convert them into comparable forms. We then introduce and describe the implementation details of the randomized heuristic algorithms used in this study, as well as with the Karmarkar-Karp algorithm and its randomized variant, BubbleSearch. The randomized heuristic algorithms we investigate in this experiment include: Repeated Random, Hill Climbing, and Simulated Annealing, with further details being provided in later sections.
-
This project involves implementing a Turing-complete, metacircular interpreter for a subset of the OCaml programming language. I have implemented both the substitution and dynamic environment models, along with several other extensions to the language: adding additional atomic types and operators, modifying the environment semantics to to manifest lexical scope, augmenting the syntax to allow for the curried function definition syntactic sugar, and including references and mutability to the language.
-
CS 88C: Big Data Streaming with the Kappa Architecture
This project involved architecting and building a pipeline based on the Kappa Architecture, by Jay Kreps. At a high level, raw data is ingested into a Kafka Broker, which acts as a messaging service for both producers and consumers. This Kafka service is supported by a Zookeeper instance.
I have chosen to use Spark’s Structured Streaming API for my pipeline for real-time data processing, as it allows for flexibility to deliver real-time streaming, as well as in micro-batches. Spark reads data from a Kafka topic for incoming raw data, and once processed, the data is simultaneously written back into a separate outgoing Kafka topic for real-time analytics, as well as a PostgreSQL database for batch analytics.My real-time views layer is implemented using the ELK stack, which consists of Logstash, Elasticsearch, and Kibana. My batch views layer is implemented using the Python web framework Django, and the JavaScript visualization library, Flexmonster.
-
A sorting visualizer using the R Shiny framework as an introduction to sorting algorithms for students learning computer science. Includes step-by-step visualizations for Selection Sort, Insertion Sort, Shell Sort, and Merge Sort.