My most recent ongoing project involves quantum computing. My goal is to create a 2-qubit simulator akin to IBM's Quantum Composer and Hello Quantum App. Although I am coding in Python, it is important to note that I am programming the needed logic gates from first principles (not using IBM's quantum Python package Qiskit). Thus far I have implemented sixteen 1-qubit gates, five 2-qubit gates, and the ability to measure the 2-qubit in various bases. The below images show an example of the output of a simple quantum program. To clarify: (1) black means unlikely and white means likely, (2) blue boarders mean non-entangled and red mean entangled, (3) from top to bottom, the three dots on the far left represent the likelihood of the first associated 1-qubit being measured as a 1 in the x, y and z-bases respectively (when the 2-qubit is not entangled), and (4) from left to right, the three dots on the top represent the likelihood of the second associated 1-qubit being measured as a 1 in the x, y and z-bases respectively (when the 2-qubit is not entangled). The notes I took in the course of working on this project can be found here.
Step 1: Randomize the initial state
Step 2: Apply the H⊗I gate
Step 3: Apply the RX(𝜋/3)⊗RZ(𝜋/5) gate
Step 4: Entangle by applying the CNOT gate
Step 5: Apply the Swap gate
Step 6: Measure in the xz-basis
I've long had an interest in the theory of computation, especially during my time as an undergrad at the California Institute of Technology. The video game Minecraft has the interesting system of "redstone circuits" that allows for construction of logic gates. The below video represents my most ambitious undertaking for this project: a 16-bit CPU with attached memory tape that allows for programs of up to 32 lines to be executed. The Minecraft save files for this and other builds can be found here.
It's no secret that neural networks are a popular topic of study today. My interest in the subject began in early 2016 when I watched MarI/O - Machine Learning for Video Games. The idea here is that Mario is controlled by a neural network that learns using the NeuroEvolution of Augmenting Topologies (i.e. NEAT) algorithm. The child networks are created using several different operations: randomly adjusting the weights of connecting edges, splitting edges by adding a node, adding edges between unconnected nodes, and combining two different networks by finding the smallest graph having both as subgraphs. This is a probabilistic algorithm that tends to raise the maximum fitness of the population over time. The primary advantage of this method is that it tends to find simple solutions because the initial networks make no assumptions about the structure of the hidden layers. The networks shown below come from my own version and implementation of the NEAT algorithm. These images demonstrate how the algorithm adds complexity over time when the networks must solve the Double Pole Balancing With Velocities problem.
For a period of time I was interested in the material point method and its ability to simulate a wide variety of materials. I endeavored to implement and visualize simplified versions of the algorithms presented in A Material Point Method for Snow Simulation and The Affine Particle-In-Cell Method. The video "Example video 4 - Draft20k" demonstrates how material point methods transfer information back-and-forth between particles and grids. The video "APIC Implementation of MPM" demonstrates how parameters like Young's Modulus and Poisson's Ratio affect material properties.