{"data":{"markdownRemark":{"html":"<p>The RunnerBackend and ModelRunner classes need to be used together to setup and run a simulation that can run multiple times.</p>\n<p>This guide assumes you have a Model created which implements <code class=\"language-text\">simudyne.core.Model</code>\nThe following imports are assumed</p>\n<p class=\"code-header\">Imports required for multirun (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>exec<span class=\"token punctuation\">.</span>runner<span class=\"token punctuation\">.</span>ModelRunner<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> simudyne<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>exec<span class=\"token punctuation\">.</span>runner<span class=\"token punctuation\">.</span>RunResult<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> simudyne<span class=\"token punctuation\">.</span>core<span class=\"token punctuation\">.</span>exec<span class=\"token punctuation\">.</span>runner<span class=\"token punctuation\">.</span>RunnerBackend<span class=\"token punctuation\">;</span></code></pre></div>\n<p>The RunnerBackend class is needed to set up the ModelRunner. The default RunnerBackend can be created by using the RunnerBackend create method. This will create an instance of the RunnerBackend that can be used to run the model locally.</p>\n<p class=\"code-header\">Create a model runner (Java)</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">RunnerBackend runnerBackend <span class=\"token operator\">=</span> RunnerBackend<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Create the ModelRunner for a specific model with <code class=\"language-text\">RunnerBackend#forModel</code> passing the class of the model or <code class=\"language-text\">RunnerBackend#forConfig</code> passing the <code class=\"language-text\">ModelConfiguration</code> for the model</p>\n<p class=\"code-header\">Create a model runner for a specific model (Java)</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">ModelRunner modelRunner <span class=\"token operator\">=</span> runnerBackend<span class=\"token punctuation\">.</span><span class=\"token function\">forModel</span><span class=\"token punctuation\">(</span>myModel<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<h2 id=\"setting-up-the-multirun\"><a href=\"#setting-up-the-multirun\" 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>Setting up the multirun</h2>\n<p>Use the <code class=\"language-text\">ModelRunner</code> to create 'definitions' which define the parameters of the multiruns, as well as the export path to be used and config to set for all runs. </p>\n<p class=\"code-header\">Settings for a ModelRun</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">modelRunner\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forExportPath</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Some/absolute/path\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">withConfig</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"configField\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"configValue\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"modelrunner-definitions\"><a href=\"#modelrunner-definitions\" 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>ModelRunner Definitions</h2>\n<p>There are three types of ModelRunner Definitions that can be used. </p>\n<ul>\n<li>BatchDefinitionsBuilder</li>\n<li>ModelSamplerDefinitionsBuilder</li>\n<li>ScenarioDefinitionsBuilder</li>\n</ul>\n<h3 id=\"batchdefinitionsbuilder\"><a href=\"#batchdefinitionsbuilder\" 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>BatchDefinitionsBuilder</h3>\n<p>This is used to run a model multiple times for a set number of ticks. A single set of inputs can be specified that will be applied to all runs before setup. </p>\n<p>The default data output for batch runs.</p>\n<ul>\n<li>Data output of all runs in held in memory and aggregated which can be inspected at the end of the run. To change this, set the config field \"core.return-data\" to false.</li>\n<li>Data output is not written to file (parquet). To change this, set the config field \"core.parquet-export.enabled\" to true, or simply set the export path using the method <code class=\"language-text\">forExportPath</code> on the modelRunner (as shown above).</li>\n</ul>\n<p>Define the parameters for the Batch run by creating an instance of <code class=\"language-text\">BatchDefinitionsBuilder</code> and setting this instance as the run definition to use for the model runner.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  BatchDefinitionsBuilder runDefinitionBuilder <span class=\"token operator\">=</span> \n    BatchDefinitionsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forRuns</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// a required field, must be greater than 0.</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forTicks</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// a required field, must be greater than 0.</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">withInput</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"preference\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.75</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// can be used as many or little times depending on how many input fields you want to specify.</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forGeneratorSeed</span><span class=\"token punctuation\">(</span><span class=\"token number\">467854386543</span>L<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// This is an optional field - if set, this will be the root seed that is used to set the seeds for the individual runs. If not set, the seed will be pulled from the Simudyne SDK properties file.</span>\n    \n  modelRunner<span class=\"token punctuation\">.</span><span class=\"token function\">forRunDefinitionBuilder</span><span class=\"token punctuation\">(</span>runDefinitionBuilder<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Setting input values for variables in custom objects, or variables in the global state is more complex. This is explained further below (Setting nested input values). </p>\n<p>The seeds can also be defined for the individual runs. If specifying the seeds for the runs, the number of seeds provided must match the number of runs specified.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  BatchDefinitionsBuilder runDefinitionBuilder <span class=\"token operator\">=</span> \n    BatchDefinitionsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forRuns</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// a required field, must be greater than 0.</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forTicks</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// a required field, must be greater than 0.</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forSeeds</span><span class=\"token punctuation\">(</span><span class=\"token number\">2344</span><span class=\"token punctuation\">,</span> <span class=\"token number\">95846</span><span class=\"token punctuation\">,</span> <span class=\"token number\">474654</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    \n\n  modelRunner<span class=\"token punctuation\">.</span><span class=\"token function\">forRunDefinitionBuilder</span><span class=\"token punctuation\">(</span>runDefinitionBuilder<span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"modelsamplerdefinitionsbuilder\"><a href=\"#modelsamplerdefinitionsbuilder\" 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>ModelSamplerDefinitionsBuilder</h3>\n<p>This is used to run a model multiple times, for a set number of ticks. The input fields can be set for the individual runs by drawing from a list of samples. </p>\n<p>The data output for model sampler runs</p>\n<ul>\n<li>Data output of all runs is not held in memory and aggregated which so cannot be inspected at the end of the run</li>\n<li>Data output is written to file (parquet)</li>\n</ul>\n<p>The sample input values to use can be generated by the SDK by providing the SDK with the bounds for your input fields to generate samples for, or they can be provided by the user. </p>\n<p>SDK generated samples</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  ModelSamplerDefinitionsBuilder runDefinitionsBuilder <span class=\"token operator\">=</span>\n    ModelSamplerDefinitionsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forRuns</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forTicks</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forSamples</span><span class=\"token punctuation\">(</span><span class=\"token number\">9</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">withBoundedDimension</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"gridSize\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">withBoundedDimension</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"price\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  modelRunner<span class=\"token punctuation\">.</span><span class=\"token function\">forRunDefinitionBuilder</span><span class=\"token punctuation\">(</span>runDefinitionBuilder<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This will generate 9 integer samples between the values of 12 and 100 to apply to the gridSize field, and 9 double samples between the values of 0.2 and 0.5 to apply to the price field when running the model. Each sample set will be run for 5 runs, so this configuration will run for a total of 45 runs. </p>\n<p>User specified samples</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  ModelSamplerDefinitionsBuilder runDefinitionsBuilder <span class=\"token operator\">=</span>\n    ModelSamplerDefinitionsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forRuns</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forTicks</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">withListedDimension</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"gridSize\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">,</span> <span class=\"token number\">34</span><span class=\"token punctuation\">,</span> <span class=\"token number\">67</span><span class=\"token punctuation\">,</span> <span class=\"token number\">34</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">withListedDimension</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"price\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  modelRunner<span class=\"token punctuation\">.</span><span class=\"token function\">forRunDefinitionBuilder</span><span class=\"token punctuation\">(</span>runDefinitionBuilder<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This will pair up the samples provided for gridSize and price so that we have 5 unique sample definitions, and run each of these sample defintions 100 times, for a total of 500 runs. </p>\n<p>The seeds for the runs can either be set by setting the generator seed which will be used to create the seeds for the individual runs, or by providing a list of seeds explicitly. </p>\n<p>Full Example:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  ModelSamplerDefinitionsBuilder runDefinitionsBuilder <span class=\"token operator\">=</span>\n    ModelSamplerDefinitionsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forRuns</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forTicks</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">withListedDimension</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"gridSize\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">,</span> <span class=\"token number\">34</span><span class=\"token punctuation\">,</span> <span class=\"token number\">67</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">withListedDimension</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"price\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.3</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">forSeeds</span><span class=\"token punctuation\">(</span><span class=\"token number\">123</span><span class=\"token punctuation\">,</span><span class=\"token number\">345</span><span class=\"token punctuation\">,</span><span class=\"token number\">678</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  modelRunner<span class=\"token punctuation\">.</span><span class=\"token function\">forRunDefinitionBuilder</span><span class=\"token punctuation\">(</span>runDefinitionBuilder<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This will create the following set of runs. </p>\n<table>\n<thead>\n<tr>\n<th>seed</th>\n<th>gridSize</th>\n<th>price</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>123</td>\n<td>12</td>\n<td>0.1</td>\n</tr>\n<tr>\n<td>123</td>\n<td>34</td>\n<td>0.2</td>\n</tr>\n<tr>\n<td>123</td>\n<td>67</td>\n<td>0.3</td>\n</tr>\n<tr>\n<td>345</td>\n<td>12</td>\n<td>0.1</td>\n</tr>\n<tr>\n<td>345</td>\n<td>34</td>\n<td>0.2</td>\n</tr>\n<tr>\n<td>345</td>\n<td>67</td>\n<td>0.3</td>\n</tr>\n<tr>\n<td>678</td>\n<td>12</td>\n<td>0.1</td>\n</tr>\n<tr>\n<td>678</td>\n<td>34</td>\n<td>0.2</td>\n</tr>\n<tr>\n<td>678</td>\n<td>67</td>\n<td>0.3</td>\n</tr>\n</tbody>\n</table>\n<p>The ModelSampler cannot be used to set input fields of global state fields. </p>\n<h3 id=\"scenariodefinitionsbuilder\"><a href=\"#scenariodefinitionsbuilder\" 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>ScenarioDefinitionsBuilder</h3>\n<p>This is used to build a set of scenarios for running the model, where every scenario defines input values that can be set at various ticks throughout the model.</p>\n<p>The data output for model sampler runs:</p>\n<ul>\n<li>Data output of all runs is not held in memory and is aggregated which therefore cannot be inspected at the end of the run</li>\n<li>Data output is written to file (parquet)</li>\n</ul>\n<p>Multiple scenarios can be built using the builder, with each scenario requiring a unique name, and the ending of each scenario definition being marked with <code class=\"language-text\">done()</code></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  ScenarioDefinitionsBuilder runDefinitionsBuilder <span class=\"token operator\">=</span>\n    ScenarioDefinitionsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">createScenario</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"firstScenario\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">done</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">createScenario</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"secondName\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">done</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  modelRunner<span class=\"token punctuation\">.</span><span class=\"token function\">forRunDefinitionBuilder</span><span class=\"token punctuation\">(</span>runDefinitionBuilder<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Once created, each scenario can be setup with the runs, seeds, ticks and inputs to use when running the model, as with batch runs. Differently to the the batch runs, the scenario runs can also have the input values specified to be applied before running various ticks of the model.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  ScenarioDefinitionsBuilder runDefinitionsBuilder <span class=\"token operator\">=</span>\n    ScenarioDefinitionsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">createScenario</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"firstScenario\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">forRuns</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">forTicks</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">withInput</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"griSize\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">done</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  modelRunner<span class=\"token punctuation\">.</span><span class=\"token function\">forRunDefinitionBuilder</span><span class=\"token punctuation\">(</span>runDefinitionBuilder<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This will set the value of <code class=\"language-text\">gridSize</code> to 1000 before running tick 8.</p>\n<p>Setting input values for variables in custom objects, or variables in the global state is more complex. This is explained further below (Setting nested input values). </p>\n<h2 id=\"running-the-multirun\"><a href=\"#running-the-multirun\" 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>Running the multirun</h2>\n<p><code class=\"language-text\">ModelRunner.run</code> will return a <code class=\"language-text\">MultirunController</code>, which is a view onto the async running simulation. This can be used to cancel the simulation, check its progress, and get the output of the simulation.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">MultirunController run <span class=\"token operator\">=</span> modelRunner<span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nrun<span class=\"token punctuation\">.</span><span class=\"token function\">cancelRun</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// This will cancel the run</span>\n\nrun<span class=\"token punctuation\">.</span><span class=\"token function\">getProgress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// This returns a value between 0 and 1 which reflects the progress of the simulation</span>\n\nrun<span class=\"token punctuation\">.</span><span class=\"token function\">awaitOutput</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Block and wait for the simulation to complete and all output to be written to file</span>\nrun<span class=\"token punctuation\">.</span><span class=\"token function\">asyncOutput</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// This returns the future that can be used to track the completion of writing all output data to file.</span>\n\nrun<span class=\"token punctuation\">.</span><span class=\"token function\">asyncResult</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// This returns the future that can be used to track the run.</span>\nRunResult runResult <span class=\"token operator\">=</span> run<span class=\"token punctuation\">.</span><span class=\"token function\">awaitResult</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// This returns the run results object (explained below)</span></code></pre></div>\n<p>To understand the RunResult output, see <a href=\":version/reference/run_mode/multirun_output\">Multirun Output</a></p>\n<div class=\"ui segment info message\">\n<h4>Improving multirun performance</h4>\nThe multirun results are stored in memory to be returned to the user. If only the file output matters, this behaviour can be disabled in order to improve performance by setting the config field 'core.return-data' to false.\n<p>To read more on flags and configuration, see <a href=\":version/reference/models/model-configuration\">Model Config</a>.</p>\n<p>If this field is set to false, the returned RunResult will be empty.</p>\n</div>\n<h1 id=\"running-a-distributed-multirun\"><a href=\"#running-a-distributed-multirun\" 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>Running a distributed multirun</h1>\n<h2 id=\"using-spark\"><a href=\"#using-spark\" 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 Spark</h2>\n<p>Running a distributed multirun simulation depends on different packages and imports.</p>\n<p>These elements can be found in the <a href=\":version/reference/distributed_computation/spark_setup#spark-requirements\">spark requirement tutorial</a> and the <a href=\":version/reference/distributed_computation/spark_setup#spark-model-runner\">spark runner tutorial</a> tutorials. </p>\n<p>To setup a distributed multirun, create a new instance of the SparkRunnerBackend as the RunnerBackend. All other methods are the same as for the local RunnerBackend.  </p>\n<p class=\"code-header\">Multirun with spark (Java)</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">RunnerBackend runnerBackend <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SparkRunnerBackend</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nModelRunner modelRunner <span class=\"token operator\">=</span> runnerBackend<span class=\"token punctuation\">.</span><span class=\"token function\">forModel</span><span class=\"token punctuation\">(</span>myModel<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>Extracting information from the <code class=\"language-text\">RunResult</code> is explained in <a href=\":version/reference/run_mode/multirun_output\">Multirun Output</a></p>\n<h2 id=\"setting-nested-input-values\"><a href=\"#setting-nested-input-values\" 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>Setting nested input values</h2>\n<p>When the input fields are nested objects, as is the case with fields inside the global state, setting the input values is slightly more complicated.\nA Map of key-values needs to be used to as the value for the input field.</p>\n<p>For example, if there is a field \"fillFactor\" inside the global state object, setting this field would work as follows. </p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"> HashMap<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>String<span class=\"token punctuation\">,</span> Object<span class=\"token punctuation\">></span></span> valueMap <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashMap</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    valueMap<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fillFactor\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.55</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    RunnerBackend<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">forModel</span><span class=\"token punctuation\">(</span>GameOfLife<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 function\">forRunDefinitionBuilder</span><span class=\"token punctuation\">(</span>\n            BatchDefinitionsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forRuns</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forTicks</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">withInput</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"system\"</span><span class=\"token punctuation\">,</span> valueMap<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The input field has a name \"system\" (the outer field name for all global state values), and the value set for \"system\" is actually a Map, which has a key \"fillFactor\" and the value to set for it.</p>","headings":[{"value":"Setting up the multirun","depth":2},{"value":"ModelRunner Definitions","depth":2},{"value":"BatchDefinitionsBuilder","depth":3},{"value":"ModelSamplerDefinitionsBuilder","depth":3},{"value":"ScenarioDefinitionsBuilder","depth":3},{"value":"Running the multirun","depth":2},{"value":"Running a distributed multirun","depth":1},{"value":"Using Spark","depth":2},{"value":"Setting nested input values","depth":2}],"frontmatter":{"title":"Multirun Setup","toc":null,"experimental":null}},"site":{"siteMetadata":{"title":"Simudyne Docs","latestVersion":"2.6"}}},"pageContext":{"absolutePath":"/home/vsts/work/1/s/content/2.4/reference/run_mode/multirun_setup.md","versioned":true,"version":"2.4","kind":"reference","pagePath":"/reference/run_mode/multirun_setup","chronology":{"prev":{"name":"Run Mode","path":"/reference/run_mode"},"next":{"name":"Multirun Output","path":"/reference/run_mode/multirun_output"}},"lastUpdated":"2026-04-21T13:56:54.853Z"}}