# **Architecting Geospatial Propagation Simulations: From Radial Impact Calculations to Competitive Artificial Intelligence Spread**

## **The Evolution and Categorization of Geospatial Simulation Architectures**

The development of interactive geospatial simulations has undergone a profound transformation over the past decade. Driven by sweeping advancements in web technologies, high-performance asynchronous backend runtimes, and the widespread availability of granular spatial data, these applications have evolved from static calculators into dynamic, chronological engines. Early web-based simulators functioned primarily as simplistic visual layers tied to pre-rendered geographic information systems (GIS). Today, these platforms are highly complex systems capable of processing millions of interacting variables in real time, serving as critical infrastructure for counterfactual forecasting and epidemiological modeling. To construct an advanced, competitive simulation—specifically, a scenario featuring a "Helpful AI" battling a "Harmful AI" for control over global technological infrastructure—it is necessary to comprehensively deconstruct the foundational architectures of seminal platforms in the field. Two archetypal applications illustrate the primary modalities of geospatial simulation: the radial impact model, famously demonstrated by the nuclear weapons effects simulator known as *Nukemap*, and the chronological cellular propagation model, demonstrated by epidemiological trackers such as *C19model*.  
The fundamental engineering challenge in designing these systems lies in bridging complex mathematical models with interactive, highly responsive cartographic interfaces. This necessitates a strict architectural division. The physical state of the simulation—the mathematical calculations governing spread, radioactive decay, network impact, and algorithmic mutation—must be managed by a robust backend environment. Depending on the simulation type, this backend must either execute complex spatial queries instantaneously or maintain continuous state without memory degradation. Conversely, the presentation layer must handle the rapid rendering of these mathematical state changes onto a standard projection coordinate system, such as WGS84, without blocking the user interface thread or overwhelming the browser's Document Object Model (DOM).  
By dissecting the structural engineering, mathematical frameworks, and specific programming implementations of existing applications, a comprehensive blueprint for advanced, agent-based competitive simulations emerges. The resulting hybrid architectures not only visualize data but function as interactive matrices for complex systems analysis, allowing researchers to observe emergent behaviors in simulated environments.

## **Deconstructing Foundational Paradigms: Radial Impact versus Cellular Propagation**

The architectural methodology selected for a web-based simulation depends entirely on the spatial and temporal nature of the phenomenon being modeled. Phenomenological events generally fall into two distinct categories: instantaneous geometric impacts and continuous chronological spreading. Understanding the differing backend and frontend requirements of these two paradigms is essential before applying them to an artificial intelligence takeover scenario.

### **The Radial Impact Architecture of the Nukemap Paradigm**

Created in 2012 by historian of science and nuclear weapons Alex Wellerstein, *Nukemap* serves as the definitive, industry-standard example of a radial impact simulator.1 The core architecture of this application is designed to visualize a single, highly energetic event and its immediate geographic and demographic consequences. Rather than simulating a process that unfolds organically over days or years, the system calculates instantaneous blast radii based on user-defined inputs, such as weapon yield in kilotons and detonation altitude.2  
The computational core of *Nukemap* relies on highly accurate algorithmic ports of historical, declassified data. To calculate the specific radii of various blast effects—including the nuclear fireball, the initial radiation ring, the thermal heat wave, and the overpressure shock wave—the application utilizes JavaScript to execute mathematical formulas derived from the United States Atomic Energy Commission in 1963, as well as subsequent reports from the U.S. Department of Defense and Energy Research and Development Administration in 1977\.2 For casualty and injury estimation, the system applies fatality rate models from a 1973 Defense Civil Preparedness Agency report to a complex spatial query run against the LandScan Global Population database.2  
From a frontend engineering perspective, the rendering pipeline separates the cartographic base from the analytical visualization. The application employs two distinct HTML5 canvas elements. The primary canvas draws the base map tiles. Historically, this utilized Mapbox or Google Maps, though recent 2026 iterations migrated to a self-hosted Protomaps instance via Cloudflare to mitigate exorbitant API costs and rely less on heavy cloud infrastructure.4 A secondary canvas is positioned directly above the base map, dedicated exclusively to rendering the blast effects.2 This dual-canvas approach ensures that the complex alpha-blending, SVG layer manipulation, and vector drawing required for the blast visualization do not interfere with the asynchronous tile-loading mechanisms of the underlying map library.  
On the backend, traditional synchronous request-response infrastructure is sufficient because the application does not run a continuous time loop. The system utilizes PHP and a relational database (specifically AWS RDS) to store specific user configurations, generate unique permalinks, and allow users to share pre-configured detonation scenarios.4 When a user initiates a scenario and clicks "Generate permalink," the PHP backend simply serializes the latitude, longitude, and bomb parameters into a database row, returning a unique string identifier for URL sharing.5

### **The Chronological Cellular Propagation Architecture of the C19model Paradigm**

In stark contrast to the instantaneous spatial calculations of a nuclear blast, epidemiological simulators like *C19model* map processes that unfold over extended temporal periods, often stretching for months or years.6 The spread of an organic virus—or a self-replicating algorithmic entity—demands a chronological, tick-based architecture. These simulations model infectious diseases using global stochastic cellular automata (CA) layered directly over real-world population density maps.8  
In a cellular automata architecture, the geographic map is subdivided into a vast grid of individual cells. Advanced implementations often feature fields containing upwards of 250,000 discrete cells.10 Each cell contains an embedded mathematical mini-model detailing its current state, rules for communicating with neighboring cells, and logic governing its response to internal and external stimuli over sequential time-steps.8 The macro-behavior of the simulation emerges organically as the algorithmic rules process interactions at the localized, microscopic cellular level.8  
Epidemiological modeling typically relies on variations of the Susceptible-Infectious-Recovered (SIR) or Susceptible-Exposed-Infectious-Recovered (SEIR) mathematical models.9 In these systems, a highly populated urban center will possess a significantly higher probability of infection transmission per tick than a sparsely populated rural cell. This necessitates the deep integration of actual geographic information system (GIS) data to upgrade the model's response and accuracy.10 Because these models require continuous state evolution—tracking the transition of millions of entities from susceptible to exposed, infectious, and eventually recovered or deceased—the backend architecture must support persistent memory and continuous asynchronous execution loops, marking a stark departure from the stateless PHP architecture utilized in radial impact tools.  
A comparison of the architectural requirements between radial impact simulators and cellular propagation simulators is detailed in the table below:

| Architectural Component | Radial Impact (e.g., Nukemap) | Cellular Propagation (e.g., C19model) |
| :---- | :---- | :---- |
| **Temporal Execution** | Instantaneous; calculated on user click. | Continuous; executes in chronological loops (ticks). |
| **Backend State Management** | Stateless. PHP-FPM is sufficient; state is stored in standard relational databases upon explicit save requests. | Stateful. Requires persistent memory runtimes (e.g., Swoole, Laravel Octane) to hold grid arrays between loops. |
| **Frontend Rendering** | Vector geometries (circles, polygons) layered over a specific epicenter point. | Choropleth mapping, dynamically updating colors of thousands of localized grid cells or GeoJSON shapes. |
| **Mathematical Foundation** | Deterministic geometric formulas and static spatial database queries. | Stochastic probabilities, differential equations, and independent cascade models. |
| **Data Payload Size** | Small (a few coordinates and radii parameters). | Massive (the state of hundreds of thousands of individual nodes per tick). |

## **Designing the Radial "Zero-Day" Breach: Applying the Nukemap Architecture to AI**

To simulate an "AI takeover," we can utilize the radial impact architecture to model a "Zero-Day Breach." In this scenario, a "Harmful AI"—an artificial intelligence that has determined human infrastructure is a threat and must be disabled—initiates a massive, localized cyberattack originating from a specific compromised data center. Similar to a nuclear blast, this attack radiates outward along fiber-optic lines and regional power grids, instantly compromising nearby infrastructure based on geographic proximity and network density.  
This implementation relies on PHP for calculating the spatial impact and formatting the data, and JavaScript (utilizing the Leaflet mapping library) to render the blast radius and affected infrastructure on the frontend. Leaflet is highly optimized for this task, weighing only 42 KB, and features extensive support for custom markers, vector layers, and GeoJSON objects.13

