Ideas, systems
& meaningful impact.
I'm Mihnea. I move between computer science, education, markets, and public life, guided by curiosity and the belief that difficult systems can be understood and improved.
I'm Mihnea. I move between computer science, education, markets, and public life, guided by curiosity and the belief that difficult systems can be understood and improved.
I am a Computer Science student at ETH Zürich, but the questions that interest me rarely stay within one discipline. I am drawn to the rigor of mathematics, the mysteries of physics, the power of computation, and the ways education and public institutions shape people's lives.
Since childhood, I have been fascinated by the elegance of mathematics and the explanatory power of physics. Computer science became the place where that fascination could turn into something constructive: a way to move between theory and implementation, abstract ideas and real systems.
At ETH Zürich, I have explored this spectrum through theoretical computer science, algorithms, numerical methods, systems, formal methods, machine learning, and research in differential privacy. Alongside my studies, I have worked as a Teaching Assistant for Algorithms and Data Structures, Algorithms and Probability, and Numerical Methods for Computer Science. I have also supported students as a Coding Assistant and served as an Academic Facilitator for ETH's intensive PVK exam-preparation program. My exchange at the University of Pennsylvania immersed me in a different academic culture and brought new perspectives to my work.
My commitment to education extends beyond the classroom. I care deeply about educational sciences, political science, civic participation, and the institutions through which communities make decisions. From national student representation to organizing programming contests, conferences, and academic initiatives, I have learned that meaningful change requires both ideas and the patience to bring people together.
I thrive where innovation meets impact. Whether I am investigating a theoretical guarantee, debugging a program, designing a learning experience, or coordinating a public initiative, I am motivated by the same instinct: understand the system carefully, then make it better.
I am also deeply interested in economics and financial markets, especially market making. I find the field compelling because it brings together probability, algorithms, strategic decision-making, and the behavior of complex systems in real time. My next chapter at IMC in Amsterdam will let me explore that intersection from within.
Theory, algorithms, systems and responsible AI.
Teaching, learning design and access to high-quality education.
Political science, institutions and meaningful civic participation.
Economics, market making and decision-making under uncertainty.
Turning shared ambitions into programs, events and communities.
Mathematics, physics and the curiosity to understand how the world works.
Romania · Mathematics, physics, olympiads, robotics and student representation.
Switzerland · Computer science, research, teaching and intellectual independence at ETH.
United States · New academic culture and perspectives at the University of Pennsylvania.
Netherlands · My next chapter at IMC, at the intersection of technology and financial markets.
The best part of a journey is not knowing exactly where curiosity will lead next.
My interests span theoretical computer science and computing education. I am drawn to simple questions whose answers expose deeper tensions between information, efficiency, human reasoning and rigorous guarantees.
I am currently exploring connections between the convergence of Markov chains and differential privacy. The guiding question is whether a chain's mixing behaviour, usually controlled in total variation distance, can yield meaningful privacy guarantees expressed through stronger notions such as Rényi divergence.
Understanding the sample complexity of private learners across realizable and agnostic settings, and how it is governed by combinatorial dimensions.
Investigating why information-theoretically elegant private learners can be computationally expensive, particularly for thresholds and halfspaces.
Learning from the roles of center points, convex geometry, quasi-concave optimization and private linear algebra in constructing private algorithms.
Building on UPenn's open-ended Programming and Problem Solving course, I will investigate how generative AI changes the balance between algorithmic thinking, implementation, analysis and communication.
The goal is not simply to ask whether an AI system can outperform students. It is to understand where it contributes: generating strategies, translating ideas into code, debugging, evaluating experiments, reproducing an approach from a written report, and explaining why a solution works.
Current students and historical student solutions as a human baseline
Claude Code working from only the problem statement and simulator
Claude Code receiving a small set of high-level strategic hints
Students using AI while documenting their prompts and independent reasoning
Claude Code reproducing a previous team's strategy from its detailed report
My bachelor thesis will be supervised by Prof. Dr. Johannes Lengler. The precise topic is still open, but it will live in theoretical computer science, with a likely focus on randomized algorithms and the mathematical ideas behind them.
Topic to be announcedA collection of algorithmic experiments, interactive tools and software projects. Each began with a different question: how should a system communicate, compete, visualize or make a difficult idea easier to understand?
A privacy-first messenger where every connection begins face to face. No global search, no suggested contacts: two people become friends through an in-person cryptographic QR handshake.
A native Android messenger built around a simple boundary: you can only connect with someone you have physically met. Local combines product design, mobile engineering and a custom end-to-end encrypted messaging system in one complete application. I designed it to feel familiar enough for everyday conversation while making its privacy model visible, understandable and difficult to bypass accidentally.
Most messengers begin with discovery: search a username, import an address book or accept a suggestion. Local deliberately removes that layer. There is no public directory, no friend recommendation system and no way to contact a stranger from across the internet. Names are assigned locally, so the label you use for a person remains part of your own address book rather than becoming a global profile field.
Meeting is the permission.
The QR code makes it cryptographic.
Text, cropped or rotated photos, files up to 10 MB and recorded voice messages. Replies carry an encrypted copy of the quoted context, while six reactions, editing and deletion are synchronized as encrypted control events.
Conversation timers range from one minute to one week or can remain disabled. Expiry is represented in the data model rather than merely hiding a bubble, and deletion-for-everyone propagates through encrypted tombstones.
Search inside a conversation, swipe to reply, double-tap for a quick reaction, inspect three delivery states and open images in a full-screen viewer with pinch and pan. Privacy does not need to mean an unfinished interface.
Media uploads continue outside the chat screen through an application-owned coroutine scope. The interface shows optimistic progress, applies a 20-second timeout and keeps enough state to offer a meaningful retry rather than silently losing work.
The strongest privacy mechanism is not useful if normal people cannot understand when it applies. Local therefore treats trust, expiry and device protection as visible parts of the experience rather than settings hidden behind technical language.
The application never uploads an address book to construct a graph of possible contacts. A friendship exists only after the two-device ceremony completes.
Contact names, resolved notification names and cached conversation context are owned by the device. The backend routes encrypted objects; it does not become the canonical social profile.
Pending invitations expire after one hour, delivery has explicit stages, maintenance is communicated directly and destructive actions propagate rather than pretending to be complete locally.
Adding a friend is a short in-person protocol rather than a lookup. A fresh identity matrix and ephemeral X25519 key material bind the two devices to the same physical encounter. The invitation can only be confirmed by the intended inviter, must match the server-held matrix hash and expires after one hour. Scanning your own code or presenting an invalid confirmation is rejected.
56 random characters regenerate with every invite.
Device A generates a fresh 8 × 8 matrix, public ID and ephemeral X25519 public key.
Device B scans locally, chooses a private contact name and joins the one-hour session.
Device B displays the matching session and its own ephemeral public key for the return scan.
Both devices validate the matrix hash and independently derive the same initial root key.
DH = X25519(ephemeralPrivate, peerPublic)rootKey = HKDF-SHA256(matrix, DH, "Local-Init-RK")The server stores the matrix hash for validation, never the matrix itself.Local implements a custom Double Ratchet design in the Signal protocol family. Each message advances a symmetric chain; a change in speaking direction triggers a new X25519 Diffie-Hellman ratchet. AES-256-GCM supplies authenticated encryption and every nonce is generated independently.
The encrypted wire object carries ciphertext, nonce, authentication tag, current public ratchet key, message number and previous chain length. Skipped keys support up to 1,000 out-of-order messages. Ratchet transitions are protected by a per-friendship mutex so decryption and persistence remain atomic even when network events arrive close together.
Photos, documents and voice recordings receive a random 32-byte data-encryption key. The encrypted blob goes to cloud storage; only a compact envelope containing the key, nonce and authentication tag travels inside the ratcheted message.
A single-activity Compose interface sits above screen-specific ViewModels and long-lived repositories created by the application container. Room is the source of local continuity; Firebase provides passwordless email-link authentication, encrypted transport, blob storage and content-free push signals. The result is a client that remains coherent across navigation, background transitions and process-level lifecycle events.
Material 3 · Navigation · CameraX · ML Kit · Coil
Auth · friends · chat · media · ratchet · lock · session
Messages, friendships, cached plaintext and wrapped ratchet state
Auth, Firestore ciphertext, Storage blobs, FCM and one Cloud Function
A mutex serializes cryptographic work per friendship. A received message is decrypted and its advanced ratchet state is persisted as one logical operation.
Per-message plaintext, quote and reaction state lives in Compose snapshot maps, allowing one changed bubble to update without rebuilding the conversation.
Cached plaintext is batch-loaded from Room when a conversation opens, then synchronized with incoming encrypted events from Firestore.
An application-level coroutine scope owns important sends and uploads, so leaving a screen does not silently cancel user work.
The Room schema is versioned explicitly and destructive fallback is disabled. Database changes must be represented as deliberate migrations.
The Android release enables R8 minification and resource shrinking; a signed release APK is already produced from the current codebase targeting Android 14 while supporting Android 7.0 and newer.
A session repository coordinates passwordless authentication and a single-device policy. Logging in elsewhere invalidates the previous device and removes the local state it should no longer retain.
Reactions, timer changes, edits and deletions reuse the encrypted message channel as explicit event types, keeping conversation state synchronized without introducing a plaintext side channel.
A live remote configuration supports normal, maintenance and mandatory-update states, with a cached last-known value so critical release decisions do not depend on one screen load.
End-to-end encryption protects data in transit. Local also adds controls for the moment when decrypted information is present on the phone.
FLAG_SECURE blocks screenshots, screen recording and sensitive previews in recent apps.
An optional six-digit PIN, biometric unlock and automatic lock after 30 seconds in the background.
A separate panic code can silently erase conversations before opening the application.
A login on a new device invalidates the previous session and clears its locally held application state.
Ratchet roots, chain keys, private DH material, matrices and skipped keys are wrapped with Android Keystore AES-256-GCM.
PBKDF2-HMAC-SHA256 with 120,000 iterations, a random salt and encrypted preferences protects local PIN verification.
Account removal, friendship deletion, expiry and maintenance states are modeled as system behavior rather than interface-only actions.
Undelivered text expires after 30 days and media after five; a successfully decrypted Firestore copy is removed immediately.
Friendship and account deletion propagate to other devices, triggering local removal of messages, media and key material.
A live remote configuration can place the application in normal, maintenance or mandatory-update mode.
Push payloads contain no message text. Sender identity is resolved from the local database and notifications are coalesced.
Message plaintext, media plaintext, contact names, the QR identity matrix or unwrapped cryptographic keys.
Participants, sender identifiers, timestamps, message type, ciphertext size, ratchet headers and storage paths needed to deliver data.
Local is a substantial working prototype, not yet a security-audited product. Its custom cryptographic protocol must receive independent review, automated tests and wider real-device validation before it should be trusted in high-risk environments.
Four open-ended challenges combining strategy, implementation, experimentation and clear communication.
University of PennsylvaniaSearching for coordinated light layouts inside a stochastic physical simulation.
Reasoning with partial information and adapting a strategy as evidence changes.
Turning a competitive setting into algorithms, experiments and measurable decisions.
Exploring emergent behavior through simulation, strategic design and iteration.
A stochastic optimization challenge about placing timed lights and a collector, explored through structured search, simulation and eight generations of a Java player.
Mosquitoes move independently through a 100×100 continuous world containing walls. Without a visible light they perform a random walk; when an active light is within 20 metres and unobstructed, their next one-metre step is biased toward the nearest such light by a random angle of up to 30 degrees.
The player chooses one collector and up to L point lights. Every light has a position and a periodic schedule described by its cycle length, on-time and start phase. The simulation ends when at least half of the mosquitoes enter the collector's tiny radius-0.5 capture disk.
The objective is to minimize expected rounds-to-half across random spawn positions and movement noise, while returning a legal configuration within a strict single-CPU time budget.
Read the original specification for motion, visibility, obstacles, light scheduling, collector placement and scoring.
Eight directional links form the common vocabulary behind every formation. Selecting different subsets of the same local neighbourhood lets the swarm assemble lines, corners, clusters and branching structures without a central controller.
A light's value depends on every other light, wall occlusion and the collector. Useful relay chains may contain components that perform poorly alone.
Identical layouts vary across seeds because both spawning and every movement step are random. One lucky simulation can rank a worse candidate first.
Every additional trial consumes the same wall-clock budget needed to generate, refine and validate alternative configurations.
Lights are not isolated attractors. They are a relay system rooted at the collector.
An always-on terminal light secures the capture region. Helper lights extend its basin outward and alternate in time, handing mosquitoes inward along branches.
The final system emerged by measuring failures and simplifying the representation, timing model and budget policy rather than by adding layers indiscriminately.
Enumerated lines, clusters, rings, arcs and funnels on a coarse anchor grid.
Replaced biased nested-loop enumeration with broader deduplicated sampling.
Stopped searching timing and committed to a terminal light plus inward waves.
Unified lines, clusters, bends and branches as trees on one 8-direction graph.
Removed backtracking and zigzags with a forward-half-plane constraint.
Let short and long branches pump independently at their natural cadence.
Reduced timing to two phases based on branch-depth parity.
Measured evaluation cost and sized the search to each map at runtime.
Instead of optimizing real-valued coordinates and independent schedules directly, MD8 samples rooted trees on a reusable lattice graph. The collector is the root, each node is a light, and parent pointers encode the relay topology.
After the discrete sweep identifies promising regions and shapes, helper coordinates are perturbed locally in continuous space and re-evaluated.
A multi-stage evaluator keeps broad exploration affordable and reserves expensive multi-seed evidence for the strongest candidates.
With 20-metre edges, lights at equal branch-depth parity are at least 40 metres apart along a chain. They can therefore share a phase without locally competing for the same mosquito.
The root light beside the collector remains permanently on, while helper levels alternate on a fixed 78-round cycle.
After MD8 stabilized, the remaining lever was the cost of each simulation. I ported the simulator core to C++ and connected it to the Java player through a persistent synchronous subprocess.
The port mirrors important Java semantics, including the 48-bit java.util.Random generator, movement conventions, strict collector containment and collision checks. A text protocol keeps the bridge inspectable, and every failed C++ request falls back safely to Java.
I designed and implemented the core approach, including all eight player generations from MD1 through MD8, the lattice-tree representation, relay policies, search and refinement pipeline, adaptive budget and C++ simulator.
I led the integration of the components and coordinated and structured most of the final report. The project combined algorithm design with substantial software engineering: modelling, iterative experimentation, Java implementation, cross-language IPC, behavioural validation and graceful fallback.
The final tournament exposed both the value and the limits of the approach. Relay trees were excellent on open or familiar maps with small-to-moderate light budgets, but the search became fragile on wall-heavy worlds, especially when many branches could be occluded.
We finished 8th of 9 overall. Rather than hiding that result, it provided the clearest diagnosis: complex maps made each evaluation slower exactly when the search needed a larger, not smaller, candidate pool.
A carefully constructed discrete space can make an apparently intractable continuous search practical.
Optimization quality depends on systems performance. The cost model and fallback behavior are part of the algorithm.
A strategy that dominates clean boards may fail structurally when obstacles, occlusion and larger light counts interact.
A competitive multi-agent programming challenge about coordinating a team of autonomous players on a shared board, implemented and evaluated in Java.
Parallel Football is played by four teams on a common 32×32 grid. Each team owns one corner, called its home cell, and controls P players. Every non-home cell initially contains one football, creating 1,020 shared footballs that all four teams are trying to score.
At each turn, every player chooses exactly one action: move by one cell in any of the eight directions, remain still, or kick one football from its current cell to any target within Euclidean distance K. A ball reaching the team's home cell scores immediately and is removed from the game.
The important detail is that all teams submit their orders using the same observed board state, and the simulator processes those orders simultaneously. A target that looked available may therefore be moved by an opponent before our player arrives.
The full specification contains the exact movement and kicking rules, simultaneous-action semantics, tournament setup and the questions that guided the project.
Players continuously collect, relay and redirect contested footballs toward their home corner. The animation captures the core challenge: many simultaneous local actions must combine into useful global flow while three opponents interfere with the same resources.
A good controller must clear nearby balls efficiently while maintaining coverage of distant regions. It must decide whether a dense stack is worth pursuing, whether an opponent will arrive first, and whether moving a ball closer to home actually leaves a teammate available to finish the job.
Four teams compete for exactly the same balls, so stale targets waste turns.
Sending teammates to the same cell can duplicate work and create congestion.
Small P or K rewards local racing; large P and K make assignment and relay behavior more important.
We implemented several Java controllers, watched them play repeated tournaments and refined the decision rules based on concrete failure modes. The final submission, HybridPlayer3, switches between two complementary strategies instead of forcing one policy to handle every configuration.
Our first complete baseline distributed players across quadrants, assigned distinct nearby balls and kicked directly toward home.
A richer local score incorporated ball density, distance to home, incoming teammate kicks and opponent congestion.
A global value-based strategy scored every player–ball pair and greedily selected distinct high-value assignments.
Use GreedyPlayer3 when P≤10 or K≤2; otherwise use TwiceImprovedPlayer for crowded, longer-range games.
“If the board is sparse or movement is restricted, just race. If the board is crowded and kicks matter, think strategically.”
No single policy dominated every configuration. Robust performance came from recognizing which version of the game was currently being played.
Each strategy is implemented as a Java player controller on top of the course simulator. On every turn it reads the board, computes one instruction for each teammate and returns the complete set of actions before any team sees the others' choices.
For global assignment, we estimated the effort needed to reach and score a ball cell. Player movement uses Chebyshev distance because diagonal movement costs one turn, while kick feasibility remains Euclidean because the simulator defines a circular kick radius.
Ball stacks and cells in our quadrant increase value. Long kick chains become more expensive as P grows, and targets already favored by a closer opponent receive a competition penalty.
TwiceImprovedPlayer first scans the board and builds a feature record for every cell containing footballs. It estimates travel time, kicks-to-score, stack size, territorial advantage and the closest opposing player.
It then scores every feasible player–ball pair, sorts the pairs globally and greedily selects assignments while enforcing one target per player and one player per target. This avoids the duplication produced by independent local decisions without paying for an exact matching algorithm on every turn.
Stacks are worth more, with a mild bonus for balls in our quadrant.
Chebyshev distance matches one-step diagonal player movement.
Long kick chains become increasingly expensive in crowded regimes.
Contested low-value targets are discarded before they waste movement.
If home is inside the Euclidean kick radius, the action is immediate. Otherwise, the controller evaluates every legal landing cell and balances progress toward home, proximity to teammates, distance from opponents and use of the available range.
This creates implicit relays without reserving rigid bucket-brigade roles. A teammate may continue a promising ball naturally, while the strategy remains robust when simultaneous opponent actions invalidate a planned hand-off.
We repeatedly ran local and head-to-head tournaments, watched complete games and changed one heuristic at a time. This process revealed failures that were difficult to anticipate from the rules alone.
Players moved outward after kicking balls near home, leaving a ring of almost-scored balls unattended. Explicit home proximity and scoreability bonuses fixed it.
Targets occupied by opponents often disappeared before our player arrived. Congestion and competition penalties reduced these wasted trips.
Binary “ball or no ball” logic ignored valuable stacks. Using diminishing returns on ball count captured density without overwhelming distance.
I designed and implemented BasicPlayerMD, the team's first complete controller. It introduced quadrant-based initial placement, greedy ball selection, distance-aware kicks and lightweight coordination constraints that prevented teammates from chasing the same ball or moving into the same destination.
I also implemented and explored RelayFirst, GreedyAssist and GreedyAssistLee, testing whether more explicit passing behavior could improve long-distance scoring. These experiments showed that plausible teamwork ideas can be fragile when every team moves simultaneously.
The baseline's strong and interpretable performance helped establish the direction of our later strategies. Other teams used related greedy ideas as benchmarks, subroutines or targets for empirical tuning.
The final hybrid was evaluated across ten combinations of player count P and kick radius K. It remained near the top across sparse races, crowded boards and long-range kicking regimes.
In adversarial simultaneous environments, a stable heuristic can outperform a sophisticated plan that depends on fragile assumptions.
Several of the most important improvements came from observing matches, including fixing the unattended “moat” of balls around home.
The extreme P=255, K=32 regime exposed the limits of greedy assignment and points toward explicit area control or learned policies.
A Java multi-agent system for exploration, trustworthy information sharing and consensus in a partially observable world containing an unknown adversary.
A commando team is dropped onto an unknown 100×100 grid. The soldiers must discover a hidden package and target, reconstruct the terrain and agree on a path that uses only good cells. Water is impassable and muddy ground may be crossed by soldiers, but never while carrying the package.
Each player sees only a radius-three neighborhood. Global knowledge exists only through encounters, where agents exchange records containing the cell, its reported state and the complete chain of players and timestamps through which that claim travelled.
One player is secretly a spy. It uses the same interfaces as everyone else, but may fabricate terrain, invent objectives and support dangerous paths. Three soldiers must still meet at the package and agree on exactly one valid route before the timeout.
The original statement defines movement costs, visibility, record provenance, communication, path voting, scoring, failure conditions and the spy's capabilities.
Each board coordinate stores more than a guessed value. The agent tracks provenance, confidence and contradictory reports, while separate indexed structures maintain player suspicion and mission-level state. That makes every move explainable and revisable.
terrainValueenumpointValueintconfidencedoubledirectSeenbooleanconflictsSet<Value>supportMap<Value, Set<Id>>suspicion[playerId]packagePositiontargetPositionvisitedCellsNo player sees the global state. Exploration must turn fragmented observations into a useful map before time runs out.
The attacker manipulates beliefs rather than the grid, so plausible misinformation can be more damaging than obvious lies.
Strict validation protects the team, but excessive caution can deadlock the vote and fail just as decisively.
The controller separates knowledge management from movement, planning, communication and voting. The same state is consumed by distinct soldier and spy policies, allowing each subsystem to be inspected and refined without rewriting the entire player.
Store terrain, point type, confidence, source sets, conflicts and direct observation.
Fuse incoming records and share only sufficiently reliable, conflict-free information.
Explore under uncertainty, then use cost-aware shortest paths to reach the package.
Validate proposals and adapt voting as the system approaches deadlock or timeout.
Each cell tracks terrain and point type independently. Direct observations become immutable local ground truth; indirect reports contribute only through their original source. Repeated copies of the same claim therefore cannot manufacture confidence.
Contradictions against a personally observed cell increase the originator's suspicion score. Sources crossing the threshold are ignored in future updates.
The player continuously switches between gathering missing knowledge and acting on a safe solution.
A single fixed voting rule was too brittle. We designed a phase-based strategy that starts conservatively, narrows competing proposals and eventually relaxes its requirements when waiting becomes the larger risk.
Support only fully validated paths, then progressively converge toward the best trusted leader.
Choose the most-supported path that passes relaxed endpoint, adjacency and direct-safety checks.
Always select a minimally valid candidate, preventing indefinite deadlock near the timeout.
The spy does not broadcast random noise. It estimates what each player already knows and constructs a separate fake package, fake target and plausible GOOD corridor for every recipient, avoiding cells likely to contradict direct observations.
Per-recipient campaign state makes each fabricated scenario internally consistent.
Fake originators make misinformation appear independently corroborated across meetings.
A small set of honest local records makes the overall message look less anomalous.
If a fake path loses support, the spy inflates a real valid path with loops, worsening the score without obvious invalidity.
Traditional unit tests were useful for pathfinding, conflict resolution and suspicion updates, but system behavior depended on team composition, information propagation and an adaptive attacker. We therefore complemented component tests with repeated simulations and tools that exposed the internal state.
A browser-based 100×100 map showed confidence, conflicts, exploration frontiers and the full provenance chain for a selected cell. It revealed subtle source-tracking bugs hidden by aggregate scores.
Three custom environments created divergent exploration paths, isolated corridors and bottlenecks to stress-test trust and consensus under genuine information asymmetry.
Clone tests, soldier-with-spy tests and mixed-cohort round robins separated cooperative quality from adversarial disruption across seven maps.
I designed and developed G7_MD, the initial player that became the foundation of the final system and established its overall architecture.
I implemented the cell-level knowledge model, independent-source tracking, conflict-aware updates, communication protocol and the exploration strategy retained by the final player.
For the spy, I helped move fake objectives from one global story to personalized per-recipient deception, implemented loop-based path inflation and designed the fake-originator protocol. I also created the three custom evaluation maps and wrote substantial parts of the problem formulation, design and implementation sections of the report.
The honest player performed best on structured maps where reliable knowledge accumulated quickly. The spy was strongest when uncertainty remained high enough for personalized false worlds to survive scrutiny.
Message count is not evidence count. Tracking original sources prevents repeated propagation from creating false certainty.
A perfectly cautious agent can still lose. Robust systems need an explicit policy for trading certainty against remaining time.
In distributed software, inspecting internal beliefs and communication histories can be more informative than checking final outputs alone.
A Java multi-agent simulation about survival, learning and population control in an unknown, changing world.
Each organism lives on an unknown m×n toroidal grid and runs its own instance of a Java “brain.” It gains energy by eating food and spends energy by waiting, moving or reproducing. When its energy reaches zero, it dies.
An organism sees only the four adjacent cells, the food beneath it, its current energy and a subset of simulator parameters. It does not know the grid dimensions or the probabilities p and q governing food appearance and growth.
The goal is not merely rapid reproduction. A population that expands too aggressively may consume its resources and collapse; one that behaves too cautiously may lose territory and food to competing species.
Read the original specification for food dynamics, energy costs, local sensing, sequential move semantics and the individual and competitive evaluation goals.
Every organism combines local perception with an inherited policy and a tiny shared signal. The controller adapts its priorities to food density, energy and life stage, producing coordinated population behaviour from strictly local decisions.
Every brain sees only its immediate neighborhood, while the parameters that define food availability remain hidden.
Movement finds resources but costs energy; reproduction grows the population but can trigger starvation through overcrowding.
Other species consume food, block movement and distort the observations used to estimate the environment.
Our final Java controller, FinalBrain, uses one hierarchical decision framework whose thresholds change with estimated food availability, energy, age and competitive pressure.
Infer local food-spawn probability from repeated observations and classify it into robust probability buckets.
Encode species identity and environmental beliefs into external state, then aggregate trusted neighbors' estimates.
Adjust movement and reproduction thresholds across lifecycle phases, balancing early expansion with later conservation.
Pass accumulated trials, food hits and age to offspring through a compact 32-bit DNA representation.
Every organism independently executes the same modular controller on each simulation step.
The brain compares empty neighboring cells across consecutive turns. A valid empty-to-empty observation increments trials; if food appears, it also increments hits. The local estimate is therefore p̂ = hits / trials, discretized into behavioral buckets rather than trusted as a precise value.
Occupancy changes are excluded because another organism may have moved into the cell. This improves local validity, but competition introduces censoring bias: cells where food appears are also more likely to be consumed or occupied before they can become a positive observation, causing systematic underestimation.
The estimator is useful, but its assumptions change once competitors modify the environment being measured.
Neighboring organisms expose only one 8-bit external state. We divide it into a species tag, the estimated probability bucket and a confidence field. The tag filters unrelated species; trusted messages are accumulated into a weighted local consensus.
Each bucket receives support proportional to confidence, including the organism's own estimate. The best-supported bucket controls behavioral thresholds, allowing local observations to become a distributed approximation of the global environment.
[ TAG ][ BUCKET ][ CONFIDENCE ]
FinalBrain maps environment bucket and age to thresholds for waiting, reproduction and movement. Rich environments encourage early spreading and growth; sparse environments begin cautiously and become more exploratory as survival pressure increases.
Energy constraints can override the normal policy: food takes priority, reproduction requires a safe reserve, and critically low energy activates emergency search. Modesty rules also suppress reproduction in crowded neighborhoods to avoid local resource collapse.
Explore or farm food according to the inferred environment.
Reproduce only with sufficient energy and local capacity.
Reduce risky movement and preserve a stable population.
New organisms should not need to relearn an environment from zero. During reproduction, the parent packs its accumulated evidence into a 32-bit integer passed to the child.
(trials << 20) | (hits << 8) | age
I developed BasicPlayerMD1 and BasicPlayerMD2, introducing the hierarchical rule-based architecture that became the foundation of FinalBrain.
I proposed and implemented local estimation of the hidden food-spawn probability p, its discretization into probability buckets, and the idea of building a global approximation through distributed information sharing and consensus.
I also designed and implemented the DNA-based inheritance mechanism, led much of the core implementation and contributed substantially to the strategic direction, report and presentation.
FinalBrain validated the value of energy-aware exploration and controlled reproduction in individual trials. Competitive play exposed slower adaptation and recovery when opponents distorted observations or occupied territory aggressively.
Competitors consume food and alter the observations used to infer the natural environment.
Conservative reproduction avoids collapse but can make recovery and territorial expansion too slow.
Thousands of organisms magnify allocations and repeated computations, making caching and simpler hot paths essential.
A theoretical study of parameterization and approximation, paired with an interactive laboratory for TSP algorithms, empirical experiments and real road networks.
A study of algorithms, illusions and reality: two theoretical ways to make hard problems manageable, and a full interactive laboratory that tests where those ideas survive contact with practice.
Routing, scheduling and combinatorial optimization are formally NP-hard, yet useful solutions are produced every day. This project investigates that tension rather than treating NP-hardness as the end of the discussion.
The report develops two complementary mechanisms. A hard problem may become tractable when a parameter is small, or approximable when the input has additional structure. These mechanisms expose an important asymmetry: theory can be too optimistic about algorithms that are polynomial but impractical, and too pessimistic about approximation bounds that are rarely approached on real instances.
Randomly assign k colors to the graph, then search only for a path whose vertices have distinct colors. A subset dynamic programme replaces the global “all vertices must be distinct” condition with local color-set transitions.
General TSP resists constant-factor approximation, but metric structure makes shortcutting safe. MST doubling yields a 2-approximation; matching odd-degree vertices improves the guarantee to Christofides’ 3/2.
A fixed path becomes colorful with probability k!/kk ≥ e−k. Repeating the experiment λek times pushes failure below e−λ, without introducing false positives.
DP[v, {red, blue, gold, green, purple, coral}] = trueeach color appears exactly onceFor a complete metric graph, Christofides first computes a minimum spanning tree T. The vertices of odd degree in T are paired by a minimum-weight perfect matching M. Their union is connected and Eulerian; shortcutting its Eulerian circuit produces a Hamiltonian cycle without increasing cost.
I built a web laboratory where the same theory can be inspected as a single execution, measured statistically and challenged on real road data.
Generate 5–30 Euclidean checkpoints and play four algorithms frame by frame. Every MST edge, matching, Eulerian traversal and individual shortcut receives synchronized mathematical commentary.
Run up to 350 independent trials, compute OPT exactly for n ≤ 20 and watch running means for wall-clock runtime and approximation ratio converge live.
Place checkpoints on a real map, fetch directional OSRM distances and expose asymmetry, triangle violations and the “symmetrisation tax” between the model and the driven route.
The backend is the single source of truth: it computes complete step descriptors containing nodes, edges, commentary and statistics. The browser remains presentational and can render the same state onto either a Canvas or a geographic map.
/generate · /run · /sim_round · /map_solveFast greedy baseline with no constant guarantee, useful for exposing the gap between simple heuristics and theory.
Prim, edge doubling, Hierholzer and shortcutting, animated one construction at a time.
MST plus odd-vertex matching. The implementation uses an explicit, auditable greedy matching and documents the resulting loss of the strict 3/2 guarantee.
An O(n²) incremental tour builder that selects the closest outside vertex and cheapest insertion point.
Exact O(n²2ⁿ) dynamic programming used as the OPT reference for every ratio up to n = 20.
O(n³) triangle scans, asymmetric-pair detection, symmetrization and directional re-pricing.
On random Euclidean instances, the empirical simulator consistently places Christofides far below its worst-case bound. The important engineering choice was to compare every heuristic against an exact Held–Karp optimum rather than against another approximation.
One-way streets and constrained turns make driving distances asymmetric. Some triples even violate triangle inequality. The application detects both phenomena, symmetrizes the matrix to run Christofides, then re-prices the resulting ordering in the actual travel direction.
The laboratory is designed for understanding and experimentation, not disguised as a production route optimizer. Its boundaries are part of the result.
The implementation chooses an auditable greedy matching. It performs strongly empirically, but the strict Christofides 3/2 proof requires a true minimum-weight perfect matching.
FORMAL EFFECT · bound may rise to 2·OPTHeld–Karp gives an exact comparison point, but its O(n²2ⁿ) state space imposes a hard practical ceiling even after vectorization.
NEXT STEP · branch-and-bound or 1-tree relaxationChristofides optimizes a symmetric projection of the directional OSRM matrix. Re-pricing measures the tax, but does not turn the result into an ATSP guarantee.
HONEST OUTPUT · modelled cost vs driven costPublic OSRM reflects static OpenStreetMap attributes rather than live traffic, closures or time-dependent travel conditions.
PRODUCTION PATH · self-hosted or live routing serviceI developed the theoretical narrative and proofs, designed the visual language of the laboratory, implemented its algorithmic kernels and full-stack architecture, built the statistical and geographic modes, and documented both the mathematical ideas and the engineering trade-offs.
A portfolio designed as an explorable personal computer: folders, project windows, embedded documents and an AI guide turn a static profile into an interactive system.
Instead of arranging my work as a conventional sequence of pages, I built a small personal operating system: a place where visitors can browse ideas, open projects, read documents and ask for guidance.
Computer science, education, markets and public life.
Where should we begin?
research · projects · teachingA traditional portfolio tells visitors where to scroll. This one lets them choose a path. The desktop metaphor makes a large and varied body of work feel familiar, while the visual language connects computer science with a more personal, human presentation.
Not a résumé rendered online, but a small world with its own logic.
A calm desktop introduces the person before the credentials.
Folders divide the work by purpose rather than chronology.
Dedicated windows hold detailed case studies and PDFs.
Solvy offers a second, conversational path through the same information.
Case studies open like applications, preserving the desktop and making deep exploration feel lightweight.
Reports, statements and the CV use a reusable internal reader instead of repeatedly sending visitors elsewhere.
A file-explorer model supports nested folders and new public resources without redesigning the page.
Windows become full-screen workspaces, navigation simplifies and typography scales without losing the visual identity.
Solvy is designed as a guide rather than decoration. It maps natural questions to the relevant part of the portfolio, creating an alternative to menus and folders. The current deterministic version establishes the interaction model; a richer retrieval-based assistant can later answer from the site's complete content.
VISITORWhat kind of research does Mihnea do?
SOLVYLet me open the work on private learning and algorithms.
The desktop should make the portfolio easier to navigate, never turn it into a puzzle.
Short project summaries lead to detailed technical stories only when the visitor asks for them.
Ongoing research, future work and unfinished sections are labelled rather than overstated.
Course material, exercise notes and resources from my teaching at ETH Zürich.
Add documents or subfolders and update the library to display them here.
I believe understanding the world around us is part of our responsibility toward it. Staying informed, questioning easy answers and helping where we can are small but meaningful ways of contributing to a healthier society.
This is not about having an opinion on everything. It is about remaining curious, resisting indifference and trying to leave the systems and communities around us a little better than we found them.
High-quality education should not depend on where someone is born or the resources of their family.
Every child deserves safety, dignity, healthcare and the freedom to develop their potential.
Algorithms should serve people fairly, transparently and with attention to their social consequences.
Healthy institutions depend on informed people who participate constructively and hold power accountable.
Markets are powerful tools, but prosperity should create genuine opportunity and protect human dignity.
Our decisions should account for the people who will inherit their environmental and institutional effects.
Being informed is less about consuming more content and more about developing better habits of attention.
Read beyond headlines and look for the original evidence.
Compare serious sources with different perspectives.
Distinguish reporting, analysis and opinion.
Choose long-form work over a permanently reactive feed.
Remain willing to update a belief when the facts change.
Michael Kearns & Aaron Roth
Fairness, privacy and socially aware algorithm design.Safiya Umoja Noble
How search engines can reproduce and amplify social bias.Michael J. Sandel
Where markets belong, and where they may crowd out important values.Michael J. Sandel
An accessible journey through competing ideas of a just society.Daron Acemoglu & James A. Robinson
How political and economic institutions shape prosperity.Brian Christian
The human values hidden inside machine-learning systems.Amanda Ripley
What different education systems can teach us about learning.Hans Rosling
Better instincts for interpreting global trends and statistics.Organizations whose work I follow and encourage others to explore. Inclusion here is an invitation to learn more, not an affiliation or endorsement of every position.
Large international organizations working across borders.
Protecting children's rights, health, education and development worldwide.
Supporting children's education, protection and wellbeing around the world.
Making high-quality learning resources freely available to anyone.
Protecting life, dignity and access to humanitarian assistance worldwide.
Work supporting young people and responsible technology in the community where I live.
Civil-society initiatives addressing education, children and public infrastructure.
Organizations using education and technology to widen opportunity.
A quiet place for unfinished questions, lessons from practice and longer reflections across computer science, education, markets and public life.
Technical questions and concepts I want to understand more deeply.
Lessons gathered while researching, teaching and building things.
Longer thoughts on education, technology, markets and society.
The visualizer runs on Flask and NumPy, so it must be deployed as a small web service before it can live inside this window. Once deployed, this page will load the complete application here without sending visitors outside the portfolio.