Pet Projects

1. User location based screen shifting : A common issue faced by students is trying to watch movies on their computer screens from the weirdest angles to ensure physical comfort. However, the visual on the screen is still meant for a user sitting upright on his chair with immaculate posture. This leads to the tedious task of adjusting the screen to make it face you, in the process, disturbing the intricate balance the entire room is in. Why not have something that does it as a software? Locates user, and tilts the projection onto the screen in such a way that no information is lost. Moving the screen seems to be the much easier option, but why not take up the challenge :). Any ideas??

2. Making an evolution scheme : Have a minimalistic model of nature, with a small set of rules, and probability values, and then see how the human would have evolved considering our current understanding of biological evolution. For example : would a human, through "experience", have learnt to first recon a lake for predators before jumping in to take a bath? (Already designed and working on it. Our idea uses energy contours to represent geographical diversity and each organism is  a class that inherits, has basic functions, learns new ones, reproduces, and hence evolves. It saps its energy from its environment and returns it back to it when, well, dead.)

3. Vedic Maths based ALU : An ALU (on-board design) that makes use of the concepts involved in Vedic Mathematics, or any of the other speedy forms of calculations, to perform basic operation such as add, divide etc. and more complex derived ones such as roots, exponents etc. If each such operation were to be made atomic as such due to the architectural changes, life would be much faster for computer scientists.

4. Cache oblivious BST search : Whenever a binary tree is traversed, if a particular node is accessed, then it is likely that its children will also be accessed and hence caching it beforehand would reduce time taken. The entire tree is viewed as a sequence of triangles (node with its children) and lines (non-branching series of nodes) and is stored in memory as such, hence optimizing their caching. (Under guidance of CRL experts). Another idea I had that would significantly reduce cache misses, try to pull as many nodes as you can along with the root node. Probably choose the longest path in the tree or more complicatedly, the most frequented path of the tree -> make that one big node and maintain locations of branches. The only problem i see is the limitation of cache line length(which can be taken care of) and the double comparisions to be made at each smaller node to check the direction of branch(not figured fix).

5. Transactional memory in distributed systems : While reading up about the concept behind transactional memory, it occured to me, is this possible in distributed systems?  The biggest challenge in doing so, is trying to avoid explicit memory references, like for instance, in higher languages like Java. But an inherent issue over here would also be sending of contiguous memory as one block (so as to maintain it as a single transaction), because that would require us manipulating storage of the data in memory "explicitly". There have been attempts like MPIJava at achieving the basic goal, but making that transaction based would be a different ball game entirely. Then again, if it is a grid with a set of heterogeneous computers, the inconvenience would only be multiplied.

6. Parallelised data structures : Problem statement goes something like this : Can we come up with a data structure that given a set of keys, finds a particular key from amongst it, in the most optimised manner..Preferably parallel operations, reason why they are better than sequential ones, preferably no simple data partitioning, if not data partitioning->then is your solution better than the dp one, ordinary operations on the structure like insertion, deletion etc. should still work as efficiently. Try to be novel. (Have come up with something...still brainstorming it out)

7. Data operations on continuously changing values : Usually when we consider data structures and operations on it, we assume static data structures, that is, the values remain the same throughout the time-period of my operating on it. What if this assumption were to be flipped? Say, I have a dictionary and words are getting filled in, in no sorted order. At the same time, you want to search for a word in it. Ex: You store in a compressed trie....initially you have the words : character, charisma, boolean, decimal, code, google. You want to search for book in this structure. You have made a decision at the node "oo" and have proceeded to compare against "lean". While you are at this, a branch at "oo" to "k" has been added. So you return - "not found", but it was there in the trie. Another ex : You have to find the maximum valued stock amongst a set of stock values. These are continuously getting updated, and you dont know at what rate. So, you compare to find max, but by the time you come to a decision, its correctness would have changed. This is usually sorted out by locking the data structure, that is the trie or the database of stock values and then committing operations. Can we prevent that unnecessary overhead? Will we definitely have to allow for some in-correctness in our algo? Will the overhead incurred in doing the same operations for such a situation be less than that of locking the data structure and then operating on it?