I had the opportunity to work on several research projects in various fields from both in academia and industry. In this section I have listed some of my projects and categorized them based on the most appropriate area that it falls under. Although some of these projects cannot be claimed as "Research", they still present a good example of effective system design and implementation. You may also find some very interesting code snippets under the Code Pool section.
During my undergraduate years I had a keen interest in computer systems and micro-controllers. One of my projects involved efficient task scheduling on a single processor to obtain a desirable throughput. I noticed that several of these tasks were independent and can be executed in parallel. This is when I developed a taste for parallel computing. In the first year of my graduate studies, I worked on the problem of parallelizing a Linux kernel module using the IBM cell based processor (present in Sony PS3). Later I was involved in finding the limits of control flow on parallelism, detecting deadlocks using static analysis and efficient testing of multi-threaded programs. This motivated me to learn more about making software reliable, especially concurrent programs. Being a hard core programmer, there was one question that always remained unanswered. No matter how good a programmer is, why can't we ever guarantee a bug-free software? I took up a graduate class on software testing to learn the foundations in this area. More than learning about the science of software testing, it in fact exposed me to some of the caveats of testing in general.
Later when I interned at HP Labs, my research focused on analysis of complex networks with problems pertaining to information dissemination, influential detection, predictive modeling, incentive mechanisms for online labor markets. I believe the study of complex networks is of significant interest in the present scenario primarily due to the proliferation of smart phones. During the course of my work, I observed that our interactions with smart phones, over time form large-scale complex networks. The analysis of such networks has varied applications in launching ad campaigns, preventing the spread of diseases, harnessing the computational power of smart phones and social mobilization. This has helped me understand the interdisciplinary nature of modern day research where concepts from various fields are applied to solve problems in computer science, biology, economics, sociology, etc.
One of the biggest challenges in concurrency testing is the large number of interleaving that is possible among processes or threads and even a single execution schedule (or thread interleaving) can cause a deadlock. To validate a code to be deadlock proof requires testing all possible execution schedules which is clearly not feasible. For example, a program with 2 threads and 100 lines has 2100 interleaving, which is practically infinite. Hence several heuristics have been designed to intelligently prune these execution schedules to a manageable size. One such attempt is the Microsoft Chess (Chess stands for concurrency stress) tool, which intelligently selects a small subset of interleaving to test. We will present a framework that allows testers to either manually create an interleaving to test or to auto generate test cases. This forms the dynamic approach where the deadlocks are detected at runtime. In the static approach, the application is never executed but rather the source code forms as an input to another program. One of the drawbacks of this this approach is that several false positives are reported. We will present an implementation of a static deadlock detection algorithm and show its performance on Java and C# libraries. More >>
The goal here is to optimize software programs for parallel execution. One of the projects explores several ways to parallelize a linux kernel module on a multi-core processor. Another project shows how the control flow in a piece of code can limit the level of parallelism that can be achieved. More >>
Complex problems in nature are solved by organizing independent life units (agents) into societies, where each agent is capable of autonomous decision making. The problems that multi-agent systems can solve are most likely impossible for a monolithic system or a single agent. For example, the white blood cells coordinate to fight pathogens, ants cooperate to find food, the competition between predators and prey maintains a delicate ecological balance. We first look at agent based modeling and simulation to solve problems like finding shortest path, lattice formation. We then discuss a fail stop distributed auction design and finally, present a mechanism design for auctions when items themselves are autonomous agents. More >>
My interest in social network analysis started with an internship at HP labs, where we were working on the problem of incentivizing users for optimal query routing. Routing in social networks is different because a social influence (or a sense of trust) is associated with the receipt of a message. However to make the incentive mechanism budget feasible, requires finding a finite set of nodes which when incentivized can achieve the desired routing to a target subset of nodes. Our work on an incentive based multi-target routing system aims to address this problem, by finding the subset specific top-k influential and implementing on a real world network. In the recent times, social gaming has gained significant popularity; we present one such app using Facebook where users can predict the score of a live cricket match. Nowadays, almost all access to user's data is handled using the OAuth protocol, which we elicit in a sample Twitter application using Google app engine and Java programming language. More >>
During my undergraduate years I had a keen interest in embedded systems, especially in micro controllers and real time systems. I started with writing simple programs using 8086 assembly language and learnt the concepts behind interfacing ICs with microprocessors. This helped me to postulate the design of a microprocessor based incandescent lamp brightness control system. Later, in one of my most interesting projects, I used the parallel port of a computer to interface a circuit containing 7-segment LEDs, where the goal was to display rolling text on a set of seven segment LEDs. Control systems formed the foundation for most of my classes during undergraduate. A mathematical model of a gravity flow tank using Matlab Simulink is proposed and its behavior is analyzed in the presence of a flow controller. Virtual instrumentation is an emerging field where an instrument can be fully constructed and tested using a software tool. Labview is one such tool and we use it to build a virtual Linear Variable Differential Transformer (LVDT) which allows us to study its behavior under different configurations. More >>
Writing software code is always fun and enjoyable. But as software programs become complex, there is a greater emphasis on the need for a robust design and architecture. A complex software like a spread sheet can be developed bottom up, by first building the basic components and then wiring them up, as we show in our java script based spread sheet application. An object oriented design can be used to develop a software application right from the requirements stage, like we show in our Library management system. When object oriented programming is not supported, for example, an application written in C, the modularity in the code becomes important in preventing defects. More >>
Like every programming enthusiast I wanted to try my hand at developing some games on my own. I found that the best way to learn a programming language or a software tool or even a set of APIs is to build something fun out of it like a computer game or an animation. I started out by creating simple animations using Visual Basic in my high school. Later during my sophomore year, I started learning action script for Macromedia(now Adobe) Flash and in the process developed a 2D arcade game called ‘Sky Surf’. Thanks to my friend Nikhil Karnad for helping me out with the sketches. I soon started exploring gaming libraries like Allegro. But since I wanted to develop something from scratch, I took up a class in computer graphics and learnt about implementing raster graphics primitives, which helped me develop a card game called ‘Twenty eight’, using C and MS Windows APIs. Later when I wanted to learn Java, I decided to write a Tetris style game called ‘Puyo Puyo’. With considerable experience in game development, my instant choice for the Yahoo hack-u contest was to write a game using the tools of Web 2.0. It was a memory game using photos from Flickr, which won the runner-up at the contest. The Flickr API has changed since then and hence the game now loads random images of cricket matches. Recently, social gaming has gained significant popularity especially with games on Facebook. This motivated me to develop something interesting and since Cricket has a huge fan following in India, I came up with a live score prediction app called Predicket. Work on some of its features is still in progress. More >>