{"data":{"markdownRemark":{"html":"<p>This page explains some of the caveats inherent to distributed models.</p>\n<h2 id=\"serializable-messages\"><a href=\"#serializable-messages\" 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>Serializable Messages</h2>\n<p>Because messages will be passed across the network, they need to be serializable. This leads to some restrictions like the use of java <code class=\"language-text\">Optional</code>.\nIf you need to use them, you will need to copy the source in order to be able to make it implement <code class=\"language-text\">Serializable</code>. Here is an example with java <code class=\"language-text\">OptionalDouble</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\">class</span> <span class=\"token class-name\">OptDouble</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Serializable</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> OptDouble EMPTY <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">OptDouble</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">boolean</span> isPresent<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">double</span> value<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">private</span> <span class=\"token function\">OptDouble</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    isPresent <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>value <span class=\"token operator\">=</span> Double<span class=\"token punctuation\">.</span>NaN<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">private</span> <span class=\"token function\">OptDouble</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">double</span> value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isPresent <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>value <span class=\"token operator\">=</span> value<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> OptDouble <span class=\"token function\">of</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">double</span> input<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\">OptDouble</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> OptDouble <span class=\"token function\">empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> EMPTY<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">double</span> <span class=\"token function\">getAsDouble</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>isPresent<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">NoSuchElementException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"No value present\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> value<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> isPresent<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@Override</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">hashCode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> isPresent <span class=\"token operator\">?</span> Double<span class=\"token punctuation\">.</span><span class=\"token function\">hashCode</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token annotation punctuation\">@Override</span>\n  <span class=\"token keyword\">public</span> String <span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> isPresent <span class=\"token operator\">?</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"OptDouble[%s]\"</span><span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"OptDouble.empty\"</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"prevent-passing-of-reference\"><a href=\"#prevent-passing-of-reference\" 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>Prevent Passing Of Reference</h2>\n<p>When running in a distributed fashion, any agent can be anywhere in the environment. Consequently, passing agents around will create errors.\nIf your programs shows lots of <code class=\"language-text\">java.io.NotSerializableException</code> errors, these are probably caused by improper use of the java keyword <code class=\"language-text\">this</code>.\nThe correct way to handle any sharing of data is to send messages.</p>\n<p>For example you need to prevent passing reference when initializing Agents.\nThis is an example of a incorrect piece of code, and its correction: </p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// will throw a serialization error, Model reference is passed</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Model</span> <span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">int</span> field <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</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>SomeAgent<span class=\"token punctuation\">></span></span> someAgentGroup <span class=\"token operator\">=</span>\n          <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>SomeAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> count<span class=\"token punctuation\">,</span> \n              agent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span> agent<span class=\"token punctuation\">.</span>field <span class=\"token operator\">=</span> field<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 punctuation\">}</span>\n\n<span class=\"token comment\">// a single value is passed, not the model reference</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Model</span> <span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">int</span> field <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</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 keyword\">int</span> localField <span class=\"token operator\">=</span> field<span class=\"token punctuation\">;</span>\n  Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SomeAgent<span class=\"token punctuation\">></span></span> someAgentGroup <span class=\"token operator\">=</span>\n          <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>SomeAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> count<span class=\"token punctuation\">,</span> \n              agent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span> agent<span class=\"token punctuation\">.</span>field <span class=\"token operator\">=</span> localField<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 punctuation\">}</span></code></pre></div>\n<p> The difference in the example above is that the <code class=\"language-text\">field</code> variable in the first Model is in fact <code class=\"language-text\">this.field</code>, <code class=\"language-text\">this</code> being the Model. <code class=\"language-text\">this</code> will pass the entire model to the function and tries to serialize it.\nThe second Model avoids this by copying the needed variable to a local value in the Model#setup function.</p>\n<p> This also can happen when using a function instead of variables:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>RandomAgent<span class=\"token punctuation\">></span></span> randomAgentGroup <span class=\"token operator\">=</span>\n       <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>RandomAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> count<span class=\"token punctuation\">,</span> \n           agent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n             SeededRandom prng <span class=\"token operator\">=</span> agent<span class=\"token punctuation\">.</span><span class=\"token function\">getPrng</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n             agent<span class=\"token punctuation\">.</span>random <span class=\"token operator\">=</span> <span class=\"token function\">getRandomSample</span><span class=\"token punctuation\">(</span>prng<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n           <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// will throw an error</span>\n<span class=\"token keyword\">double</span> <span class=\"token function\">getRandomSample</span><span class=\"token punctuation\">(</span>SeededRandom prng<span class=\"token punctuation\">,</span> <span class=\"token keyword\">double</span> min<span class=\"token punctuation\">,</span> <span class=\"token keyword\">double</span> max<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token keyword\">return</span> prng<span class=\"token punctuation\">.</span><span class=\"token function\">uniform</span><span class=\"token punctuation\">(</span>min<span class=\"token punctuation\">,</span> max<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sample</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// will behave as expected</span>\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">double</span> <span class=\"token function\">getRandomSample</span><span class=\"token punctuation\">(</span>SeededRandom prng<span class=\"token punctuation\">,</span> <span class=\"token keyword\">double</span> min<span class=\"token punctuation\">,</span> <span class=\"token keyword\">double</span> max<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token keyword\">return</span> prng<span class=\"token punctuation\">.</span><span class=\"token function\">uniform</span><span class=\"token punctuation\">(</span>min<span class=\"token punctuation\">,</span> max<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sample</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>Because the non-static method is part of the class, it will force the system to serialize the entire Model in order to be able to access this function.\nIf the method is static, it does not depend on an instance of the Model and can be called safely from a distributed environment.</p>\n<h2 id=\"immutability-of-globalstate\"><a href=\"#immutability-of-globalstate\" 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>Immutability of GlobalState</h2>\n<p><a href=\":version//reference/models/model-interface#introducing-the-agent-based-flavour\">Agent-Based Model</a> contains a GlobalState that allows you to make global variables available to all agents.\nAt their creation, usually at Model#Setup(), agents are distributed and given a copy of the GlobalState.\nAfter this distribution, the global state should not be updated. There is currently no consistency mechanism to ensure updates on GlobalState are carried over the network.\nConsequently, all GlobalStates' update should be done at the beginning (or before) the Model#setup call, to ensure the consistency of the model across all nodes.</p>","headings":[{"value":"Serializable Messages","depth":2},{"value":"Prevent Passing Of Reference","depth":2},{"value":"Immutability of GlobalState","depth":2}],"frontmatter":{"title":"Distributed Requirements","toc":null,"experimental":null}},"site":{"siteMetadata":{"title":"Simudyne Docs","latestVersion":"2.6"}}},"pageContext":{"absolutePath":"/home/vsts/work/1/s/content/2.4/reference/distributed_computation/distributed_requirements.md","versioned":true,"version":"2.4","kind":"reference","pagePath":"/reference/distributed_computation/distributed_requirements","chronology":{"prev":{"name":"Distributed Graph","path":"/reference/distributed_computation/distributed_graph"},"next":{"name":"System Dynamics","path":"/reference/system_dynamics"}},"lastUpdated":"2026-04-21T13:56:54.852Z"}}