{"data":{"markdownRemark":{"html":"<h2 id=\"model-overview\"><a href=\"#model-overview\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Model overview</h2>\n<p>In this tutorial we will present an implementation of the forest fire model. This model illustrates how a wild fire spreads through a 2-dimensional grid. Each cell of this grid can either be occupied by a tree or empty. If a tree catches fire, it will ignite its neighboring trees. The model investigates how the fire spread through the environment based on the density of trees (versus empty cells) and the way the fire spreads (i.e. whether it spreads only between nearest neighbor trees or whether it can also affect the next nearest neighbors).</p>\n<p>While modelling of a wild fire might appear as a niche endeavor, this model can be seen as a more general framework for modelling contagion in a system, providing many applications. A direct translation of such model would be to model the spread of a disease in different locations of an environment. However, the model can even provide a template for contagion in a more general sense. For instance, this template could be adapted for modelling the spread of misinformation in a social network.</p>\n<h2 id=\"summary-of-the-model-implementation\"><a href=\"#summary-of-the-model-implementation\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary of the model implementation</h2>\n<p>The model has the following key components: </p>\n<ul>\n<li>Cells: each grid cell in the 2-d environment can either be empty or occupied by a tree. The density of trees is hereby a core component of interest with respect to the spread of the fire. </li>\n<li>Neighborhood environment: each cell is connected to its neighbors. The way cells are connected to each other (e.g. to the nearest neighbors or also the next nearest neighbors), and resulting from this the number for connections, will influence the spread of the fire. </li>\n<li>The mechanism of spread: in the current model implementation each tree will ignite other trees if they are connected in a neighborhood. However, more sophisticated mechanisms (e.g. probabilistic rules) could be specified to model the mechanism of spread. </li>\n</ul>\n<h2 id=\"globals\"><a href=\"#globals\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Globals</h2>\n<p>The following global variables are defined in the forest fire model.</p>\n<blockquote>\n<p>ForestFireModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">     <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"gridSize\"</span><span class=\"token punctuation\">)</span> <span class=\"token number\">1</span>  \n     <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> gridSize <span class=\"token operator\">=</span> <span class=\"token number\">50</span><span class=\"token punctuation\">;</span>  \n      \n      <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Empty Cells Proportion\"</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token keyword\">public</span> <span class=\"token keyword\">double</span> emptyCellsPcg <span class=\"token operator\">=</span> <span class=\"token number\">0.4</span><span class=\"token punctuation\">;</span>  \n      \n      <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Probability of spontaneous ignition\"</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token keyword\">public</span> <span class=\"token keyword\">double</span> probabilityIgnite <span class=\"token operator\">=</span> <span class=\"token number\">0.01</span><span class=\"token punctuation\">;</span>  \n      \n      <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Neighborhood type: 1 Moore; 2= Von Neumann; 3=customized\"</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> neighborhood <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>  \n      \n      <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Neighbors distance\"</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> similarityThreshold <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>  \n      \n     <span class=\"token keyword\">public</span> GridParameters gridParameters<span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>The variable <code class=\"language-text\">gridSize</code> defines the length of the dimension of the grid environment. For example, a <code class=\"language-text\">gridSize</code> of 40 will result in a 40*40 environment, i.e. creating 1600 cells. </li>\n<li>The variable <code class=\"language-text\">emptyCellsPcg</code> defines the percentage of empty cells overall. For instance, a <code class=\"language-text\">emptyCellsPcg</code> of 0.4 will result in a 40% empty cells. </li>\n<li>The variable <code class=\"language-text\">probabilityIgnite</code> defines the probability that the each tree will ignite spontaneously. In the current model implementation, this spontaneous ignition only happens on the first tick. However, it would be possible to have this event on every tick. </li>\n<li>The variable <code class=\"language-text\">neighborhood</code> defines the way in which agents are connected to each other. If equal to 1, the cells will be connected in a Moore neighborhood, which means that agents are connected to their nearest and next nearest neighbors, resulting in 8 neighbors for each cell. If equal to 2, the cells will be connected in a Von Neumann neighborhood, which means that agents are only connected to their nearest neighbor, resulting in 4 neighbors for each cell. Finally, it is possible to design a customized connection strategy where the cells connect to any other cell within a distance. This setting is chosen by assigning the value 3 to the  <code class=\"language-text\">neighborhood</code> variables. </li>\n<li>The variable <code class=\"language-text\">similarityThreshold</code> only applies when using a customized connector between cells. In this case, the <code class=\"language-text\">similarityThreshold</code> defines the furthest distance between two connected cells. </li>\n<li>The variable <code class=\"language-text\">gridParameters</code> initializes an object of class GridParameters, which defines the 2-d grid.</li>\n</ul>\n<h2 id=\"connectors-and-agent-neighborhoods\"><a href=\"#connectors-and-agent-neighborhoods\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Connectors and agent neighborhoods</h2>\n<p>As explained above, in this model there are different ways to connect the cells/agents. The chosen way of connecting the agents will result in different types of neighborhoods. Importantly, this way of connecting agents will dramatically effect how the fire will spread through the environment. Therefore, the way the environment (or network) is structured is a core component for investigating how the model will behave. Since this is a critical part of the model, we will use this to demonstrate different strategies for forming networks in the SDK. </p>\n<p><strong>Importantly, we will also demonstrate how you can build your own customized connectors and connect agents in a flexible way.</strong> </p>\n<h3 id=\"moore-neighborhood\"><a href=\"#moore-neighborhood\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Moore Neighborhood</h3>\n<p>In a Moore neighborhood, each cell is connected to its nearest and next nearest neighbors, i.e. the central cell is connected to its 8 surrounding cells. To connect the cells in a Moore neighborhood, we can use a built-in connector of the SDK in the setup function: </p>\n<blockquote>\n<p>ForestFireModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token annotation punctuation\">@Override</span>  \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n      Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ContagionAgent<span class=\"token punctuation\">></span></span> agentGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridParameters<span class=\"token punctuation\">.</span>nbTotal<span class=\"token punctuation\">,</span> agents <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n    \n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n      \n     <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>neighborhood <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n            agentGroup<span class=\"token punctuation\">.</span><span class=\"token function\">gridConnected</span><span class=\"token punctuation\">(</span>Links<span class=\"token punctuation\">.</span>AgentLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">mooreConnected</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n      <span class=\"token punctuation\">}</span> \n\t  </code></pre></div>\n<h3 id=\"von-neumann-neighborhood\"><a href=\"#von-neumann-neighborhood\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Von Neumann Neighborhood</h3>\n<p>In a Von Neumann neighborhood, each cell is connected to its nearest neighbors, i.e. the central cell is connected to its 4 adjacent cells. To connect the cells in a Von Neumann neighborhood, we can use a built-in connector of the SDK in the setup function: </p>\n<blockquote>\n<p>ForestFireModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">@Override  \npublic void setup() {  \n  Group&lt;ContagionAgent&gt; agentGroup = generateGroup(ContagionAgent.class, getGlobals().gridParameters.nbTotal, agents -&gt; {  \n\n...\n  \n if(getGlobals().neighborhood == 2) {  \n\tagentGroup.gridConnected(Links.AgentLink.class).vonNeumannConnected();\n  } </code></pre></div>\n<h3 id=\"customized-connector\"><a href=\"#customized-connector\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Customized connector</h3>\n<p>  While the built-in connectors are a great way of easily and efficiently connecting agents, under some circumstance you might wish to design you own custom-made connectors to allow for more flexibility when connecting agents in you simulation.\nIn the context of this forest fire model, one might wish to connect agents based on their location, however, allowing for slightly further distances between agents (e.g. connect to the closest 12 agents instead to the closest 8 agents). Here, it will be demonstrated how to achieve such functionality within the SDK. </p>\n<h4 id=\"attributes-defining-similarity\"><a href=\"#attributes-defining-similarity\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Attributes defining similarity</h4>\n<p>In the 2-d environment, agents are connected if they are in physical proximity. Thus, agents are connected based on their similarity with respect to their x- and y-coordinate in the grid. Importantly, this is a special case of a very general principle of homophily. Homophily describes the finding that agents are more likely to connect if they are similar in some attributes, and this principle applies to a wide range of situations such as social networks where people are more likely to connect to each other if they share similar views. Therefore, connecting agents based on their location should be seen as an illustration and can easily be applied to other attributes.\nFirst, each agent needs to be assigned some attributes based on which they can be connected. This happens in the setup() function where the agents are initialized. </p>\n<blockquote>\n<p>ForestFireModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token annotation punctuation\">@Override</span>  \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridParameters <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">GridParameters</span><span class=\"token punctuation\">(</span>gridSize2<span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>emptyCellsPcg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\n      Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ContagionAgent<span class=\"token punctuation\">></span></span> agentGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridParameters<span class=\"token punctuation\">.</span>nbTotal<span class=\"token punctuation\">,</span> agents <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n            Cell newCell <span class=\"token operator\">=</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridParameters<span class=\"token punctuation\">.</span><span class=\"token function\">assignCell</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>neighborhood <span class=\"token operator\">!=</span> <span class=\"token number\">1</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>neighborhood <span class=\"token operator\">!=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n                agents<span class=\"token punctuation\">.</span>attribute1 <span class=\"token operator\">=</span> newCell<span class=\"token punctuation\">.</span><span class=\"token function\">getXCoordinate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t    agents<span class=\"token punctuation\">.</span>attribute2 <span class=\"token operator\">=</span> newCell<span class=\"token punctuation\">.</span><span class=\"token function\">getYCoordinate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n      <span class=\"token punctuation\">}</span>  \n       agents<span class=\"token punctuation\">.</span><span class=\"token function\">initializeState</span><span class=\"token punctuation\">(</span>newCell<span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n      agents<span class=\"token punctuation\">.</span>frequencyIgnition <span class=\"token operator\">=</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>probabilityIgnite<span class=\"token punctuation\">;</span>  \n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Each agent is initialized with their x- and y-coordinates as attribute. These coordinates are defined in the <code class=\"language-text\">gridParameters</code> class as follows: </p>\n<blockquote>\n<p>GridParameter.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">GridParameters</span> <span class=\"token punctuation\">{</span>  \n     <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> nbTotal<span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> nbOccupied<span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> nbEmpty<span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> ArrayList<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Integer<span class=\"token punctuation\">></span></span> yCoordinates <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Integer<span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> ArrayList<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Integer<span class=\"token punctuation\">></span></span> xCoordinates <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Integer<span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> ArrayList<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Boolean<span class=\"token punctuation\">></span></span> stateList <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> ArrayList<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Cell<span class=\"token punctuation\">></span></span> cellList <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Cell<span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n      \n     <span class=\"token keyword\">public</span> <span class=\"token function\">GridParameters</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> gridSize<span class=\"token punctuation\">,</span> <span class=\"token keyword\">double</span> emptyCellsPcg<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n\t     nbTotal <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">pow</span><span class=\"token punctuation\">(</span>gridSize<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t     nbEmpty <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">ceil</span><span class=\"token punctuation\">(</span>nbTotal <span class=\"token operator\">*</span> emptyCellsPcg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t     nbOccupied <span class=\"token operator\">=</span> nbTotal <span class=\"token operator\">-</span> nbEmpty<span class=\"token punctuation\">;</span>  \n\t     <span class=\"token keyword\">int</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>  \n      \n\t     <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> gridSize<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n                <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> gridSize<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>j<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n                    xCoordinates<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    yCoordinates<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>j<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t\t     <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>counter <span class=\"token operator\">&lt;</span> nbOccupied<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n\t                        stateList<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t\t      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>  \n\t                        stateList<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t\t      <span class=\"token punctuation\">}</span>  \n                    counter<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>  \n\t\t\t      <span class=\"token punctuation\">}</span>  \n\t\t     <span class=\"token punctuation\">}</span>\t  \n      \n\t     Collections<span class=\"token punctuation\">.</span><span class=\"token function\">shuffle</span><span class=\"token punctuation\">(</span>stateList<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t     <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> k <span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> k <span class=\"token operator\">&lt;</span> nbTotal<span class=\"token punctuation\">;</span> k<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>  \n                    Cell newCell<span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Cell</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> xCoordinates<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> yCoordinates<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> stateList<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t      cellList<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>newCell<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t      <span class=\"token punctuation\">}</span>  \n     <span class=\"token punctuation\">}</span>  \n      \n    <span class=\"token keyword\">public</span> Cell <span class=\"token function\">assignCell</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>  \n      Cell outputCell <span class=\"token operator\">=</span> cellList<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n      cellList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">return</span> outputCell<span class=\"token punctuation\">;</span>  \n      <span class=\"token punctuation\">}</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>Each cell has now two attributes, defining their x- and y-coordinate. </p>\n<h4 id=\"start-with-a-fully-connected-network\"><a href=\"#start-with-a-fully-connected-network\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Start with a fully connected network</h4>\n<p>To define your customized network, we start with a fully connected network and later prune this network based on the (dis)similarity between agents. Therefore, in the setup() function, a fully connected network is initialized: </p>\n<blockquote>\n<p>ForestFireModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token annotation punctuation\">@Override</span>  \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n      Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ContagionAgent<span class=\"token punctuation\">></span></span> agentGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridParameters<span class=\"token punctuation\">.</span>nbTotal<span class=\"token punctuation\">,</span> \n      <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>neighborhood <span class=\"token operator\">==</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n\t\tagentGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>agentGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>AgentLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> </code></pre></div>\n<h4 id=\"prune-the-network\"><a href=\"#prune-the-network\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Prune the network</h4>\n<p>On the first tick of the simulation, the network needs to be pruned. This happens with the following commands in the step() function: </p>\n<blockquote>\n<p>ForestFireModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">if (getContext().getTick() == 0) {  \n    if(getGlobals().neighborhood !=1 &amp;&amp; getGlobals().neighborhood != 2){  \n        run(ContagionAgent.informNeighborAttribute(), ContagionAgent.pruneConnection());  \n    }\n}</code></pre></div>\n<p>There are two relevant component here. First, each agent sends a message to all other agents, informing them about its attributes (i.e. its x- and y-coordinate). Second, each agent takes the information received from the other agents to prune their network. </p>\n<blockquote>\n<p>ContagionAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">private</span> <span class=\"token keyword\">void</span> <span class=\"token function\">sendAttribute</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> attribute1<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> attribute2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>  \n        <span class=\"token function\">getLinks</span><span class=\"token punctuation\">(</span>Links<span class=\"token punctuation\">.</span>AgentLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>AttributeMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">,</span> link<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n            msg<span class=\"token punctuation\">.</span>attribute1<span class=\"token operator\">=</span>attribute1<span class=\"token punctuation\">;</span>  \n      msg<span class=\"token punctuation\">.</span>attribute2<span class=\"token operator\">=</span>attribute2<span class=\"token punctuation\">;</span>  \n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>   Here, each agent sends a message with its attributes (in this case x- and y-coordinate) to all other agents. </p>\n<blockquote>\n<p>ContagionAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ContagionAgent<span class=\"token punctuation\">></span></span> <span class=\"token function\">pruneConnection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>  \n                ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> contagionAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span>  \n                        contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>AttributeMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>msg <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n                            <span class=\"token keyword\">double</span> dissimilarity <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">pow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>attribute1 <span class=\"token operator\">-</span> contagionAgent<span class=\"token punctuation\">.</span>attribute1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> \t\t    Math<span class=\"token punctuation\">.</span><span class=\"token function\">pow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span>attribute2 <span class=\"token operator\">-</span> contagionAgent<span class=\"token punctuation\">.</span>attribute2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t\t\t    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dissimilarity <span class=\"token operator\">></span> contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>similarityThreshold<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n                                contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">removeLinksTo</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span><span class=\"token function\">getSender</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t\t\t      <span class=\"token punctuation\">}</span>  \n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>Each agent receives a message from all other agents, stating their attributes. Based on this, the agent calculates a dissimilarity (in this case a distance) to each other agent. If the other agent is further away than a predefined threshold, the link to this agent is removed. Through this process only the links between neighboring agents remain. Importantly, a similar pruning process can be applied to other attributes, enabling to create neighborhoods based on similarity of any attribute. </p>\n<h2 id=\"spreading-contagion\"><a href=\"#spreading-contagion\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Spreading contagion</h2>\n<p>After having established a network structure, we are interested in how the fire spreads through the environment.\nOn the first step, some trees will spontaneously catch fire (e.g. due to a lightning bolt). This creates the starting condition for the spread of fire:</p>\n<blockquote>\n<p>ForestFire.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">    public void step() {  \n        super.step();  \n     if (getContext().getTick() == 0) {  \n     \n     ...\n     \n         run(ContagionAgent.spontaneousIgnite());  \n\t     return;  \n      }</code></pre></div>\n<blockquote>\n<p>ContagionAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ContagionAgent<span class=\"token punctuation\">></span></span> <span class=\"token function\">spontaneousIgnite</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>  \n                ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> contagionAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n                    <span class=\"token keyword\">double</span> igniteSpontaneous <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>igniteSpontaneous <span class=\"token operator\">&lt;</span> contagionAgent<span class=\"token punctuation\">.</span>frequencyIgnition<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n\t                        contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">switchToInfected</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t                         <span class=\"token punctuation\">}</span>  \n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>Hereby, each tree will be ignited with a predefined probability (e.g. 1%).\nAfter the initial ignition, the burning trees will spread fire to their neighbors: </p>\n<blockquote>\n<p>ContagionAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ContagionAgent<span class=\"token punctuation\">></span></span> <span class=\"token function\">sendContagion</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>  \n                ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> contagionAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n                    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> State<span class=\"token punctuation\">.</span>INFECTED<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n                        contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getLinks</span><span class=\"token punctuation\">(</span>Links<span class=\"token punctuation\">.</span>AgentLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>SendContagion<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t\t    contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">switchToRecovered</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t      <span class=\"token punctuation\">}</span>  \n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>After spreading the fire to its neighbors, the each tree switch their status to <code class=\"language-text\">BURNED</code> indicating that this tree won't be susceptible for catching fire in the future.\nFinally, each tree that has been ignited switches their status to <code class=\"language-text\">BURNING</code>: </p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ContagionAgent<span class=\"token punctuation\">></span></span> <span class=\"token function\">receiveContagion</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>  \n                ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> contagionAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span>  \n                    contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>ForestFire<span class=\"token punctuation\">.</span>Messages<span class=\"token punctuation\">.</span>SendContagion<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>msg <span class=\"token operator\">-</span><span class=\"token operator\">></span>  \n                        contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">switchToInfected</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>In this implementation, the transmission of fire is deterministic (i.e. every neighbor of a burning tree will catch fire), however, it would be easy to include a more sophisticated mechanism here for transmission (e.g. a probabilistic function). </p>\n<h2 id=\"visualizing-the-output-in-the-console\"><a href=\"#visualizing-the-output-in-the-console\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Visualizing the output in the console</h2>\n<p>The model can be easily visualized in the console. Going to the Network view and stepping through the ticks will show you how the fire spreads through the network. This is a very simple way of sense checking whether the model behaves in predicted ways.\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-0822f.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block; padding: 20px; max-width: 690px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 57.1945701357466%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABLklEQVQoz42R2U7DMBBF8w2QfXGcNDQVyyO/gdQkdpoKoQr4AP7/5TJ2nK20KQ9XM96O78xYRSmxexQoygbZrkW0EXCYgJsKeLyFl7VmLbXm+SVZQSYR5RIhxYAee7x/5FMe5B3poMHDJ456uAK11EXbyDHys4MG+fkUXQ2VI/SaU2ta9BcuwZTzhAtErFlAV4FTmRNsyNW+x/aIuCmbTQZWgSoGC1hn8o762NB5dRt4PkE1lMFhTIMKudRAn6thNKZU8Z8ezqF96UFaa1ceF+bsurPLDkcouSKoz5WTagaTf4Zx7tTqN2vYCbmh6Izqe6aAOjf7yzu1hthJg7toj/u4JofRG9LyE/HmHW5CzWdHUjfTcZG7FMP8A+n2C2z7DS+pUDyd8PL6g4fnE34BKaJUf1AggcIAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <picture>\n        <source\n          srcset=\"/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-8e416.webp 173w,\n/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-0b506.webp 345w,\n/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-58be5.webp 690w,\n/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-59b8d.webp 1035w,\n/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-c44df.webp 1105w\"\n          sizes=\"(max-width: 690px) 100vw, 690px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-7e3fa.png 173w,\n/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-7f1d4.png 345w,\n/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-13856.png 690w,\n/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-045bb.png 1035w,\n/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-0822f.png 1105w\"\n          sizes=\"(max-width: 690px) 100vw, 690px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n          src=\"/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-13856.png\"\n          alt=\"console forestFire\"\n          title=\"\"\n          src=\"/static/console_forestFire-493251024a5615ebc73eb620dbcde5ee-13856.png\"\n        />\n      </picture>\n      </span>\n  </span>\n  \n  </a>\n    </p>\n<p>This is an easy and convenient way of looking at the model output. </p>\n<h2 id=\"data-output\"><a href=\"#data-output\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Data output</h2>\n<p>While it is convenient to look at the model output in the console, this is less flexible and does not allow further, more sophisticated, analysis of the model output. Therefore, it can often been useful to output the data and pull it into some analysis tool (e.g. a Jupyer Notebook) to visualize the data and conduct further analysis. </p>\n<p>In order to save and output data, we will use the build-in parquet writers. This will also provide us with an opportunity to illustrate how these data output channels work. </p>\n<p>First, we need to initialize the output channels, in the init() function, basically defining a channel to utilize the built-in functions. For this purpose, a schema needs to be defined, illustrating the kind of data that will be used as output in this channel:  </p>\n<blockquote>\n<p>ForestFireModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token punctuation\">.</span><span class=\"token function\">getChannels</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token punctuation\">.</span><span class=\"token function\">createOutputChannel</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token punctuation\">.</span><span class=\"token function\">setId</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"contagion_output\"</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token punctuation\">.</span><span class=\"token function\">setSchema</span><span class=\"token punctuation\">(</span>Monitor<span class=\"token punctuation\">.</span><span class=\"token function\">getMonitorSchema</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token punctuation\">.</span><span class=\"token function\">addLabel</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"simudyne:parquet\"</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">setId()</code>  -> A unique string used to identify the data channel. </li>\n<li><code class=\"language-text\">setSchema()</code>  -> The schema defines the type of data you will be exporting with this channel. </li>\n</ul>\n<p>In the following we will showcase how to define a schema. Here we create a separate class called <code class=\"language-text\">Monitor</code> to define the schema. For our purposes we aim to export each agents <code class=\"language-text\">ID</code> and their <code class=\"language-text\">State</code>: </p>\n<blockquote>\n<p>Monitor.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">        <span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Monitor</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">public</span> <span class=\"token keyword\">long</span> agentID<span class=\"token punctuation\">;</span>  \n        <span class=\"token keyword\">public</span> State state<span class=\"token punctuation\">;</span> \n        \n        <span class=\"token keyword\">public</span> <span class=\"token function\">Monitor</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span> agentID<span class=\"token punctuation\">,</span> State state<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>agentID <span class=\"token operator\">=</span> agentID<span class=\"token punctuation\">;</span>  \n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> state<span class=\"token punctuation\">;</span>  \n       <span class=\"token punctuation\">}</span>\n       <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> SchemaRecord <span class=\"token function\">getMonitorSchema</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n                <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaRecord</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"monitor\"</span><span class=\"token punctuation\">)</span>  \n                        <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"agentID\"</span><span class=\"token punctuation\">,</span> FieldType<span class=\"token punctuation\">.</span>Long<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  \n                        <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaEnum</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"agent_status\"</span><span class=\"token punctuation\">,</span> Arrays<span class=\"token punctuation\">.</span><span class=\"token function\">asList</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"EMPTY\"</span><span class=\"token punctuation\">,</span>  \n          <span class=\"token string\">\"HEALTHY\"</span><span class=\"token punctuation\">,</span>  \n          <span class=\"token string\">\"INFECTED\"</span><span class=\"token punctuation\">,</span>  \n          <span class=\"token string\">\"RESISTANT\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n          <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">public</span> ValueRecord <span class=\"token function\">getMonitorValue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    \t\t    <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ValueRecord</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"monitor\"</span><span class=\"token punctuation\">)</span>  \n    \t            <span class=\"token punctuation\">.</span><span class=\"token function\">addField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"agentID\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>agentID<span class=\"token punctuation\">)</span>  \n    \t\t           <span class=\"token punctuation\">.</span><span class=\"token function\">addField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"agent_status\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    \t\t           <span class=\"token punctuation\">}</span>\n       <span class=\"token punctuation\">}</span></code></pre></div>\n<p>In the function getMonitorSchema() a general schema is set-up, which is used in the initialization of the model. In comparison, getMonitorValue() is used to actually assign data to the schema. </p>\n<p>Finally, the schema data needs to be written to the output channel. In this example, each agent assigns its state to the channel with the following action: </p>\n<blockquote>\n<p>ContagionAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ContagionAgent<span class=\"token punctuation\">></span></span> <span class=\"token function\">writeData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>  \n                ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> contagionAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n                    Monitor agentMonitor <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Monitor</span><span class=\"token punctuation\">(</span>contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getID</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> contagionAgent<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    ValueRecord agentOutput <span class=\"token operator\">=</span> agentMonitor<span class=\"token punctuation\">.</span><span class=\"token function\">getMonitorValue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    contagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getChannels</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getOutputChannelWriterById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"contagion_output\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span>agentOutput<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>Here, the agents <code class=\"language-text\">ID</code> and <code class=\"language-text\">State</code> are translated into the schema format and then written to the data channel. </p>\n<p>Through calling the writeData() function on each tick, the data for each agent and each tick is appended to the parquet file. </p>\n<blockquote>\n<p>ForestFireModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">        <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">step</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n            <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">step</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n    \n            <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>ContagionAgent<span class=\"token punctuation\">.</span><span class=\"token function\">writeData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"analyzing-data-output-in-jupyter-notebook\"><a href=\"#analyzing-data-output-in-jupyter-notebook\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Analyzing data output in Jupyter Notebook</h2>\n<p>After having created a data output as parquet file, it is easy to load the data into any preferred data analysis tool. Here, we will use a Jupyter Notebook. The parquet file can easily be imported and read into a pandas data frame, using <code class=\"language-text\">pd.read_parquet()</code>. This will lead to a data table with a row for each agent at each tick. This data can then be transformed back into a grid format and animated with <code class=\"language-text\">Matplotlib</code>: </p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">    <span class=\"token keyword\">import</span> pandas <span class=\"token keyword\">as</span> pd\n    <span class=\"token keyword\">import</span> pyarrow\n    <span class=\"token keyword\">import</span> numpy <span class=\"token keyword\">as</span> np\n    <span class=\"token keyword\">import</span> math\n    <span class=\"token keyword\">import</span> matplotlib<span class=\"token punctuation\">.</span>pyplot <span class=\"token keyword\">as</span> plt\n    <span class=\"token keyword\">import</span> matplotlib\n    <span class=\"token keyword\">from</span> IPython<span class=\"token punctuation\">.</span>display <span class=\"token keyword\">import</span> HTML\n    <span class=\"token keyword\">import</span> matplotlib<span class=\"token punctuation\">.</span>patches <span class=\"token keyword\">as</span> mpatches\n    <span class=\"token keyword\">import</span> matplotlib<span class=\"token punctuation\">.</span>animation <span class=\"token keyword\">as</span> animation\n        \n    data <span class=\"token operator\">=</span> pd<span class=\"token punctuation\">.</span>read_parquet<span class=\"token punctuation\">(</span>r<span class=\"token string\">\"C:\\Users\\mrollwage_smd\\OneDrive - Simudyne Limited\\Documents\\Python Scripts\\ForestFireModel_Analyse\\run000000000.parquet\"</span><span class=\"token punctuation\">)</span>\n    ticks<span class=\"token operator\">=</span> data<span class=\"token punctuation\">[</span><span class=\"token string\">'tick'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>iloc<span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n    data_timepointZero<span class=\"token operator\">=</span> data<span class=\"token punctuation\">[</span>data<span class=\"token punctuation\">[</span><span class=\"token string\">'tick'</span><span class=\"token punctuation\">]</span><span class=\"token operator\">==</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n    dimensions<span class=\"token operator\">=</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>math<span class=\"token punctuation\">.</span>sqrt<span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>data_timepointZero<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    timePointGrid_full<span class=\"token operator\">=</span>np<span class=\"token punctuation\">.</span>array<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span> <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>dimensions<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>dimensions<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>ticks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">for</span> tick <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> ticks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> \n        data_timepoint<span class=\"token operator\">=</span> data<span class=\"token punctuation\">[</span>data<span class=\"token punctuation\">[</span><span class=\"token string\">'tick'</span><span class=\"token punctuation\">]</span><span class=\"token operator\">==</span>tick<span class=\"token punctuation\">]</span>\n        timePointGrid<span class=\"token operator\">=</span>np<span class=\"token punctuation\">.</span>array<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span> <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>dimensions<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>dimensions<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">for</span> cell <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>data_timepoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> \n        row <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>data_timepoint<span class=\"token punctuation\">[</span><span class=\"token string\">'agentID'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>iloc<span class=\"token punctuation\">[</span>cell<span class=\"token punctuation\">]</span><span class=\"token operator\">%</span>dimensions<span class=\"token punctuation\">)</span>\n            column <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>data_timepoint<span class=\"token punctuation\">[</span><span class=\"token string\">'agentID'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>iloc<span class=\"token punctuation\">[</span>cell<span class=\"token punctuation\">]</span><span class=\"token operator\">/</span>dimensions<span class=\"token punctuation\">)</span>\n            value<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token number\">99</span>\n            <span class=\"token keyword\">if</span> data_timepoint<span class=\"token punctuation\">[</span><span class=\"token string\">'agent_status'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>iloc<span class=\"token punctuation\">[</span>cell<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> b<span class=\"token string\">'EMPTY'</span><span class=\"token punctuation\">:</span> \n                value<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token number\">1</span>\n            <span class=\"token keyword\">elif</span> data_timepoint<span class=\"token punctuation\">[</span><span class=\"token string\">'agent_status'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>iloc<span class=\"token punctuation\">[</span>cell<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> b<span class=\"token string\">'HEALTHY'</span><span class=\"token punctuation\">:</span> \n                    value <span class=\"token operator\">=</span><span class=\"token number\">0</span>\n            <span class=\"token keyword\">elif</span> data_timepoint<span class=\"token punctuation\">[</span><span class=\"token string\">'agent_status'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>iloc<span class=\"token punctuation\">[</span>cell<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> b<span class=\"token string\">'INFECTED'</span><span class=\"token punctuation\">:</span> \n                    value <span class=\"token operator\">=</span><span class=\"token number\">1</span>\n            <span class=\"token keyword\">elif</span> data_timepoint<span class=\"token punctuation\">[</span><span class=\"token string\">'agent_status'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>iloc<span class=\"token punctuation\">[</span>cell<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> b<span class=\"token string\">'RESISTANT'</span><span class=\"token punctuation\">:</span> \n                    value <span class=\"token operator\">=</span><span class=\"token number\">2</span>\n            timePointGrid<span class=\"token punctuation\">[</span>column<span class=\"token punctuation\">,</span> row<span class=\"token punctuation\">]</span><span class=\"token operator\">=</span>value\n            timePointGrid_full<span class=\"token punctuation\">[</span>tick<span class=\"token punctuation\">,</span> column<span class=\"token punctuation\">,</span> row<span class=\"token punctuation\">]</span><span class=\"token operator\">=</span>value\n\n\n    dim1<span class=\"token operator\">=</span>timePointGrid_full<span class=\"token punctuation\">.</span>shape\n    values <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>unique<span class=\"token punctuation\">(</span>timePointGrid_full<span class=\"token punctuation\">.</span>ravel<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>values<span class=\"token punctuation\">)</span>\n    fig<span class=\"token operator\">=</span>plt<span class=\"token punctuation\">.</span>figure<span class=\"token punctuation\">(</span>figsize<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    cmap <span class=\"token operator\">=</span> matplotlib<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">.</span>ListedColormap<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'lightgrey'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'green'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'red'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'black'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    grid <span class=\"token operator\">=</span>plt<span class=\"token punctuation\">.</span>imshow<span class=\"token punctuation\">(</span>timePointGrid_full<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> cmap<span class=\"token operator\">=</span>cmap<span class=\"token punctuation\">,</span> interpolation<span class=\"token operator\">=</span><span class=\"token string\">'none'</span><span class=\"token punctuation\">)</span>\n    colors <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>grid<span class=\"token punctuation\">.</span>cmap<span class=\"token punctuation\">(</span>grid<span class=\"token punctuation\">.</span>norm<span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> value <span class=\"token keyword\">in</span> values<span class=\"token punctuation\">]</span>\n    patches <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>mpatches<span class=\"token punctuation\">.</span>Patch<span class=\"token punctuation\">(</span>color<span class=\"token operator\">=</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token string\">\"empty\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> mpatches<span class=\"token punctuation\">.</span>Patch<span class=\"token punctuation\">(</span>color<span class=\"token operator\">=</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token string\">\"healthy\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">,</span> mpatches<span class=\"token punctuation\">.</span>Patch<span class=\"token punctuation\">(</span>color<span class=\"token operator\">=</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token string\">\"burning\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> mpatches<span class=\"token punctuation\">.</span>Patch<span class=\"token punctuation\">(</span>color<span class=\"token operator\">=</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token string\">\"burned\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    plt<span class=\"token punctuation\">.</span>legend<span class=\"token punctuation\">(</span>handles<span class=\"token operator\">=</span>patches<span class=\"token punctuation\">,</span> bbox_to_anchor<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n              ncol<span class=\"token operator\">=</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> fancybox<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span> shadow<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    plt<span class=\"token punctuation\">.</span>grid<span class=\"token punctuation\">(</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    plt<span class=\"token punctuation\">.</span>axis<span class=\"token punctuation\">(</span><span class=\"token string\">'off'</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">animate_noise</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        grid<span class=\"token punctuation\">.</span>set_array<span class=\"token punctuation\">(</span>timePointGrid_full<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">,</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span>grid<span class=\"token punctuation\">]</span>\n    anim <span class=\"token operator\">=</span> animation<span class=\"token punctuation\">.</span>FuncAnimation<span class=\"token punctuation\">(</span>fig<span class=\"token punctuation\">,</span> animate_noise<span class=\"token punctuation\">,</span> frames<span class=\"token operator\">=</span>dim1<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> interval<span class=\"token operator\">=</span><span class=\"token number\">500</span><span class=\"token punctuation\">,</span> blit<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    plt<span class=\"token punctuation\">.</span>close<span class=\"token punctuation\">(</span>fig<span class=\"token punctuation\">)</span>\n    \n    HTML<span class=\"token punctuation\">(</span>anim<span class=\"token punctuation\">.</span>to_html5_video<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<div>\n   <video width=\"700\" height=\"450\" controls=\"controls\" poster=\"image\" preload=\"true\">\n     <source src=\"https://simudynecontent.blob.core.windows.net/$web/tutorials/animation_forestFire.mp4\" type=\"video/mp4\" />\n     Your browser does not support the video tag.\n   </video>\n</div>\n<h2 id=\"summary\"><a href=\"#summary\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>In this tutorial we have walked through an implementation of the forest fire model. Besides the specific topic of the model, this can be used as template for modelling contagion in a system, enabling multiple applications.\nBesides the specific model, we also illustrated how to create customized connectors to create flexible rules for forming connections between agents. Moreover, we also showcased how to export data using the parquet writers and import this data into a Jupyter Notebook for further analysis and visualization. </p>","headings":[{"value":"Model overview","depth":2},{"value":"Summary of the model implementation","depth":2},{"value":"Globals","depth":2},{"value":"Connectors and agent neighborhoods","depth":2},{"value":"Moore Neighborhood","depth":3},{"value":"Von Neumann Neighborhood","depth":3},{"value":"Customized connector","depth":3},{"value":"Attributes defining similarity","depth":4},{"value":"Start with a fully connected network","depth":4},{"value":"Prune the network","depth":4},{"value":"Spreading contagion","depth":2},{"value":"Visualizing the output in the console","depth":2},{"value":"Data output","depth":2},{"value":"Analyzing data output in Jupyter Notebook","depth":2},{"value":"Summary","depth":2}],"frontmatter":{"title":"Forest Fire Tutorial","toc":true,"experimental":null}},"site":{"siteMetadata":{"title":"Simudyne Docs","latestVersion":"2.6"}}},"pageContext":{"absolutePath":"/home/vsts/work/1/s/content/2.4/docs/tutorials/forestfire.md","versioned":true,"version":"2.4","kind":"docs","pagePath":"/tutorials/forestfire","chronology":{"prev":{"name":"SIR Epidemiology Tutorial","path":"/tutorials/sir"},"next":{"name":"Chiarella Calibration Tutorial","path":"/tutorials/extended_chiarella"}},"lastUpdated":"2026-04-21T13:56:54.849Z"}}