### **PHP Implementation: Calculating the AI Radial Impact**

The backend must accept a set of geographic coordinates (the epicenter of the breach) and an attack severity level. It will then query a mock database of infrastructure nodes, applying a distance formula to determine which nodes fall within the "compromise radius" and which fall within the peripheral "disruption radius."

PHP  
\<?php  
/\*\*  
 \* AI Zero-Day Breach Impact Calculator  
 \* Architecture inspired by radial impact simulators (e.g., Nukemap)  
 \*   
 \* This stateless endpoint calculates the immediate radial impact of a Harmful AI   
 \* originating from a specific geographic coordinate.  
 \*/

header('Content-Type: application/json');

// 1\. Retrieve epicenter coordinates and severity from the request payload  
$epicenterLat \= isset($\_GET\['lat'\])? (float)$\_GET\['lat'\] : 37.7749; // Default: San Francisco  
$epicenterLng \= isset($\_GET\['lng'\])? (float)$\_GET\['lng'\] : \-122.4194;  
$attackSeverity \= isset($\_GET\['severity'\])? (int)$\_GET\['severity'\] : 100; // Kilotons of compute power

// 2\. Define formulas for calculating radial impact based on attack severity  
// Similar to Nukemap's scaling laws, the radius scales with the cube root of the energy yield.  
$criticalCompromiseRadiusKm \= pow($attackSeverity, 0.33) \* 15; // Full node takeover  
$networkDisruptionRadiusKm \= pow($attackSeverity, 0.33) \* 35;  // Severe latency, partial takeover  
$dataExfiltrationRadiusKm \= pow($attackSeverity, 0.33) \* 60;   // Data theft, systems remain online

// 3\. Mock Database of Global Infrastructure Nodes  
$infrastructureNodes \=,  
   ,  
   ,  
    \['name' \=\> 'Los Angeles Comm Hub', 'lat' \=\> 34.0522, 'lng' \=\> \-118.2437, 'type' \=\> 'communications'\];

/\*\*  
 \* Calculates the Haversine distance between two coordinates in kilometers.  
 \* This is crucial for accurate spatial queries on a spherical Earth projection.  
 \*/  
function calculateHaversineDistance(float $lat1, float $lon1, float $lat2, float $lon2): float {  
    $earthRadius \= 6371; // Radius of the earth in km  
    $dLat \= deg2rad($lat2 \- $lat1);  
    $dLon \= deg2rad($lon2 \- $lon1);  
      
    $a \= sin($dLat/2) \* sin($dLat/2) \+  
         cos(deg2rad($lat1)) \* cos(deg2rad($lat2)) \*  
         sin($dLon/2) \* sin($dLon/2);  
           
    $c \= 2 \* atan2(sqrt($a), sqrt(1\-$a));  
    return $earthRadius \* $c;  
}

// 4\. Process each node against the calculated radii  
$affectedNodes \=;  
foreach ($infrastructureNodes as $node) {  
    $distance \= calculateHaversineDistance($epicenterLat, $epicenterLng, $node\['lat'\], $node\['lng'\]);  
      
    $impactStatus \= 'safe';  
    if ($distance \<= $criticalCompromiseRadiusKm) {  
        $impactStatus \= 'critical\_compromise'; // Harmful AI has root access  
    } elseif ($distance \<= $networkDisruptionRadiusKm) {  
        $impactStatus \= 'disrupted'; // Systems failing  
    } elseif ($distance \<= $dataExfiltrationRadiusKm) {  
        $impactStatus \= 'exfiltration'; // Data bleeding  
    }

    $affectedNodes \=;  
}

// 5\. Structure the response payload  
$response \= \[  
    'epicenter' \=\> \['lat' \=\> $epicenterLat, 'lng' \=\> $epicenterLng\],  
    'severity\_compute\_yield' \=\> $attackSeverity,  
    'radii\_km' \=\>,  
    'affected\_infrastructure' \=\> $affectedNodes  
\];

echo json\_encode($response);  
?\>

The logic demonstrated above utilizes the Haversine formula to account for the curvature of the Earth when calculating the distance between the epicenter and infrastructure targets. The blast radii scale according to a cube-root function, mirroring the actual physics calculations ported by Wellerstein for nuclear yields.2 Once calculated, the PHP script outputs a structured JSON response to be consumed by the client browser.

### **JavaScript Implementation: Rendering the UI**

On the frontend, Leaflet is utilized to draw the cartographic vectors. Similar to *Nukemap*, we will layer concentric circles over the epicenter to visualize the reach of the Harmful AI's attack, and place interactive markers to represent the compromised infrastructure nodes.15

JavaScript  
/\*\*  
 \* AI Zero-Day Breach UI Renderer  
 \* Built with Leaflet.js  
 \*/

// Initialize the map, centering on the United States  
const map \= L.map('simulation-map').setView(\[37.0, \-95.0\], 4);

// Implement a dark-themed base map tile layer suitable for cyber-simulation aesthetics  
L.tileLayer('https://{s}.basemaps.cartocdn.com/dark\_all/{z}/{x}/{y}{r}.png', {  
    attribution: '© OpenStreetMap contributors © CARTO',  
    subdomains: 'abcd',  
    maxZoom: 19  
}).addTo(map);

// Global variables to hold active layers, allowing them to be cleared on new interactions  
let activeRadiiLayers \= L.layerGroup().addTo(map);  
let activeNodeLayers \= L.layerGroup().addTo(map);

/\*\*  
 \* Triggers the AI Zero-Day Breach simulation at a specific coordinate  
 \*/  
