{"data":{"markdownRemark":{"html":"<h3 id=\"the-curse-of-fullyconnected-groups\"><a href=\"#the-curse-of-fullyconnected-groups\" 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>The curse of FullyConnected Groups</h3>\n<p>When connecting two <code class=\"language-text\">Groups</code> together, <code class=\"language-text\">FullyConnected</code> is generally the canonical choice as it gives the flexibility of having each agent from the source Group know each agent in the target Group.</p>\n<p>This is fine for local models where the number of agents is generally small (less than 1 million agents) but when it comes time to scale your model up, you may encounter some critical slow downs.</p>\n<p>This is due to the fact that the number of links increases fast compared to the number of agents.</p>\n<p>If the size of your <strong>source</strong> <code class=\"language-text\">Group</code> and <strong>target</strong> <code class=\"language-text\">Group</code> are respectively <code class=\"language-text\">n</code> and <code class=\"language-text\">m</code>, the number of link to create is exactly <code class=\"language-text\">n * m</code>:</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-00744.jpg\"\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: 185px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 62.686567164179095%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAQAF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB3FBmP//EABcQAQEBAQAAAAAAAAAAAAAAAAABERD/2gAIAQEAAQUCYis5/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFhAAAwAAAAAAAAAAAAAAAAAAECAx/9oACAEBAAY/Ako//8QAGhABAAIDAQAAAAAAAAAAAAAAAQARECExkf/aAAgBAQABPyEt6JHTV+y1cgXjUFeH/9oADAMBAAIAAwAAABDIz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/EKf/xAAdEAEAAgICAwAAAAAAAAAAAAABABExURAhQZHB/9oACAEBAAE/ECiCbs+ShKboy9x5Gd+UlLbAi2TXH//Z'); background-size: cover; display: block;\"\n    >\n      <picture>\n        <source\n          srcset=\"/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-ce22b.webp 173w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-bff2f.webp 345w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-de659.webp 690w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-3ae97.webp 1035w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-99bac.webp 1380w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-6d7fd.webp 1541w\"\n          sizes=\"(max-width: 185px) 100vw, 185px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-37254.jpg 173w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-a398f.jpg 345w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-78fd1.jpg 690w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-9a571.jpg 1035w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-0a0cd.jpg 1380w,\n/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-00744.jpg 1541w\"\n          sizes=\"(max-width: 185px) 100vw, 185px\"\n          type=\"image/jpeg\"\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/coordinator_1-897c3ccd22c146b12463e4d37765de13-78fd1.jpg\"\n          alt=\"coordinator 1\"\n          title=\"\"\n          src=\"/static/coordinator_1-897c3ccd22c146b12463e4d37765de13-78fd1.jpg\"\n        />\n      </picture>\n      </span>\n  </span>\n  \n  </a>\n    </p>\n<h3 id=\"sneaking-one-group-between-the-source-and-the-target\"><a href=\"#sneaking-one-group-between-the-source-and-the-target\" 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>Sneaking one Group between the Source and the Target</h3>\n<p>One way to shrink down the number of links is to introduce an extra group between the <strong>source</strong> <code class=\"language-text\">Group</code> and the <strong>target</strong> <code class=\"language-text\">Group</code> of a smaller size. Its agents will be dedicated to transfer the messages from the source to the target, possibly aggregating them together. Those agents are called <code class=\"language-text\">Coordinators</code>.</p>\n<p>If <code class=\"language-text\">p</code> is the size of the <code class=\"language-text\">Coordinators</code> ' <code class=\"language-text\">Group</code>; then the number of link is equal to <code class=\"language-text\">p * m + n</code>.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/coordinator_2-a87b572cc7e983732f77f44713953333-bb54e.jpg\"\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: 309px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 36.247086247086244%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAHABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB3pCgf//EABcQAAMBAAAAAAAAAAAAAAAAAAABEBH/2gAIAQEAAQUCwU//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAQ/9oACAEBAAY/An//xAAZEAACAwEAAAAAAAAAAAAAAAAAESExQWH/2gAIAQEAAT8h1paWLp//2gAMAwEAAgADAAAAEHAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8Qqv/EABoQAQEBAAMBAAAAAAAAAAAAAAERACFhccH/2gAIAQEAAT8QQCeXmFgR3MMvxv/Z'); background-size: cover; display: block;\"\n    >\n      <picture>\n        <source\n          srcset=\"/static/coordinator_2-a87b572cc7e983732f77f44713953333-a985a.webp 173w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-b39b7.webp 345w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-44dac.webp 690w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-0ae2a.webp 1035w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-6d9a5.webp 1380w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-40279.webp 2070w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-2d8a5.webp 2574w\"\n          sizes=\"(max-width: 309px) 100vw, 309px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/coordinator_2-a87b572cc7e983732f77f44713953333-0d8df.jpg 173w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-44a34.jpg 345w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-dab8f.jpg 690w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-6d2c4.jpg 1035w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-16d4c.jpg 1380w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-e8e06.jpg 2070w,\n/static/coordinator_2-a87b572cc7e983732f77f44713953333-bb54e.jpg 2574w\"\n          sizes=\"(max-width: 309px) 100vw, 309px\"\n          type=\"image/jpeg\"\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/coordinator_2-a87b572cc7e983732f77f44713953333-dab8f.jpg\"\n          alt=\"coordinator 2\"\n          title=\"\"\n          src=\"/static/coordinator_2-a87b572cc7e983732f77f44713953333-dab8f.jpg\"\n        />\n      </picture>\n      </span>\n  </span>\n  \n  </a>\n    </p>\n<p>To give you an brief idea of the number of links for each situations, here are some results for a small number of agents.</p>\n<table class=\"ui celled table\">\n  <thead>\n    <tr>\n      <th>n</th>\n      <th>m</th>\n      <th># of links w/o Coordinators</th>\n      <th># of links with Coordinators with <br> p = log(n * m)</th>\n      <th>proportion of links avoided</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>10</td>\n      <td>100</td>\n      <td>1000</td>\n      <td>310</td>\n      <td>69.0 %</td>\n    </tr>\n    <tr>\n      <td>200</td>\n      <td>100</td>\n      <td>20000</td>\n      <td>630</td>\n      <td>96.8 %</td>\n    </tr>\n    <tr>\n      <td>1000</td>\n      <td>200</td>\n      <td>200000</td>\n      <td>2060</td>\n      <td>98.9 %</td>\n    </tr>\n    <tr>\n      <td>200</td>\n      <td>1000</td>\n      <td>200000</td>\n      <td>5501</td>\n      <td>97.2 %</td>\n    </tr>\n    <tr>\n      <td>10000</td>\n      <td>1000</td>\n      <td>10000000</td>\n      <td>17000</td>\n      <td>99.8 %</td>\n    </tr>\n  </tbody>\n</table>\nLet's now see how this transcribes the model.\n<h3 id=\"changing-your-model-logic-to-use-coordinators\"><a href=\"#changing-your-model-logic-to-use-coordinators\" 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>Changing your model logic to use Coordinators</h3>\n<p>Let's say that you start with a model like this:</p>\n<p class=\"code-header\">Naive implementation (Java)</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\">CoordinatorPatternExample</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AgentBasedModel</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// Number of agents for each group</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> n <span class=\"token operator\">=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> m <span class=\"token operator\">=</span> <span class=\"token number\">10000</span><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\">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>SourceAgent<span class=\"token punctuation\">></span></span> sourceGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>TargetAgent<span class=\"token punctuation\">></span></span> targetGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        sourceGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>targetGroup<span class=\"token punctuation\">,</span> BlankLink<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 keyword\">super</span><span class=\"token punctuation\">.</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 punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>With those agents and this message minimally defined like so :</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\">SourceAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TargetAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> totalAmount<span class=\"token punctuation\">,</span> List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs<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>We definitively in the first case described by the first figure.</p>\n<p>Let's say the behaviour of the model is defined as a sequence with <code class=\"language-text\">SourceAgents</code> sending a message to the <code class=\"language-text\">TargetAgents</code>:</p>\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\">step</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>\n    Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> sAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n      sAgent<span class=\"token punctuation\">.</span><span class=\"token function\">broadcastMessage</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</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    Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> tAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n          List<span class=\"token operator\">&lt;</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span><span class=\"token operator\">></span> aggregatedTransfers <span class=\"token operator\">=</span>\n            tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>AggregatedTransfer<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n          List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs <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\">int</span> totalAmount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n          <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span> message <span class=\"token operator\">:</span> aggregatedTransfers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            sourceAgentIDs<span class=\"token punctuation\">.</span><span class=\"token function\">addAll</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>sourceAgents<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            totalAmount <span class=\"token operator\">=</span> <span class=\"token operator\">+</span>message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>amount<span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n\n          tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span>totalAmount<span class=\"token punctuation\">,</span> sourceAgentIDs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>At each tick, each <code class=\"language-text\">SourceAgent</code> sends a transfer message to all the the<code class=\"language-text\">TargetAgents</code>. Those latter agents can then <code class=\"language-text\">doSomething</code> with it then.</p>\n<p>Here you can convert your model to use <code class=\"language-text\">Coordinators</code> between the <code class=\"language-text\">SourceAgents</code> and the <code class=\"language-text\">TargetAgents</code> as shown on the second figure.</p>\n<p>You will also need another type of message, <code class=\"language-text\">AggregatedTransfer</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\">SourceAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TargetAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Coordinator</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AggregatedTransfer</span><span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> amount<span class=\"token punctuation\">;</span>\n  List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgents<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">public</span> <span class=\"token function\">AggregatedTransfer</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> amount<span class=\"token punctuation\">,</span> List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgents<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>amount <span class=\"token operator\">=</span> amount<span class=\"token punctuation\">;</span>\n     <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sourceAgents <span class=\"token operator\">=</span> sourceAgents<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Essentially, the <code class=\"language-text\">Coordinators</code> will gather the <code class=\"language-text\">Transfers</code> sent by their <code class=\"language-text\">SourceAgents</code> and will remap them to all the <code class=\"language-text\">TargetAgents</code>.</p>\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\">step</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>\n      Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> sAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> sAgent<span class=\"token punctuation\">.</span><span class=\"token function\">broadcastMessage</span><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>\n\n      Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Coordinator<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> coordinator <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n        List<span class=\"token operator\">&lt;</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span><span class=\"token operator\">></span> transfers <span class=\"token operator\">=</span>\n          coordinator<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>AggregatedTransfer<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs <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\">int</span> totalAmount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span> message <span class=\"token operator\">:</span> transfers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          sourceAgentIDs<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>message<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          totalAmount <span class=\"token operator\">+=</span> message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>amount<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        coordinator<span class=\"token punctuation\">.</span><span class=\"token function\">broadcastMessage</span><span class=\"token punctuation\">(</span>\n          <span class=\"token keyword\">new</span> <span class=\"token class-name\">AggregatedTransfer</span><span class=\"token punctuation\">(</span>totalAmount<span class=\"token punctuation\">,</span> sourceAgentIDs<span class=\"token punctuation\">)</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      Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> tAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n        List<span class=\"token operator\">&lt;</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span><span class=\"token operator\">></span> aggregatedTransfers <span class=\"token operator\">=</span>\n          tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>AggregatedTransfer<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs <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\">int</span> totalAmount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span> message <span class=\"token operator\">:</span> aggregatedTransfers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          sourceAgentIDs<span class=\"token punctuation\">.</span><span class=\"token function\">addAll</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>sourceAgents<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          totalAmount <span class=\"token operator\">=</span> <span class=\"token operator\">+</span>message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>amount<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span>totalAmount<span class=\"token punctuation\">,</span> sourceAgentIDs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"ui segment info message\">\n<h4>Modification of actions of initial agents</h4>\nHere you will see that you need to change the actions of the `TargetAgents` slightly to use this pattern.\n</div>\nYou can easily change the topologies of your model introducing two new lines and modify the `Connectors` to include the `Coordinators` :\n<p class=\"code-header\">Creating a coordinator group(Java)</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\">int</span> p <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\">log</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">*</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Coordinator<span class=\"token punctuation\">></span></span> coordinators <span class=\"token operator\">=</span> system<span class=\"token punctuation\">.</span><span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>Coordinator<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nsourceGroup<span class=\"token punctuation\">.</span><span class=\"token function\">partitionConnected</span><span class=\"token punctuation\">(</span>coordinators<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ncoordinators<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>targetGroup<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>We introduce <code class=\"language-text\">p</code> to represent the number of <code class=\"language-text\">Coordinators</code> to create.</p>\n<div class=\"ui segment info message\">\n<h4>About the definition of p</h4>\nWe set `p` to be a logarithmic expression of the number of agents, this is a good tradeoff between not having a high number of links and not having a bottle neck at the `Coordinators` level. You can change it at will.\n</div>\nAt the end you end up having this file here:\n<p class=\"code-header\">Coordinator pattern (Java)</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">import</span> simudyne<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>abm<span class=\"token punctuation\">.</span>Agent<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> simudyne<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>abm<span class=\"token punctuation\">.</span>AgentBasedModel<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> simudyne<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>abm<span class=\"token punctuation\">.</span>GlobalState<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> simudyne<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>abm<span class=\"token punctuation\">.</span>Group<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span>List<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">CoordinatorPatternExample</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AgentBasedModel</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token comment\">// Number of agents for each group</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> n <span class=\"token operator\">=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> m <span class=\"token operator\">=</span> <span class=\"token number\">10000</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> p <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\">log</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">*</span> m<span class=\"token punctuation\">)</span><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\">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 comment\">// Creating the groups</span>\n    Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SourceAgent<span class=\"token punctuation\">></span></span> sourceGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>TargetAgent<span class=\"token punctuation\">></span></span> targetGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Coordinatior<span class=\"token punctuation\">></span></span> coordinatiorGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>Coordinator<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    sourceGroup<span class=\"token punctuation\">.</span><span class=\"token function\">partitionConnected</span><span class=\"token punctuation\">(</span>coordinators<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    coordinators<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>targetGroup<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\">setup</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 annotation punctuation\">@Override</span>\n  <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 function\">run</span><span class=\"token punctuation\">(</span>\n      Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> sAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> sAgent<span class=\"token punctuation\">.</span><span class=\"token function\">broadcastMessage</span><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>\n\n      Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Coordinator<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> coordinator <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n        List<span class=\"token operator\">&lt;</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span><span class=\"token operator\">></span> transfers <span class=\"token operator\">=</span>\n          coordinator<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>AggregatedTransfer<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs <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\">int</span> totalAmount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span> message <span class=\"token operator\">:</span> transfers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          sourceAgentIDs<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>message<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          totalAmount <span class=\"token operator\">+=</span> message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>amount<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        coordinator<span class=\"token punctuation\">.</span><span class=\"token function\">broadcastMessage</span><span class=\"token punctuation\">(</span>\n          <span class=\"token keyword\">new</span> <span class=\"token class-name\">AggregatedTransfer</span><span class=\"token punctuation\">(</span>totalAmount<span class=\"token punctuation\">,</span> sourceAgentIDs<span class=\"token punctuation\">)</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      Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> tAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n        List<span class=\"token operator\">&lt;</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span><span class=\"token operator\">></span> aggregatedTransfers <span class=\"token operator\">=</span>\n          tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>AggregatedTransfer<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs <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\">int</span> totalAmount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>Message<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransfer<span class=\"token punctuation\">></span></span> message <span class=\"token operator\">:</span> aggregatedTransfers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          sourceAgentIDs<span class=\"token punctuation\">.</span><span class=\"token function\">addAll</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>sourceAgents<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          totalAmount <span class=\"token operator\">=</span> <span class=\"token operator\">+</span>message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>amount<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span>totalAmount<span class=\"token punctuation\">,</span> sourceAgentIDs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <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<h3 id=\"using-partitionconnectedweave\"><a href=\"#using-partitionconnectedweave\" 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>Using PartitionConnected#weave()</h3>\n<p>If you have a look more closely at <code class=\"language-text\">PartitionConnected</code>, you'll see that this <code class=\"language-text\">ConnectionStrategy</code> exposes two sub-strategies:</p>\n<ul>\n<li><code class=\"language-text\">weave()</code> for <em>weaved</em> connections</li>\n<li><code class=\"language-text\">shard()</code> for <em>shard</em> connections.</li>\n</ul>\n<p>In the case of the <code class=\"language-text\">Coordinator Pattern</code>, using one or the other can have different meanings.</p>\n<p>Here is an example of coordinating agents on a grid. Here, the <code class=\"language-text\">Coordinator Pattern</code> allows agents to have information about others agents that are not directly next to them.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-00838.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: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAACpElEQVQ4y52UTW9SQRSG7z/wbxijidG4NV2aENsNmy5oE5W/IAkbYyUS2iaYaBfWkLBQawlt2lg/UGkUsJCWD4XyVaBRKFgKFAlQqQKvZ64M3tILNk5Chpw788x73nNmBAwY7Xb7RDHpEP4Fq9RquH7XgNsm84mgfYHNVkuc18MRCKfP4dSVqyiUy2Ks1fl2YiBTwFU0m02oJ3S492SuC/svhXxT4/AQXzMZ1Cl1rkx64EAgX8Q2MmUUwF6xiHQuh/L3CuoHB+Ia8VsfL48plPrzq7OxsL/fVSu3ThbITuOLYrEYzGYz0js7MExOIrW9Db1ej61EAguLi7BYLF1/ByrkwHA4DL3BgGAohDs6HT44HASegtP1EY9MJrjd7r4qBanJ3JMv6TTera4iR97Z7XYkk0ksLS9j3evF85UXiEajfSsuyLWKnWBqtRqBQAAKhQJvCDo8MgKPx4Op6WkYjcYjKUuhQq+6GlWyXq8jlUrhGyl0UXpLpGrD50eWPI3H4yh1Gly6j8+CNNhoNMD++f1+qFQqvLTZcHloCBHyVKlUimk/mJnBTY3mWMqcIxy5t9Xqn7lSwVOqpGPNDYvVitDmJhxUmARV+T3NXlJbqdbwgwRI94tA3i6sx1jjsvHMuoAb5GGSAEypjxSPjY9jbn4eD2dnodVq0SRGdndX9LFFDNazXWAHjzIp+xSJYIv8Y16Vyas18rBY2keQVGayWYSpR31UrCr5nMvn6bf396bxKrs+B/HK4YQ3GESerhp7aX7Sib0pdfuVXclSCflCEdFEEq+dTvFVEhVuRKIQzl/CmVEVSnTFePq91WPxluQ28dgB2XRx7BqEsxcgsvIEGdZocd+62D29t9l74TzG1z62vcXorQnxvRTk3kE5iNwFkHvGfgP/Nc7RZDicuAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <picture>\n        <source\n          srcset=\"/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-8e416.webp 173w,\n/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-0b506.webp 345w,\n/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-58be5.webp 690w,\n/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-97a91.webp 1024w\"\n          sizes=\"(max-width: 690px) 100vw, 690px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-7e3fa.png 173w,\n/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-7f1d4.png 345w,\n/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-13856.png 690w,\n/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-00838.png 1024w\"\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/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-13856.png\"\n          alt=\"coordinator 3\"\n          title=\"\"\n          src=\"/static/coordinator_3-f28c78d9808dc623d6d755cf39f6bcfd-13856.png\"\n        />\n      </picture>\n      </span>\n  </span>\n  \n  </a>\n    </p>\n<p>This is the snippet used to create this topology:</p>\n<p class=\"code-header\">Partition connected weave pattern (Java)</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>MyAgent<span class=\"token punctuation\">></span></span> agents <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>MyAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span><span class=\"token number\">16</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">public</span> Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Coordinator<span class=\"token punctuation\">></span></span> coordinators <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>Coordinators<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nagents<span class=\"token punctuation\">.</span><span class=\"token function\">gridConnected</span><span class=\"token punctuation\">(</span>OnGrid<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nagents<span class=\"token punctuation\">.</span><span class=\"token function\">partitionConnected</span><span class=\"token punctuation\">(</span>coordinators<span class=\"token punctuation\">,</span> ToCoordinator<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>This example is very simple but gives the intuition about what weaving the links between the agents and the coordinators allows.</p>","headings":[{"value":"The curse of FullyConnected Groups","depth":3},{"value":"Sneaking one Group between the Source and the Target","depth":3},{"value":"Changing your model logic to use Coordinators","depth":3},{"value":"Using PartitionConnected#weave()","depth":3}],"frontmatter":{"title":"Coordinator Pattern","toc":false,"experimental":null}},"site":{"siteMetadata":{"title":"Simudyne Docs","latestVersion":"2.6"}}},"pageContext":{"absolutePath":"/home/vsts/work/1/s/content/2.0/docs/practices/coordinator-pattern.md","versioned":true,"version":"2.0","kind":"docs","pagePath":"/practices/coordinator-pattern","chronology":{"prev":{"name":"Iterative Model Building","path":"/practices/iterative-model-building"},"next":{"name":"Release Notes","path":"/release-notes"}},"lastUpdated":"2026-04-21T13:56:54.824Z"}}