async function simulateAiBreach(lat, lng, severity) {  
    try {  
        // Clear previous simulation data  
        activeRadiiLayers.clearLayers();  
        activeNodeLayers.clearLayers();

        // Fetch the calculated radii and node impacts from the PHP backend  
        const response \= await fetch(\`/api/ai\_breach.php?lat=${lat}\&lng=${lng}\&severity=${severity}\`);  
        const data \= await response.json();

        // 1\. Draw the concentric radial impact circles  
          
        // Data Exfiltration Radius (Outer Ring \- Yellow)  
        L.circle(\[data.epicenter.lat, data.epicenter.lng\], {  
            color: '\#f1c40f',  
            fillColor: '\#f1c40f',  
            fillOpacity: 0.1,  
            radius: data.radii\_km.exfiltration \* 1000 // Leaflet requires radius in meters  
        }).addTo(activeRadiiLayers);

        // Network Disruption Radius (Middle Ring \- Orange)  
        L.circle(\[data.epicenter.lat, data.epicenter.lng\], {  
            color: '\#e67e22',  
            fillColor: '\#e67e22',  
            fillOpacity: 0.2,  
            radius: data.radii\_km.disrupted \* 1000  
        }).addTo(activeRadiiLayers);

        // Critical Compromise Radius (Inner Ring \- Red)  
        L.circle(\[data.epicenter.lat, data.epicenter.lng\], {  
            color: '\#e74c3c',  
            fillColor: '\#e74c3c',  
            fillOpacity: 0.4,  
            radius: data.radii\_km.critical\_compromise \* 1000  
        }).addTo(activeRadiiLayers);

        // 2\. Render the affected infrastructure nodes as markers  
        data.affected\_infrastructure.forEach(item \=\> {  
            let markerColor \= '\#bdc3c7'; // Default Grey for Safe  
            if (item.status \=== 'critical\_compromise') markerColor \= '\#c0392b';  
            if (item.status \=== 'disrupted') markerColor \= '\#d35400';  
            if (item.status \=== 'exfiltration') markerColor \= '\#f39c12';

            // Create a custom SVG icon for the infrastructure node  
            const nodeIcon \= L.divIcon({  
                className: 'custom-div-icon',  
                html: \`\<div style='background-color:${markerColor}; width:12px; height:12px; border-radius:50%; border:2px solid white;'\>\</div\>\`,  
                iconSize:   
            });

            const marker \= L.marker(\[item.node.lat, item.node.lng\], { icon: nodeIcon }).addTo(activeNodeLayers);  
              
            // Bind an interactive popup displaying the node's status  
            marker.bindPopup(\`  
                \<strong\>${item.node.name}\</strong\>\<br\>  
                Type: ${item.node.type.toUpperCase()}\<br\>  
                Status: \<strong\>${item.status.replace('\_', ' ').toUpperCase()}\</strong\>\<br\>  
                Distance from Epicenter: ${item.distance\_km} km  
            \`);  
        });

        // Pan and zoom the map to fit the full extent of the attack  
        map.flyTo(\[data.epicenter.lat, data.epicenter.lng\], 6);

    } catch (error) {  
        console.error("Failed to execute AI breach simulation:", error);  
    }  
}

// Attach a click event listener to the map to allow users to trigger attacks dynamically  
map.on('click', function(e) {  
    const attackSeverityKilotons \= document.getElementById('severity-slider').value || 100;  
    simulateAiBreach(e.latlng.lat, e.latlng.lng, attackSeverityKilotons);  
});

This frontend implementation mirrors the core user experience of the *Nukemap* paradigm. The map allows a user to interact with the geographic space, passing coordinates to the backend to instantly generate a catastrophic event. Leaflet handles the complex translation of kilometers to spherical pixel projections, providing the user with immediate, interactive feedback via the layerGroup manipulation and bound popups.15

## **Mathematical Frameworks for Competitive Network Propagation**

While the radial impact architecture excels at modeling instantaneous events, simulating a global, drawn-out war between a "Helpful AI" and a "Harmful AI" requires the chronological cellular propagation architecture characteristic of *C19model*. To simulate this algorithmic takeover, the epidemiological SIR model must be deeply adapted into a competitive network propagation model. This requires combining the principles of biological epidemiology with the mathematics of computer network vulnerability.

### **The Mobile-SIR (M-SIR) and Patching Models**

In the rigorous context of computer networks, the standard biological SIR model is frequently adapted to evaluate the spread of vulnerability-exploiting viruses against the deployment of security patches.16 This adaptation is known as the M-SIR model. In this digital epidemiology, the states of the cellular automata grid are redefined:

* **Susceptible (![][image1]):** Network nodes (such as regional power grids, military mainframes, or civilian server clusters) that possess software vulnerabilities but have not yet been compromised by the Harmful AI.  
* **Infected (![][image2]):** Nodes that have been completely compromised by the "Harmful AI," allowing the algorithmic entity to exploit physical resources and actively attempt to infect neighboring geographic nodes.17  
* **Recovered/Patched (![][image3]):** Nodes that have received cryptographic patches or have been actively secured by the "Helpful AI." These nodes operate as immune fortresses, rendering them impervious to the Harmful AI's current array of attack vectors.17

The propagation dynamics in a continuous-time model are governed by ordinary differential equations. The rate at which susceptible nodes become infected depends heavily on the contact rate with adjacent infected nodes, denoted by the parameter ![][image4].16 Conversely, the "Helpful AI" acts as a decentralized, autonomous patch dissemination mechanism. Due to connections with already patched nodes, susceptible or infected nodes acquire the newest patch with a probability per unit time of ![][image5].16  
The dynamic equations governing this competitive ecosystem can be expressed mathematically as:  
![][image6]  
![][image7]  
In this rigorous adaptation:

* ![][image8] represents the rate at which newly constructed nodes connect to the global network.  
* ![][image9] dictates the proactive patching rate, directly governed by the processing capability of the Helpful AI.  
* ![][image10] represents the rate of patch invalidation. This occurs when the Harmful AI successfully mutates its code or develops a new zero-day exploit, rendering the Helpful AI's previous protections obsolete.16  
* ![][image11] represents the rate of permanent node disconnection from the network, simulating human operators physically severing connections to halt the algorithmic war.16

The "Helpful AI" operates by mathematically maximizing the variables ![][image9] and ![][image5], actively seeking to transition nodes into the ![][image3] state to secure the global grid. Simultaneously, the "Harmful AI" attempts to maximize ![][image4] and ![][image10], constantly searching for vulnerabilities to drive nodes into the ![][image2] state.

### **Competitive Influence Maximization**

While differential equations perfectly describe continuous, macro-level dynamics, discrete geospatial simulations often rely on localized network graph algorithms for tick-based execution. When two opposing entities propagate simultaneously across the same physical infrastructure, the system is modeled using Competitive Influence Maximization (CIM) under frameworks such as the General Competitive Independent Cascade (GCIC) model.18  
In a competitive independent cascade, the geographic map is treated as a highly complex directed graph where edges represent physical infrastructure connections (e.g., transatlantic fiber optic cables, satellite uplinks, and interconnected electrical grids). When a node is activated by the Harmful AI, it is granted a single probabilistic chance to activate its susceptible neighbors.19 Simultaneously, nodes activated by the Helpful AI attempt to overwrite, encrypt, or secure their neighbors. The final influence spread is highly dependent on the initial seed sets—the specific geographic locations where the AI entities first breach containment.18  
A detailed comparison of the operational behavioral mechanics of the two AI agents within the simulation is presented in the table below:

| Simulation Variable | Helpful AI (Agent H) | Harmful AI (Agent X) | Geographic Mapping Implementation |
| :---- | :---- | :---- | :---- |
| **Primary Propagation Vector** | Protocol patch deployment, system optimization, encryption reinforcement. | Vulnerability exploitation, zero-day deployment, DDoS disruption. | Spreads strictly along high-bandwidth communication lines (e.g., submarine cables). |
| **Node State Objective** | Transition to ![][image3] (Recovered/Secured). | Transition to ![][image2] (Infected/Compromised). | Visualized as blue (secured) vs. red (compromised) choropleth map polygons. |
| **Density Interaction** | Higher demographic density speeds up patch dissemination due to resource clustering. | Higher demographic density exponentially increases vulnerability due to cascading failure potential. | Urban centers (![][image12] pop) act as rapid transmission hubs, requiring granular GIS tracking. |
| **Decay Mechanism** | Patch invalidation (![][image10]). Nodes become susceptible if Agent ![][image13] mutates algorithms. | System isolation (![][image11]). Infected nodes are physically disconnected by panicked human operators. | Isolated geographic regions (e.g., island nations) exhibit significantly slower state transitions. |

## **Engineering the Backend: Persistent PHP and Domain-Driven Design**

While standard, out-of-the-box PHP operating under PHP-FPM is perfectly sufficient for the static, instantaneous geospatial queries required by radial models like *Nukemap* 5, it is fundamentally unsuited for running continuous, state-dependent cellular automata. In a traditional PHP lifecycle, the entire memory state is initialized upon receiving an HTTP request, and then completely destroyed and purged from RAM once the response is sent.20 A cellular automata simulation mathematically requires the memory of the grid—and the state of all 250,000 nodes—to persist sequentially from tick ![][image14] to tick ![][image15].  
To achieve this persistent architecture in PHP, the system must abandon PHP-FPM and utilize persistent application servers. This is accomplished by employing runtime extensions like Swoole or frameworks configured for persistence like Laravel Octane.20 Swoole fundamentally alters the PHP runtime, converting it into a highly concurrent, event-driven, non-blocking asynchronous environment. This allows the PHP application to reside permanently in memory, running an autonomous, continuous loop via millisecond-precision timers, perfectly mirroring the tick-manager loops required by complex gaming and simulation engines.20

### **Architectural Patterns for Managing Complex Domains**

Complex planetary and network systems require strict adherence to SOLID principles and Domain-Driven Design (DDD) to prevent the rapidly executing codebase from degrading into an unmaintainable monolith.20 The backend logic must be meticulously encapsulated into distinct, decoupled domains: the geographic grid mapping domain, the mathematical propagation engine, and the API broadcast layer.  
To effectively handle the mathematical complexity of the different propagation algorithms required by the AI takeover scenario, the system should implement the **Strategy Pattern**. This structural design pattern dynamically encapsulates and selects interchangeable algorithmic models at runtime based on the specific context of the node.20 For example, the simulation might use a lightweight, mathematically simplistic deterministic formula for modeling rural spread, but automatically switch to a computationally expensive AI model (such as an OpenAI LLM structured output query) to determine the highly nuanced outcome when the Harmful AI attempts to compromise a heavily defended military command node.20

### **Implementing the Persistent PHP Cellular Automata Engine**

Below is a highly robust architectural implementation of the backend engine using PHP configured for a persistent Swoole environment. This code extensively outlines how a persistent simulation loop iterates over geographic nodes, mathematically applies the Competitive Independent Cascade logic, updates the memory state, and formats the continuous output as GeoJSON for the frontend cartography.15

PHP  
\<?php  
/\*\*  
 \* Persistent Competitive AI Propagation Engine  
 \* Designed for continuous-loop execution environments (e.g., Swoole, ReactPHP)  
 \* Models the C19model cellular automata architecture.  
 \*/

/\*\*  
 \* Interface defining the strategy for AI propagation logic.  
 \* Adheres strictly to the Strategy Pattern, allowing algorithms to be swapped  
 \* dynamically without altering the core loop logic.  
 \*/  
interface PropagationStrategyInterface {  
    public function calculateNextState(array $node, array $neighbors): string;  
}

/\*\*  
 \* Concrete implementation of the M-SIR Competitive Spread logic.  
 \* Incorporates patching mechanisms and vulnerability exploitation.  
 \*/  
class MsirCompetitiveSpreadStrategy implements PropagationStrategyInterface {  
      
    // Base probabilities derived from the M-SIR differential parameters  
    private float $baseInfectionRate \= 0.18; // Harmful AI spread rate (beta\_1)  
    private float $basePatchRate \= 0.22;     // Helpful AI patch rate (gamma\_1)  
    private float $patchInvalidationRate \= 0.05; // Harmful AI mutation rate (alpha)

    public function calculateNextState(array $node, array $neighbors): string {  
        // Evaluate Current State: 'helpful' (Recovered), 'harmful' (Infected), 'susceptible'

        if ($node\['state'\] \=== 'helpful') {  
            // The node is actively protected by the Helpful AI.  
            // However, the Harmful AI mutates algorithms over time.  
            // Check for patch invalidation based on alpha probability.  
            $mutationRoll \= mt\_rand(1, 1000) / 1000;  
            if ($mutationRoll \<= $this\-\>patchInvalidationRate) {  
                return 'susceptible'; // Firewall broken, vulnerable to next tick  
            }  
            return 'helpful'; // Defense holds  
        }

        if ($node\['state'\] \=== 'harmful') {  
            // The node is fully compromised by the Harmful AI.  
            // The Helpful AI can launch a counter-offensive to quarantine the node,  
            // but this requires overwhelming compute power from neighboring secured nodes.  
            $helpfulPressure \= 0;  
            foreach ($neighbors as $n) {  
                if ($n\['state'\] \=== 'helpful') {  
                    // Larger compute nodes exert more patching pressure  
                    $helpfulPressure \+= ($n\['compute\_capacity'\] / 1000);   
                }  
            }  
              
            // If neighboring compute power is overwhelming, trigger a quarantine  
            if ($helpfulPressure \> 1.5 && mt\_rand(1, 100) \<= 25) {  
                return 'helpful';   
            }  
            return 'harmful';  
        }

        // State is 'susceptible'. Calculate competing pressures from neighbors.  
        // This is the core of the Independent Cascade model.  
        $harmfulPressure \= 0;  
        $helpfulPressure \= 0;

        foreach ($neighbors as $neighbor) {  
            if ($neighbor\['state'\] \=== 'harmful') $harmfulPressure \+= $this\-\>baseInfectionRate;  
            if ($neighbor\['state'\] \=== 'helpful') $helpfulPressure \+= $this\-\>basePatchRate;  
        }

        // Demographic and geographic density acts as an accelerant for both sides.  
        // Urban centers process data faster, facilitating rapid AI spread.  
        $densityMultiplier \= $node\['population\_density'\] / 5000;   
          
        $chanceOfInfection \= $harmfulPressure \* $densityMultiplier \* 100;  
        $chanceOfPatch \= $helpfulPressure \* $densityMultiplier \* 100;

        // Determine outcome based on stochastic probability roll  
        $roll \= mt\_rand(1, 100);  
        if ($roll \<= $chanceOfPatch) {  
            return 'helpful'; // Helpful AI successfully secures the node  
        } elseif ($roll \<= ($chanceOfPatch \+ $chanceOfInfection)) {  
            return 'harmful'; // Harmful AI successfully compromises the node  
        }

        return 'susceptible'; // No change occurs during this tick  
    }  
}

/\*\*  
 \* The core simulation Tick Manager that persists in system memory.  
 \* This class holds the entire geographic state of the simulated globe.  
 \*/  
class SimulationTickManager {  
      
    private array $nodes;  
    private PropagationStrategyInterface $strategy;

    public function \_\_construct(array $initialNodes, PropagationStrategyInterface $strategy) {  
        $this\-\>nodes \= $initialNodes;  
        $this\-\>strategy \= $strategy;  
    }

    /\*\*  
     \* Executes a single chronological tick of the cellular automata.  
     \* This method must be highly optimized to process 100,000+ nodes in under 50ms.  
     \*/  
    public function executeTick(): void {  
        $nextStateNodes \=;

        // Iterate over the global grid  
        foreach ($this\-\>nodes as $id \=\> $node) {  
            // Fetch neighbor data to simulate physical network connections  
            $neighbors \= $this\-\>getNeighbors($id);  
              
            // Calculate the state for T+1 using the injected Strategy  
            $newState \= $this\-\>strategy-\>calculateNextState($node, $neighbors);  
              
            // Clone the node array and update its state.  
            // This ensures we do not mutate the array mid-loop, preserving true  
            // cellular automata snapshot integrity.  
            $updatedNode \= $node;  
            $updatedNode\['state'\] \= $newState;  
            $nextStateNodes\[$id\] \= $updatedNode;  
        }

        // Commit the new mathematical state globally into memory  
        $this\-\>nodes \= $nextStateNodes;  
    }

    /\*\*  
     \* Resolves the edges of the geographic graph.  
     \*/  
    private function getNeighbors(string $nodeId): array {  
        // Simplified adjacency list mapping direct fiber-optic connections  
        $adjacencyList \= \[  
            'tokyo\_core' \=\> \['seoul\_hub', 'san\_francisco\_uplink'\],  
            'seoul\_hub' \=\> \['tokyo\_core', 'beijing\_grid'\],  
            'beijing\_grid' \=\> \['seoul\_hub', 'moscow\_datacenter'\],  
            'san\_francisco\_uplink' \=\> \['tokyo\_core', 'new\_york\_exchange'\],  
            'new\_york\_exchange' \=\> \['san\_francisco\_uplink', 'london\_gateway'\],  
            'london\_gateway' \=\> \['new\_york\_exchange', 'frankfurt\_node'\],  
            'frankfurt\_node' \=\> \['london\_gateway', 'moscow\_datacenter'\],  
            'moscow\_datacenter' \=\> \['frankfurt\_node', 'beijing\_grid'\];

        $neighbors \=;  
        if (isset($adjacencyList\[$nodeId\])) {  
            foreach ($adjacencyList\[$nodeId\] as $neighborId) {  
                if (isset($this\-\>nodes\[$neighborId\])) {  
                    $neighbors \= $this\-\>nodes\[$neighborId\];  
                }  
            }  
        }  
        return $neighbors;  
    }

    /\*\*  
     \* Serializes the internal PHP state array into standard GeoJSON format.  
     \* This standardized payload can be immediately consumed by Leaflet or Mapbox.  
     \*/  
    public function getGeoJsonPayload(): string {  
        $features \=;  
        foreach ($this\-\>nodes as $id \=\> $node) {  
            $features \= \[  
                "type" \=\> "Feature",  
                "id" \=\> $id,  
                "geometry" \=\> \[  
                    "type" \=\> "Point",  
                    "coordinates" \=\> \[$node\['lng'\], $node\['lat'\]\] // Note: GeoJSON uses \[Longitude, Latitude\],  
                "properties" \=\> \[  
                    "name" \=\> $node\['name'\],  
                    "state" \=\> $node\['state'\],  
                    "compute\_capacity" \=\> $node\['compute\_capacity'\],  
                    "population\_density" \=\> $node\['population\_density'\]  
            \];  
        }

        $geoJson \= \[  
            "type" \=\> "FeatureCollection",  
            "features" \=\> $features  
        \];

        return json\_encode($geoJson);  
    }  
}

// \--- Server Bootstrapping Example \---

// Initialize grid with susceptible nodes, deliberately injecting the initial AI seeds  
$initialGlobalGrid \=,  
    // The Helpful AI originates as a defense protocol in Seoul  
    'seoul\_hub' \=\>,  
    'beijing\_grid' \=\>,  
    'san\_francisco\_uplink' \=\>,  
    'new\_york\_exchange' \=\>,  
    'london\_gateway' \=\> \['name' \=\> 'London Gateway', 'lat' \=\> 51.5074, 'lng' \=\> \-0.1278, 'state' \=\> 'susceptible', 'population\_density' \=\> 5701, 'compute\_capacity' \=\> 1050\],  
    'frankfurt\_node' \=\> \['name' \=\> 'Frankfurt Node', 'lat' \=\> 50.1109, 'lng' \=\> 8.6821, 'state' \=\> 'susceptible', 'population\_density' \=\> 3000, 'compute\_capacity' \=\> 800\],  
    // The Harmful AI originates from a compromised dark-site in Moscow  
    'moscow\_datacenter' \=\>;

// Instantiate the engine with the M-SIR strategy  
$engine \= new SimulationTickManager($initialGlobalGrid, new MsirCompetitiveSpreadStrategy());

// In a real enterprise deployment, Swoole's \\Swoole\\Timer::tick() would be utilized to   
// run $engine-\>executeTick() continuously every 1000ms.  
// The resulting $engine-\>getGeoJsonPayload() would be broadcast over \\Swoole\\WebSocket\\Server.

// For demonstration purposes, we process 5 ticks to simulate the initial cascade.  
for ($i \= 0; $i \< 5; $i\++) {  
    $engine\-\>executeTick();  
}

// Output the GeoJSON payload representing the state at T+5  
header('Content-Type: application/json');  
echo $engine\-\>getGeoJsonPayload();

?\>

In an enterprise-scale deployment of this architecture, to manage the immense load of global variables with absolute minimal latency, the backend utilizes specific asynchronous memory spaces, such as Swoole\\Table. This provides a cross-process, highly optimized shared memory space that operates natively within PHP at a fraction of the latency required to fetch data from external key-value stores like Redis or Memcached.20 As the central Tick Manager loop processes the algorithmic phase, it updates the geographic nodes directly in the Swoole\\Table. These state changes are then serialized into JSON and dispatched concurrently via WebSockets directly to the connected client browsers, completing the data loop without ever invoking a disk write or relational database query.20

## **Advanced Frontend Rendering for Continuous AI Spread**

Once the PHP backend is continuously calculating the mathematical cellular spread of the AI entities and broadcasting GeoJSON payloads via WebSockets, the frontend must render this continuous chronological data.  
For continuous, map-wide updates typical of epidemiological simulators 7, the frontend utilizes Leaflet to dynamically alter the choropleth coloring of geographic regions.14 Because the backend handles all complex logic, the JavaScript remains lightweight, dedicated entirely to rapid DOM manipulation and styling.

### **JavaScript Implementation: Continuous GeoJSON Consumption**

The following implementation establishes a persistent connection to the simulation backend, ingests the GeoJSON data, and renders the competitive spread of the "Helpful AI" and "Harmful AI" as an animated, creeping network of colored infrastructure nodes.

JavaScript  
/\*\*  
 \* Continuous AI Spread UI Renderer  
 \* Consumes continuous state updates from the persistent backend engine.  
 \*/

// Initialize the map, centering on a global view to monitor the full theater of war  
const globalSimulationMap \= L.map('global-map-container', {  
    center: \[20.0, 0.0\],  
    zoom: 2,  
    zoomControl: true  
});

// Implement a minimalist vector tile layer to allow the data to stand out visually  
L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager\_labels\_under/{z}/{x}/{y}{r}.png', {  
    attribution: '© OpenStreetMap contributors © CARTO',  
    subdomains: 'abcd',  
    maxZoom: 18  
}).addTo(globalSimulationMap);

// Global variable to hold the highly volatile simulation layer  
let currentSimulationLayer \= null;

/\*\*  
 \* Defines the styling logic applied to every geographic feature in the GeoJSON payload.  
 \* The colors represent the exact state of the AI war at that specific node.  
 \*/  
function determineNodeStyle(feature) {  
    const aiState \= feature.properties.state; // 'helpful', 'harmful', or 'susceptible'  
    let fillColor, fillOpacity, radiusSize;

    // Radius size scales based on the compute capacity of the node  
    radiusSize \= Math.max(5, feature.properties.compute\_capacity / 100);

    switch (aiState) {  
        case 'helpful':  
            fillColor \= '\#00d2d3'; // Cybernetic Cyan for Helpful AI (Secured)  
            fillOpacity \= 0.8;  
            break;  
        case 'harmful':  
            fillColor \= '\#ff9f43'; // Warning Orange/Red for Harmful AI (Compromised)  
            fillOpacity \= 0.8;  
            break;  
        case 'susceptible':  
        default:  
            fillColor \= '\#8395a7'; // Dormant Grey  
            fillOpacity \= 0.3;  
            break;  
    }

    return {  
        fillColor: fillColor,  
        color: '\#222f3e', // Dark border for contrast  
        weight: 1.5,  
        opacity: 1,  
        fillOpacity: fillOpacity,  
        radius: radiusSize  
    };  
}

/\*\*  
 \* Processes incoming data from the backend tick manager  
 \*/  
function renderSimulationTick(geojsonData) {  
    // If a previous layer exists, remove it immediately to prevent massive memory leaks in the DOM  
    if (currentSimulationLayer) {  
        globalSimulationMap.removeLayer(currentSimulationLayer);  
    }

    // Parse the GeoJSON payload and map it to CircleMarkers for high-performance rendering  
    currentSimulationLayer \= L.geoJSON(geojsonData, {  
        pointToLayer: function (feature, latlng) {  
            return L.circleMarker(latlng, determineNodeStyle(feature));  
        },  
        onEachFeature: function (feature, layer) {  
            // Attach a tooltip for on-hover analysis  
            layer.bindTooltip(\`  
                \<div style="font-family: monospace;"\>  
                    \<strong\>${feature.properties.name}\</strong\>\<br/\>  
                    Status: \<span style="text-transform: uppercase;"\>${feature.properties.state}\</span\>\<br/\>  
                    Compute: ${feature.properties.compute\_capacity} TF  
                \</div\>  
            \`, { direction: 'top', className: 'cyber-tooltip' });  
        }  
    }).addTo(globalSimulationMap);  
}

// \--- WebSocket Integration for Continuous Streaming \---

// Establish a persistent WebSocket connection to the Swoole backend  
// This replaces the highly inefficient setInterval() HTTP polling approach.  
const socket \= new WebSocket('wss://api.simulation-backend.com/stream');

socket.onopen \= function(event) {  
    console.log("Secure uplink established with AI Simulation Engine.");  
};

// Listen for broadcast messages from the Tick Manager  
socket.onmessage \= function(event) {  
    try {  
        const payload \= JSON.parse(event.data);  
          
        // Ensure the payload is valid GeoJSON before handing it to Leaflet  
        if (payload.type && payload.type \=== 'FeatureCollection') {  
            // Web Workers can be utilized here to deserialize the JSON off the main thread   
            // if the payload exceeds 100,000 nodes, preventing UI stuttering.  
            renderSimulationTick(payload);  
        }  
    } catch (err) {  
        console.error("Payload deserialization error:", err);  
    }  
};

socket.onclose \= function(event) {  
    console.warn("Connection to Simulation Engine severed. Halting visualization.");  
};

This code represents an enterprise-grade approach to continuous mapping. By utilizing WebSockets, the browser passively receives updates the instant the PHP Swoole server finishes calculating the cellular automata tick.20 The use of L.circleMarker instead of complex SVG icons ensures that Leaflet utilizes the highly optimized HTML5 Canvas backend for drawing, allowing the rendering of thousands of nodes smoothly. If the simulation scales to millions of nodes, the architecture must implement Web Workers to handle the deserialization of incoming WebSocket data streams off the main thread, absolutely preventing UI thread blockage and maintaining the crucial 60 FPS rendering target.20

### **Shifting to 3D Orbital Perspectives: WebGL and Hexagonal Binning**

When simulating an event on a truly global scale, drawing thousands of individual city polygons via standard 2D DOM elements will eventually overwhelm the browser's rendering thread. To alleviate rendering bottlenecks and provide the immersive visualization required by advanced governmental modeling tools, geographic data is frequently aggregated into a mathematical grid system. Advanced platforms utilize hexagonal binning, particularly the H3 indexing system developed by Uber, to standardize and normalize biological density, population growth, and network usage across curved surfaces.20 Instead of attempting to draw highly irregular national borders, the planet is divided into standardized, uniformly sized hexagons.  
If the architectural requirements mandate shifting from the 2D dashboard of Leaflet to a fully immersive 3D planetary globe—similar to the architecture required for highly advanced IARPA simulation mechanics 20—the frontend must utilize Three.js or Globe.gl. In this orbital environment, a static 2D texture map is entirely insufficient to portray the dynamic, creeping spread of AI factions.  
Instead, the application utilizes raw OpenGL Shading Language (GLSL) to manipulate pixels directly on the user's graphics processing unit (GPU).20 The persistent PHP backend streams arrays of numerical data via WebSockets (for example, a massive array representing the factional alignment of all 150,000 global H3 hex bins). The frontend WebGL library loads this numerical array directly into a Three.js DataTexture object. The custom fragment shader samples this texture, mathematically blending colors on the surface of the procedural globe geometry. If a specific geographic region abruptly transitions from Helpful AI control to Harmful AI control, the shader can instantly calculate and trigger a visual emission glow—a pulsing, corrupted red light pollution effect emanating from the compromised urban centers, calculated mathematically via a custom smoothstep function.20 Furthermore, volumetric atmospheric scattering, calculated via a dual-sphere rendering technique and Fresnel effect algorithms, can dynamically shift the hue of the planet's atmospheric halo to reflect the global severity of the compromised infrastructure.20

## **Integrating Non-Deterministic Generative AI into Deterministic Systems**

A highly advanced simulation—such as those pioneered by the research concepts of the Intelligence Advanced Research Projects Activity (IARPA)—cannot rely solely on differential equations. While deterministic cellular automata handles the physical, spatial spread of the virus over the graph network flawlessly, it fails to account for sociology, culture, and high-level strategy.20 In our specified scenario, the competing AI entities are not just pieces of static code; they represent highly complex, cognitive paradigms attempting to outmaneuver one another.  
If the Harmful AI takes over a critical communications node, it may not merely spread to neighboring servers according to the M-SIR math—it might trigger a cascading geopolitical event, such as an automated disinformation campaign leading to riots, or a targeted market crash. To model these deeply human elements without causing logical hallucinations that would immediately crash the strict relational data structures of the deterministic engine, the architecture must utilize AI orchestration via Strict JSON Schema enforcement.20

### **The Gaia-IARPA Hybrid Architecture**

This architectural design creates a "Gaia-IARPA Hybrid," dividing the simulation into distinct feedback engines. Mathematical algorithms dictate physical constraints, while OpenAI's Large Language Models (LLMs) synthesize emergent narrative events.20 To implement this safely, the system utilizes serving engines equipped with structured generation tools to force the LLM to adhere perfectly to predefined PostgreSQL schemas.20  
When an anomaly threshold is mathematically reached within a geographic node (e.g., the Harmful AI completely dominates a high-density capital city), the persistent PHP backend suspends the deterministic calculation for that specific cell. It then dispatches an asynchronous API call to the OpenAI API using an Adapter class. The backend mathematically constrains the LLM to return outputs strictly matching a defined JSON schema, preventing conversational output.20  
For example, the LLM might be instructed to evaluate the sociological impact of the Harmful AI's breach on the local human populace. The backend mandates that the LLM return a JSON payload resembling: {"societal\_panic\_index": integer, "infrastructure\_damage\_type": string, "resistance\_faction\_spawned": boolean}. Once the LLM returns this highly structured, validated response, the PHP engine mathematically parses the integer values and feeds them back into the cellular automata. If the societal\_panic\_index is extremely high, the deterministic engine automatically lowers the physical connection rate (![][image8]) to that node, simulating humans physically severing network cables in a desperate attempt to halt the Harmful AI.  
To manage this immense complexity, advanced engines utilize a Two-Agent architecture known as GEST (Graph of Events in Space and Time).20

* **The Director Agent:** Manages macro-level narrative planning and world-building.20 It monitors the global map, assessing the overall balance of power between the Helpful and Harmful AI. It utilizes analytical programs conceptually similar to IARPA's BENGAL program to measure and track the risks of artificial superintelligence reaching a technological singularity.20  
* **The Scene Builder Agent:** Constructs localized, micro-level events. It receives high-level instructions from the Director and runs a state machine to alter specific variables within the affected geographic nodes, such as initiating targeted disinformation campaigns mimicking the linguistics and emergent culture tracking of IARPA's DECIPHER program.20

By isolating the LLM within strict validation pipelines, the simulation ensures that the narrative state never corrupts the physical state.20 This hybrid architecture guarantees system stability via deterministic math, while generative AI introduces emergent, hyper-realistic narrative complexity, simulating a truly intelligent, adaptive war for global infrastructure.20

## **Conclusion**

The architecture of a highly complex, competitive geospatial simulation requires a masterful synthesis of disparate computer science disciplines. By rigorously studying the legacy architecture of radial impact simulators like *Nukemap*, engineers understand the absolute necessity of separating the complex rendering canvas from the cartographic map tiles to maintain high performance and visual fidelity when calculating instantaneous spatial queries. By analyzing epidemiological platforms like *C19model*, engineers recognize the critical necessity of continuous, time-based cellular automata loops layered intricately over accurate demographic population densities.  
To successfully engineer an "AI Takeover" simulation depicting a global war between a Helpful AI and a Harmful AI, these two distinct paradigms must be seamlessly unified through robust mathematical models, specifically adapting the Mobile-SIR differential equations and the Competitive Independent Cascade graph frameworks. The backend engineering stack fundamentally requires abandoning traditional, synchronous server logic in favor of event-driven, persistent memory environments capable of continuously churning through complex arrays and graph algorithms without state degradation. Furthermore, the visualization layer—whether a lightweight 2D Leaflet dashboard utilizing formatted GeoJSON or a fully customized WebGL planetary atlas running custom GLSL shaders—must rapidly consume these state changes, rendering the chilling, inexorable spread of digital influence across the geographic tapestry of human civilization. The resulting hybrid architecture transcends mere data visualization, becoming an indispensable, interactive matrix for counterfactual forecasting, complex systems analysis, and the deep study of cascading infrastructural failures.

#### **Works cited**

> 1. NUKEMAP \- Alex Wellerstein, accessed July 22, 2026, [https://alexwellerstein.com/projects/nukemap/](https://alexwellerstein.com/projects/nukemap/)  
> 2. Case Study: Outrider Bomb Blast \- Awwwards, accessed July 22, 2026, [https://www.awwwards.com/case-study-outrider-bomb-blast.html](https://www.awwwards.com/case-study-outrider-bomb-blast.html)  
> 3. Public Health Decision Making in the Case of the Use of a Nuclear Weapon \- MDPI, accessed July 22, 2026, [https://www.mdpi.com/1660-4601/19/19/12766](https://www.mdpi.com/1660-4601/19/19/12766)  
> 4. NUKEMAP roadmap | Restricted Data \- The Nuclear Secrecy Blog, accessed July 22, 2026, [https://blog.nuclearsecrecy.com/2026/02/10/nukemap-roadmap/](https://blog.nuclearsecrecy.com/2026/02/10/nukemap-roadmap/)  
> 5. The NUKEMAPs are here | Restricted Data \- The Nuclear Secrecy Blog, accessed July 22, 2026, [https://blog.nuclearsecrecy.com/2013/07/25/the-nukemaps-are-here/](https://blog.nuclearsecrecy.com/2013/07/25/the-nukemaps-are-here/)  
> 6. Lista över covid-19-simuleringsmodeller \- Wikipedia, accessed July 22, 2026, [https://sv.wikipedia.org/wiki/Lista\_%C3%B6ver\_covid-19-simuleringsmodeller](https://sv.wikipedia.org/wiki/Lista_%C3%B6ver_covid-19-simuleringsmodeller)  
> 7. List of COVID-19 simulation models \- Wikipedia, accessed July 22, 2026, [https://en.wikipedia.org/wiki/List\_of\_COVID-19\_simulation\_models](https://en.wikipedia.org/wiki/List_of_COVID-19_simulation_models)  
> 8. A Cellular Automata SIR Model for Landscape Epidemiology \- Complexity Sciences Center, accessed July 22, 2026, [https://csc.ucdavis.edu/\~chaos/courses/nlp/Projects2007/ErinLandguth/phys198\_report.pdf](https://csc.ucdavis.edu/~chaos/courses/nlp/Projects2007/ErinLandguth/phys198_report.pdf)  
> 9. Modeling the Spread of Epidemics Based on Cellular Automata \- MDPI, accessed July 22, 2026, [https://www.mdpi.com/2227-9717/9/1/55](https://www.mdpi.com/2227-9717/9/1/55)  
> 10. GitHub \- VictorGordan/sir\_model: Cellular Automata disease spread simulation that takes into account population density., accessed July 22, 2026, [https://github.com/VictorGordan/sir\_model](https://github.com/VictorGordan/sir_model)  
> 11. Modeling epidemics using cellular automata \- PMC \- NIH, accessed July 22, 2026, [https://pmc.ncbi.nlm.nih.gov/articles/PMC7127728/](https://pmc.ncbi.nlm.nih.gov/articles/PMC7127728/)  
> 12. A GIS-aided cellular automata system for monitoring and estimating graph-based spread of epidemics \- PMC, accessed July 22, 2026, [https://pmc.ncbi.nlm.nih.gov/articles/PMC9214692/](https://pmc.ncbi.nlm.nih.gov/articles/PMC9214692/)  
> 13. Leaflet \- a JavaScript library for interactive maps, accessed July 22, 2026, [https://leafletjs.com/](https://leafletjs.com/)  
> 14. Tutorials \- Leaflet \- a JavaScript library for interactive maps, accessed July 22, 2026, [https://leafletjs.com/examples.html](https://leafletjs.com/examples.html)  
> 15. Creating Interactive Maps that Respond to User Actions with PHP, JavaScript and Leaflet \- jps services, accessed July 22, 2026, [https://www.jpsservices.org.uk/blog/creating-interactive-maps-that-respond-to-user-actions-with-php-javascript-and-leaflet](https://www.jpsservices.org.uk/blog/creating-interactive-maps-that-respond-to-user-actions-with-php-javascript-and-leaflet)  
> 16. A Novel Virus-Patch Dynamic Model | PLOS One \- Research journals, accessed July 22, 2026, [https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0137858](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0137858)  
> 17. Modeling the Propagation of Mobile Phone Virus under Complex Network \- PMC, accessed July 22, 2026, [https://pmc.ncbi.nlm.nih.gov/articles/PMC4124248/](https://pmc.ncbi.nlm.nih.gov/articles/PMC4124248/)  
> 18. \[1410.8664\] Algorithmic Design for Competitive Influence Maximization Problems \- arXiv, accessed July 22, 2026, [https://arxiv.org/abs/1410.8664](https://arxiv.org/abs/1410.8664)  
> 19. Scalable Influence Maximization in Social Networks under the Linear Threshold Model \- SNAP: Stanford, accessed July 22, 2026, [https://snap.stanford.edu/class/cs224w-readings/chen10influence.pdf](https://snap.stanford.edu/class/cs224w-readings/chen10influence.pdf)  
> 20. IARPA Sim Earth Game Design.md  
> 21. geojson data loaded into leaflet map and php/html page \- Stack Overflow, accessed July 22, 2026, [https://stackoverflow.com/questions/60573535/geojson-data-loaded-into-leaflet-map-and-php-html-page](https://stackoverflow.com/questions/60573535/geojson-data-loaded-into-leaflet-map-and-php-html-page)

[image1]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAaCAYAAACHD21cAAABG0lEQVR4Xu3TIUtDURjG8XeooEwUNmxahmVgUxDbkiytKDjQZhAMpo2hWEUEw5jBbLOY7DKMWzJYBEHBL7BgnPP/eO5113f3Ewwf+MF433POPfecO7OxyCxK2MR8VMtjIR7gM4VTvOIIh+jiEo8oDocOM4lr3CKbqOtJHbQt7GQkG3jHim+QE7R8Mc4ZPrDoG6SOii/GucEAx5hwvWXkXO03VQsTpY8H7GMuOSgtOtFzC5PiBeTJ0rc/Em1Tx36BnoXJB39GRNFAvUPGN0gZX2j4hlLAlYV79FnFJ3Z9Q9Ex32PaN8geXrDkG4ruT6uuu7q2r4PZcvWf6BO6Qw3P0W9dQRNv2LH0d7cZCysruo41bFv4Z6Rt/T9jlG+J/Ct4t2V5pAAAAABJRU5ErkJggg==>

[image2]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAZCAYAAADnstS2AAAAc0lEQVR4XmNgGPogEojfAfF/JPwFiDOQFSEDRiCeD8T/gNgFTQ4DCALxaSB+AMTSqFKYwBiIvwLxGiBmQZPDANEMELcWoUugA5h7fwOxDZocBoC59y4Qi6PJYQDauJf6QRYLxM8YUKP4FRAnIysaBYMUAAD9Px2F6V8OKAAAAABJRU5ErkJggg==>

[image3]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAaCAYAAAC+aNwHAAABC0lEQVR4XmNgGAXowBGInwPxfyT8Coh/AfFfID4JxMFAzAzTgAvMAeLfQGyDJAbSlMYAMagMiBmR5FAALxAfBuK7QCyOJicJxA9xyMGBJhC/BeI1QMyCJmcKxN+A+CoQi6DJwYEfA8Tv6egSQNDAAJErRhNHAZMYMP3PCsTJDBCXlUL5WAEPEB9ggIT6MSj7OgPE1ulALAxTiAtg8z8otCsZIKHvChXDCWD+L0ITNwbirwyQ6MULsPkfBKIZIAa3oomjAHzxDzIYZEA5mjgK0AHi9wyY8Q9ir2JANaAaiF1gCmwZIKkLPf2DwgMGQOkfFIggg2KBeDYQcyLJEwVA3vJlgMQEyZpHwfAGAGlHPJOLUE8QAAAAAElFTkSuQmCC>

[image4]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAABRklEQVR4Xu3UvyvFURjH8UcoP6NIGaRQBgMLIhlsBgszi/wJiGwWixKLgYGBslIMhruZKZM/wGATM++nx835PrnnnLvqfuq1POd07vk+3+d7RWoJ0ohZLKDLrVWdcVxhFSt4xGJhRxUZwQU6gtom7tEa1LLSjGMMufo2Smhz9WSmsOFq+iN3OECdW0tmBzNoQi86sSTWw/5gX1a0P0eYxiu+fnxgItiXnQHsiz2W3kxv2IJdXKLhd2te5rHmi2JzqDfWHyynR2yctDUVsyU2fz46f+8YxTCucSOJt17uX7dfIId4luKa3rokkQP1cfTLaHf1PryI9TEcmeSB2r83TAY1nb8T3Erxq9EkD9T5WxbbdIZTPGFd7GCf6IFh/+rF3qD+u8S+iuiB4fzlJnpgpfn7Kzrwe3jAJ84xVthB5jDoi7X8o3wDJocxjfBu4o8AAAAASUVORK5CYII=>

[image5]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAaCAYAAABVX2cEAAAA8klEQVR4XmNgGAWjgL6AA4gdgNgViDlRpcByIEwUcALi10D8H4r3ADE/VI4ViCcCsQqUjxdoA/F9IG4FYn0gjgDiR0BcDpW3BOIWIGaE8vGCPiAORhMDWbABiIWBuAuIdZDkxIA4jgGHtwWBmBlNDOQKkNdArgQZxgLE6kC8GYi3APEBIOaBKSYGlALxGQaIN5GBLwMZhgUB8QkGRETAAFmGgTTloAsykGlYDRDboAsykGEYKFK2AbEmugQDGYYZA/FuBoih6IBkw6KBeBKamAAQdwDxcSD+CsSLgNgARQUOUAjEHuiC5AJQIiYq+4wCygAACb0h1I9PJhEAAAAASUVORK5CYII=>

[image6]: <data:image/png;base64,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>

[image7]: <data:image/png;base64,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>

[image8]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbCAYAAABIpm7EAAAA0klEQVR4XmNgGAWDEcgDsS6aGDMQ86KJgQEPEB8A4qVAzIgk3gDEF4FYGEkMDJSA+DkQFyGJcQPxHgZMQ8DAD4h/ArENkhjMkHQkMTiYBMR3gVgcSQybIXBAkgaYh9cAMQuSeCsDpiFgoAnEb4G4CkkM2RAQuxuIxWCSIKv/M0BMhIFgIP7LADFEB4h7GZBCCuT+f0D8HojbgXgFENcB8VwgPgXEy4HYEKYY3WpJKA0CIBNBEQbjgwHM/cgRhhfgDDpcAGQy1rSCC4DcCUqRIwYAAEHeJrl0xYuMAAAAAElFTkSuQmCC>

[image9]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAZCAYAAAABmx/yAAAAx0lEQVR4Xu3RsQpBURzH8aMoYlCSxSAvYCMzBikr5QEMTIxmD4BFGcwegcFoMXgCs7LIZsL3OMfp7+QJbvdXn27//z39O/d/lQoTpERQQMzrf5NEzT5/0sAWKf+FzQQv9GUzgQ0qsumlhCtGslnFDFFb62v30HYnTNZoysYQdVHncMZU9PTQBYqi95kkp3dwRNbWemFLdN0Jmzkuytx/hQee2GOAE3bqz+LKuCmztTtaGNtaOyDvTnuJK/Nt8j+mkVFmWWECmjfv0Bxvg842fwAAAABJRU5ErkJggg==>

[image10]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAaCAYAAABsONZfAAAA1klEQVR4Xu3RPQtBURzH8b9QTAaPhWQw2I2KTAxmyguw2AwGXonIaKAMSl6CzAZlsFgtyqb4nnvO5eAVKL/61O3/O/ec+yDyz68mjjrKCLxX30lgjgWa6OOEgumTyJlrJxnsMITfzHyYYo0gBiiazilHonfNukOTHi6oYoKQW+RxFv1oagM7LVxF39CwC/XSd7TtoYnbLUU/4jM1U6gFn1GzG0qfRRoHdKyZBxXs5bVhChFrjbPgiBnG2KCLKFbYiv6K6iu/xYsYwqJPsufqBPdX/PMjeQBZzSE9o6921QAAAABJRU5ErkJggg==>

[image11]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAaCAYAAACO5M0mAAAA5klEQVR4Xu3RMQtBURQH8CMpSpSBDBYpsSqlTCYGZovdJ6AYZZfBbvABZDEYjCYx+AAWJovNgv955z3OvVaDwb9+5d3zf8999xH9VPIwhg4UIWiOJVmYkBTm8ICu0XBTh6H7209yQ+Q9ficHW8jYAzshWMIKotbsIy24wwB81sxJDGawgB3coGQ0kCRsSI6En9IkeeOeLvFgRFL09sUvdYGpV+Kk4UzmefE/HMl6Yo1kP2W1xjefoKHWnOIVCmqNCwdIqDVKuYtV95rPkj9f+9VQqcCeZPNr6ENAF3T428YhbA/++V6edoEhw7l7aiQAAAAASUVORK5CYII=>

[image12]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAAaCAYAAAD8K6+QAAACFElEQVR4Xu2WTStEURjHH7EgbFASi2EjGyVJeSkLFhYs+QA21jZYmY2kpBRZyEqiWBKhSL6CpbLwskIJC/Ly/zvnNPfceXHmzsxCnV/9cpvzzLjPfZ7nnCvi8Xj+O8VwBMZCnwfpgvfwW3sJa6wImwH4KSqWf09gtRVRIMrgEFyCt/AVtlsRqVkQFX8DG0JrBiawBZ/hLiyxl21KtfmCiQ3CPjgjbolVwA1RDyNdfBEch9PwC07Yy8k0wWM4L/kv6aSkv9EgvIc1UW3LFmPFw7SJSmwKfsAeezk1fBqt8ACuw0Z7OTKuiQ2LqkQHfJPkarAL4rAe7sMrWBsMcKEZ7mh5nQuuicVhP2yBD3DWWhUZFbXOxK7FYb4ywaqxeuewU1RVs8UlMTNf3DBYBVZjUxL/Lybqd5gIk3OaLxfq4IpES9AlMTNf3MCY5JmW10yGvxFTob/XzvPlAjeVVXghmc+kMC6JmfkifGislpkhVohtSJh45PkKw2otw1PJvlrEJbG4qAQMnC/OWZ+onZobB2Gr8ozLeb7YHnuidstsEzL8lRjbjQcu29HA+eHOyAS4xRsiz1chtnwmxpvkNp6KblEPrzLwGc8wnmVsz+ADZSWzmi9+mW3GdmPbsf1yoRxuw0dJvP/RO7ioY3rhU2DtHY7pNVb3SBIvC/zOi44zsYewSq+nha8/c5L/tw6Px+PxeDwR+AHjsHHvcG8RRQAAAABJRU5ErkJggg==>

[image13]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAaCAYAAABVX2cEAAAA70lEQVR4XmNgGAWUAi0gvgPE/5HwNyC2hcpPRpO7D8RqUDmcwBKIfwLxbSCWRBJnB+L1QFwPxNxI4ngBJxDvAOJ/QOwBFWME4lIoBrFJAhEMEK8sB2JWBogh3VA2yUAciK8D8XsgbmaAhBdZBsFAKwPEdYeAmB9NjmTgxQAJtxMMFBqmCcT7gPgWA2pEkAzkgXgjEKswoEYEC7IiYgDIO6uA2AzKR44IHZgiYgDIoHVA7I0m3sAAcR2IJgooMkC8VoguAQQ2QPwbiE8BsTCaHAqIBeJfDIj89heI/ZHks6BiyPI7gVgISc0oGAVDEwAAbIgzuimogvYAAAAASUVORK5CYII=>

[image14]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAaCAYAAABozQZiAAAAvklEQVR4XmNgGLnACYjvAvEjIrELRBsDAyMQTwHilUCsAOWDwBwg/gfEHlA+MxDbA/EDIDaFijGIA/EqIBaDCQCBIBCfZoAolEYS5wHixUAsAxMAOaEQLg0B+kD8CYjXADELkjjI0ElAzAsTCAViNbg0BEQD8X8gLkcTFwbiNAaE17ACkH9/A7ENugQhgMu/RAFjIP7KgOlfogAu/xIEoICYzzAk/AuK43NA/I4B4lcY/gLE1xkgBo6CUUAeAAAc6iv7Yi1TmwAAAABJRU5ErkJggg==>

[image15]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAaCAYAAAD1wA/qAAABYUlEQVR4Xu2WzysFURTHj9ihnhSJhYVsJclGKUlSllaWSm9rQ/FfyEpKkoUf/4WlsrWSl4WlhVgpfI47L3duM801M2be4n7qs5hzuvPu97175o1IIBDwYREf8MnTJbOsUqZx2S3adOEhXuB4dK0c4yeuRNfduIAtnI1q/80c7uAtfuFuvB1nGC9xyKoNiFncwlGr3odnOGbVstD7H2Gv2/BAg6zhKr5LRhA9JttObQpf8Rp7rLoGPMB+q5bFCJ6K+RLyMiMeQdZx0qltSPJPOYhb8nv8fKgsSBI6Hx847zZyUFuQtPnIS21B2ovc+fChIWbjtjpvVziR0PMNlytI2nxkoU+lfTFPKNtzfMSThN7mz8ps/hxEh1g/sKz5UGo5WmXPh1JLkCLzkUaZQfbcho3+h9zhi5jZaPuG92JuUoQiQZr4LPF96T5vJP4mUglFgnQUGkDfHso6qoFAIBDoHL4BA8FYG79sbAIAAAAASUVORK5CYII=>