{ "cells": [ { "cell_type": "markdown", "id": "521c6d01", "metadata": {}, "source": [ "# EasyVVUQ - Jinja encoder tutorial\n", "\n", "\n", "This is a small modification of the basic tutorial on the simple beam model. In particular, will show how to use mathmatical expressions inside a Jinja template. For more information in encoding and decoding see the `tutorials/encoder_decoder_tutorial.ipynb` notebook." ] }, { "cell_type": "markdown", "id": "6428be0a", "metadata": {}, "source": [ "## Campaign" ] }, { "cell_type": "markdown", "id": "24a4af40", "metadata": {}, "source": [ "We need to import EasyVVUQ as well as ChaosPy (we use it's distributions) and matplotlib for plotting later on." ] }, { "cell_type": "code", "execution_count": 1, "id": "dad22041", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:11.855724Z", "start_time": "2021-06-09T07:14:08.704997Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:12.597493Z", "iopub.status.busy": "2025-07-20T07:23:12.597301Z", "iopub.status.idle": "2025-07-20T07:23:13.774595Z", "shell.execute_reply": "2025-07-20T07:23:13.774326Z", "shell.execute_reply.started": "2025-07-20T07:23:12.597477Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Volumes/UserData/dpc/GIT/EasyVVUQ/env_3.12/lib/python3.12/site-packages/chaospy/__init__.py:9: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", " import pkg_resources\n" ] } ], "source": [ "import os\n", "import easyvvuq as uq\n", "import chaospy as cp\n", "import matplotlib.pyplot as plt\n", "from easyvvuq.actions import CreateRunDirectory, Encode, Decode, CleanUp, ExecuteLocal, Actions" ] }, { "cell_type": "markdown", "id": "ee53f14d", "metadata": {}, "source": [ "We will describe the parameters. This is done for validation purposes (so that input parameters outside valid ranges given an error. Also this is where you can specify default values for input parameters that you don't want to vary in the analysis. Only the type and the default value fields are mandatory." ] }, { "cell_type": "code", "execution_count": 2, "id": "5bb692f0", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:11.858747Z", "start_time": "2021-06-09T07:14:11.856736Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:13.775062Z", "iopub.status.busy": "2025-07-20T07:23:13.774889Z", "iopub.status.idle": "2025-07-20T07:23:13.776820Z", "shell.execute_reply": "2025-07-20T07:23:13.776603Z", "shell.execute_reply.started": "2025-07-20T07:23:13.775054Z" } }, "outputs": [], "source": [ "params = {\n", " \"F\": {\"type\": \"float\", \"default\": 1.0}, \n", " \"L\": {\"type\": \"float\", \"default\": 1.5}, \n", " \"a\": {\"type\": \"float\", \"min\": 0.7, \"max\": 1.2, \"default\": 1.0}, \n", " \"D\": {\"type\": \"float\", \"min\": 0.75, \"max\": 0.85, \"default\": 0.8},\n", " \"d\": {\"type\": \"float\", \"default\": 0.1},\n", " \"E\": {\"type\": \"float\", \"default\": 200000},\n", " \"power\" : {\"type\": \"float\", \"default\": 0.5},\n", " \"outfile\": {\"type\": \"string\", \"default\": \"output.json\"}\n", "}" ] }, { "cell_type": "markdown", "id": "e15d9c0f", "metadata": {}, "source": [ "## Jinja encoder\n", "\n", "Below we find the only deviation from the basic tutorial, namely the use of the Jinja decoder with a mathmatical expression for the `a` variable. The standard Jinja template would look like:\n", "\n", "```\n", "{\"outfile\": \"{{outfile}}\", \n", "\"F\": {{F}},\n", "\"L\": {{L}}, \n", "\"a\": {{a}}, \n", "\"D\": {{D}}, \n", "\"d\": {{d}}, \n", "\"E\": {{E}}\n", "}\n", "```\n", "\n", "This is replaces every `{{variable}}` with a numeric value. If that the variable appears in the `vary`, the value will be drawn from the specified probability distribution. If it does not appear in `vary`, the default value as specified in the `params` dict will be used. The result will be a JSON file that is read by the beam model. It does not have to be a JSON file, this same principle will hold for any type of template file.\n", "\n", "The Jinja encoder is flexible in the sense that **mathematical expressions** can also be used. As an example, consider the followin template:\n", "\n", "```\n", "{\"outfile\": \"{{outfile}}\", \n", "\"F\": {{F}},\n", "\"L\": {{L}}, \n", "\"a\": {{a ** power}}, \n", "\"D\": {{D}}, \n", "\"d\": {{d}}, \n", "\"E\": {{E}}\n", "}\n", "```\n", "\n", "This is the same as before, except now the square root of `a` is taken. Here, `power` is also defined in the `params` dict. Since `power` is not in vary, the value of `0.5` is always used." ] }, { "cell_type": "code", "execution_count": 3, "id": "d51ada1b", "metadata": { "execution": { "iopub.execute_input": "2025-07-20T07:23:13.777088Z", "iopub.status.busy": "2025-07-20T07:23:13.777028Z", "iopub.status.idle": "2025-07-20T07:23:13.778493Z", "shell.execute_reply": "2025-07-20T07:23:13.778311Z", "shell.execute_reply.started": "2025-07-20T07:23:13.777082Z" } }, "outputs": [], "source": [ "encoder = uq.encoders.JinjaEncoder(template_fname='beam.jinja', target_filename='input.json')" ] }, { "cell_type": "markdown", "id": "2afdb7b8", "metadata": {}, "source": [ "The rest of this turorial proceeds unmodified from the basic tutorial." ] }, { "cell_type": "code", "execution_count": 4, "id": "77f1eff4", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:19.459501Z", "start_time": "2021-06-09T07:14:19.455107Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:13.778757Z", "iopub.status.busy": "2025-07-20T07:23:13.778699Z", "iopub.status.idle": "2025-07-20T07:23:13.780194Z", "shell.execute_reply": "2025-07-20T07:23:13.780016Z", "shell.execute_reply.started": "2025-07-20T07:23:13.778751Z" } }, "outputs": [], "source": [ "decoder = uq.decoders.JSONDecoder(target_filename='output.json', output_columns=['g1'])\n", "execute = ExecuteLocal('{}/beam input.json'.format(os.getcwd()))\n", "\n", "actions = Actions(CreateRunDirectory('/tmp', flatten=True), \n", " Encode(encoder), execute, Decode(decoder))" ] }, { "cell_type": "markdown", "id": "d5dc3398", "metadata": {}, "source": [ "Campaign is the central hub in which operations take place. It is responsible for running your simulations, gathering the results, storing them in the Database, retrieving them for analysis, etc. The Campaign in EasyVVUQ is very powerful and supports multiple applications, sampling, analysis and execution methods. It also lets you save progress and retrieve results later for analysis. Here we only look at a simple case." ] }, { "cell_type": "code", "execution_count": 5, "id": "916c375d", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:22.214216Z", "start_time": "2021-06-09T07:14:22.176515Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:13.780470Z", "iopub.status.busy": "2025-07-20T07:23:13.780420Z", "iopub.status.idle": "2025-07-20T07:23:13.796307Z", "shell.execute_reply": "2025-07-20T07:23:13.796021Z", "shell.execute_reply.started": "2025-07-20T07:23:13.780464Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Volumes/UserData/dpc/GIT/EasyVVUQ/env_3.12/lib/python3.12/site-packages/cerberus/validator.py:618: UserWarning: These types are defined both with a method and in the'types_mapping' property of this validator: {'integer'}\n", " warn(\n", "/Volumes/UserData/dpc/GIT/EasyVVUQ/env_3.12/lib/python3.12/site-packages/cerberus/validator.py:618: UserWarning: These types are defined both with a method and in the'types_mapping' property of this validator: {'integer'}\n", " warn(\n" ] } ], "source": [ "campaign = uq.Campaign(name='beam', params=params, actions=actions, work_dir='/tmp')" ] }, { "cell_type": "markdown", "id": "531e7aec", "metadata": {}, "source": [ "First we need to define the input parameter distributions. We have chosen 4 of the 6 available inputs. This is partly because this means that we won't have to sample at too many points and partly because I've found that these influence the output variable the most." ] }, { "cell_type": "code", "execution_count": 6, "id": "e3bc3491", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:24.062778Z", "start_time": "2021-06-09T07:14:24.056744Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:13.798220Z", "iopub.status.busy": "2025-07-20T07:23:13.798076Z", "iopub.status.idle": "2025-07-20T07:23:13.800479Z", "shell.execute_reply": "2025-07-20T07:23:13.800158Z", "shell.execute_reply.started": "2025-07-20T07:23:13.798208Z" } }, "outputs": [], "source": [ "vary = {\n", " \"F\": cp.Normal(1, 0.1),\n", " \"L\": cp.Normal(1.5, 0.01),\n", " \"a\": cp.Uniform(0.7, 1.2),\n", " \"D\": cp.Triangle(0.75, 0.8, 0.85)\n", "}" ] }, { "cell_type": "markdown", "id": "ac53db70", "metadata": {}, "source": [ "We have to choose the sampler next. For this task we can use either [Stochastic Collocation](https://easyvvuq.readthedocs.io/en/dev/easyvvuq.sampling.html#module-easyvvuq.sampling.stochastic_collocation), [Polynomial Chaos Expansion](https://easyvvuq.readthedocs.io/en/dev/easyvvuq.sampling.html#module-easyvvuq.sampling.pce) or [QMC](https://easyvvuq.readthedocs.io/en/dev/easyvvuq.sampling.html#module-easyvvuq.sampling.qmc) samplers. Stochastic Collocation is fast for this problem size so that is what we chose." ] }, { "cell_type": "code", "execution_count": 7, "id": "927c07af", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:25.478795Z", "start_time": "2021-06-09T07:14:25.224527Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:13.800937Z", "iopub.status.busy": "2025-07-20T07:23:13.800846Z", "iopub.status.idle": "2025-07-20T07:23:13.937195Z", "shell.execute_reply": "2025-07-20T07:23:13.936916Z", "shell.execute_reply.started": "2025-07-20T07:23:13.800927Z" } }, "outputs": [], "source": [ "campaign.set_sampler(uq.sampling.PCESampler(vary=vary, polynomial_order=1))" ] }, { "cell_type": "markdown", "id": "d12571d5", "metadata": {}, "source": [ "For this tutorial we have chosen to run the simulation on the local machine. This will done in parallel with up to 8 tasks running concurrently. Alternatives are execution in the Cloud (via the [ExecuteKubernetes](https://easyvvuq.readthedocs.io/en/dev/easyvvuq.actions.html#module-easyvvuq.actions.execute_kubernetes) action) or on HPC machines." ] }, { "cell_type": "code", "execution_count": 8, "id": "0dbb0dab", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:28.266228Z", "start_time": "2021-06-09T07:14:26.904138Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:13.937522Z", "iopub.status.busy": "2025-07-20T07:23:13.937457Z", "iopub.status.idle": "2025-07-20T07:23:14.136057Z", "shell.execute_reply": "2025-07-20T07:23:14.135757Z", "shell.execute_reply.started": "2025-07-20T07:23:13.937515Z" } }, "outputs": [], "source": [ "campaign.execute().collate()" ] }, { "cell_type": "markdown", "id": "3d955b56", "metadata": {}, "source": [ "The execution can take a bit since we need to generate several hundred samples. We asked it to evaluate 8 samples in parallel. You can track progress by using the ```progress``` method. You can also check progress automatically and resume execution after it is done if you want to run this inside a script rather than interactively." ] }, { "cell_type": "code", "execution_count": 9, "id": "e197810e", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:30.293648Z", "start_time": "2021-06-09T07:14:30.260808Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:14.136573Z", "iopub.status.busy": "2025-07-20T07:23:14.136495Z", "iopub.status.idle": "2025-07-20T07:23:14.148094Z", "shell.execute_reply": "2025-07-20T07:23:14.147858Z", "shell.execute_reply.started": "2025-07-20T07:23:14.136564Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
run_iditerationFLaDdEpoweroutfileg1
00000000000
0100.91.490.8056620.7795880.12000000.5output.json-0.000008
1200.91.490.8056620.8204120.12000000.5output.json-0.000006
2300.91.491.0943380.7795880.12000000.5output.json-0.000006
3400.91.491.0943380.8204120.12000000.5output.json-0.000005
4500.91.510.8056620.7795880.12000000.5output.json-0.000008
5600.91.510.8056620.8204120.12000000.5output.json-0.000007
6700.91.511.0943380.7795880.12000000.5output.json-0.000006
7800.91.511.0943380.8204120.12000000.5output.json-0.000005
8901.11.490.8056620.7795880.12000000.5output.json-0.000010
91001.11.490.8056620.8204120.12000000.5output.json-0.000008
101101.11.491.0943380.7795880.12000000.5output.json-0.000007
111201.11.491.0943380.8204120.12000000.5output.json-0.000006
121301.11.510.8056620.7795880.12000000.5output.json-0.000010
131401.11.510.8056620.8204120.12000000.5output.json-0.000008
141501.11.511.0943380.7795880.12000000.5output.json-0.000008
151601.11.511.0943380.8204120.12000000.5output.json-0.000006
\n", "
" ], "text/plain": [ " run_id iteration F L a D d E power \\\n", " 0 0 0 0 0 0 0 0 0 \n", "0 1 0 0.9 1.49 0.805662 0.779588 0.1 200000 0.5 \n", "1 2 0 0.9 1.49 0.805662 0.820412 0.1 200000 0.5 \n", "2 3 0 0.9 1.49 1.094338 0.779588 0.1 200000 0.5 \n", "3 4 0 0.9 1.49 1.094338 0.820412 0.1 200000 0.5 \n", "4 5 0 0.9 1.51 0.805662 0.779588 0.1 200000 0.5 \n", "5 6 0 0.9 1.51 0.805662 0.820412 0.1 200000 0.5 \n", "6 7 0 0.9 1.51 1.094338 0.779588 0.1 200000 0.5 \n", "7 8 0 0.9 1.51 1.094338 0.820412 0.1 200000 0.5 \n", "8 9 0 1.1 1.49 0.805662 0.779588 0.1 200000 0.5 \n", "9 10 0 1.1 1.49 0.805662 0.820412 0.1 200000 0.5 \n", "10 11 0 1.1 1.49 1.094338 0.779588 0.1 200000 0.5 \n", "11 12 0 1.1 1.49 1.094338 0.820412 0.1 200000 0.5 \n", "12 13 0 1.1 1.51 0.805662 0.779588 0.1 200000 0.5 \n", "13 14 0 1.1 1.51 0.805662 0.820412 0.1 200000 0.5 \n", "14 15 0 1.1 1.51 1.094338 0.779588 0.1 200000 0.5 \n", "15 16 0 1.1 1.51 1.094338 0.820412 0.1 200000 0.5 \n", "\n", " outfile g1 \n", " 0 0 \n", "0 output.json -0.000008 \n", "1 output.json -0.000006 \n", "2 output.json -0.000006 \n", "3 output.json -0.000005 \n", "4 output.json -0.000008 \n", "5 output.json -0.000007 \n", "6 output.json -0.000006 \n", "7 output.json -0.000005 \n", "8 output.json -0.000010 \n", "9 output.json -0.000008 \n", "10 output.json -0.000007 \n", "11 output.json -0.000006 \n", "12 output.json -0.000010 \n", "13 output.json -0.000008 \n", "14 output.json -0.000008 \n", "15 output.json -0.000006 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "campaign.get_collation_result()" ] }, { "cell_type": "markdown", "id": "51ffdb37", "metadata": {}, "source": [ "We then call the analyse method whose functionality will depend on the sampling method used. It returns an [AnalysisResults]() object which can be used to retrieve numerical values or plot the results. In this case Sobols indices." ] }, { "cell_type": "code", "execution_count": 10, "id": "f410d61f", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:34.936544Z", "start_time": "2021-06-09T07:14:34.848433Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:14.148600Z", "iopub.status.busy": "2025-07-20T07:23:14.148505Z", "iopub.status.idle": "2025-07-20T07:23:14.192953Z", "shell.execute_reply": "2025-07-20T07:23:14.192710Z", "shell.execute_reply.started": "2025-07-20T07:23:14.148591Z" } }, "outputs": [], "source": [ "results = campaign.analyse(qoi_cols=['g1'])" ] }, { "cell_type": "markdown", "id": "7f0a8d7b", "metadata": {}, "source": [ "We can plot the results in a treemap format. Each square representing the relative influence of that parameter to the variance of the output variable (vertical displacement at point ```a```). A square labeled ```higher orders``` represent the influence of the interactions between the input parameters." ] }, { "cell_type": "code", "execution_count": 11, "id": "b8a4109c", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:36.874123Z", "start_time": "2021-06-09T07:14:36.776029Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:14.193898Z", "iopub.status.busy": "2025-07-20T07:23:14.193679Z", "iopub.status.idle": "2025-07-20T07:23:14.240561Z", "shell.execute_reply": "2025-07-20T07:23:14.240222Z", "shell.execute_reply.started": "2025-07-20T07:23:14.193872Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Volumes/UserData/dpc/GIT/EasyVVUQ/env_3.12/lib/python3.12/site-packages/easyvvuq/analysis/results.py:467: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n", " fig.show()\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAMsCAYAAADTY9TiAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOElJREFUeJzt3QeUXVXZ+OF3ZlIJIZ0AAVKA0Am9F2mKAgICAtJEBAQRUMDyiYAUkT+gVJUiqB8d6aAUKRJ6kRZ670kIpNBT5v7XPvlmmEkmEODFgeR51hrJ3Dlz7pl7Z1znd/fe59bVarVaAAAAJKrP3BkAAEAhNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AL7g/vKXv0RdXV08//zzH7vtzTffXG1b/vtF9r//+7+x2GKLRceOHaNnz54xO/myPEcAn5XQANJOhJs+unTpEvPNN1987WtfixNPPDHeeuut9j7EWc4f/vCH6nH/Mnr88cfju9/9biy00EJx+umnx2mnnZay3wsuuCB22GGHWGSRRarfw6985Ssp+wXg06mr1Wq1T/m9AJVywrvLLrvEYYcdFoMHD45JkybFyJEjq1dsr7/++lhwwQXjiiuuiGWWWaa9D/VLacqUKdVj2rlz5+oEulhqqaWib9++070q3tjYGBMnToxOnTpFff0X87WkP/3pT7HnnnvGU089FQsvvHDafktY3HfffbHSSivFAw88UP2+fRFHDb4MzxFAhg4pewGIiK9//eux4oorNn/+i1/8Im688cbYZJNN4pvf/GY89thj0bVr13Y9xi+jhoaG6mNmlBPXMqL0RTZ69Ojqv9lTpsp0rAEDBlSPQQmxL5r333+/OS6+6M8RQAYvpQCfq/XWWy9+9atfxQsvvBBnn332dFNottpqq+jdu3d14lUipYx8TGvcuHHx4x//OAYNGlS9qj///PPHTjvtFGPGjGl18rrrrrtG//79q30NGzYs/vrXv7baT1njUEYEjj322DjllFNiyJAhMcccc8RXv/rVeOmll6IM8B5++OHV/ksQbbbZZvHmm2+22kc5hhJO1113XSy77LLVfS2xxBJxySWXTHfczz77bGy99dbVz1fuZ9VVV42rr756uu1OOumkWHLJJattevXqVT0O55577gzXaJRjeOSRR+Lf//5383S1pmlCM5r/f9FFF8UKK6xQ/VxlJKRMMXrllVdabVOmM80555zV7Ztvvnn17379+sUBBxxQjarM7JSu8rOU56lMn/vhD39YPX8tH79DDjmk+nfZdznWQw899CP3WY69PMblsS4Bcemll1bHWvbV0gILLPCpRghGjRoVHTp0iF//+tfTfe2JJ56ojvHkk0+uPi+/D+XxWHrppavHZ6655qoC+8EHH2z1fU3Pw/nnnx8HHXRQFUDl+Z0wYUKbz9Hw4cOr35Uy+lceu/KzlN/5995771M/R2Xk5IQTTqiOtTx2ZbuNNtoo7r333lbblb/Lpt+N8ru67bbbVn8PAJ+V0AA+dzvuuGP133Jy3qScKJcT7zLK8fOf/zyOO+646NatW3XyVE4km7z99tux1lprVSfjJQjKidMPfvCDKlJefvnlaptyMlZOtMsr2ttvv30cc8wx0aNHj+qkrGw/rXPOOac6If7Rj34U+++/f3XC/u1vf7s6IbzmmmviZz/7Wey+++5x5ZVXVidw0ypTfrbZZpvqBPOoo46qTlLLSWKZJtby5HX11VePa6+9Nvbaa6848sgjq1e0y8hOy5+vrFHYZ599qhPp448/vjrZLQFz1113zfDxLNuVGCqLqcvPXD5++ctfznD7Eirl5yujIuV4d9tttyqM1lxzzVYRUJST1bK2pk+fPlWQrbPOOtVzMzPrKEowlLAogVG+Z8stt4xTTz21et7K1K+mY99iiy2qf//xj3+sjv1b3/rWDPdZwqw81mXReDn2sm0JyjJFKkuJ0/JzXnjhhW2u+yiPW3l+m+Lxsssuq2Lzd7/7XRx44IHx8MMPV9//6quvTvf9JVzLz1B+j37zm99UIxoziql33323mlJWftfLc1D+W4J6WjP7HJXHab/99qui5eijj67+zkpw3Hnnnc3blN/Lch9lXUv5ecr2N9xwQ6y99trT/W4AfGJljQbAZ3HWWWeVtV61e+65Z4bb9OjRo7bccss1f77++uvXll566dr777/ffFtjY2Nt9dVXry2yyCLNtx188MHVvi+55JLp9lm2L44//vhqm7PPPrv5axMnTqytttpqtTnnnLM2YcKE6rbnnnuu2q5fv361cePGNW/7i1/8orp92LBhtUmTJjXfvt1229U6derU6hgHDhxYbXvxxRc33zZ+/PjavPPO2+rn22+//arthg8f3nzb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HGs57hId076pYLms7WGHHVYdS1msXYKnXC655SjOJ1WmSpXRhTKVsARLWTxffkc+bl3MRymjLuWy0iX8ylqM8pyUEb/yfh3la3vvvXd1n+XxKc9bWVtUoqr8zpXf0RLS5e+qrcs7A8y0T3ydKoAZXH616aNc5nSeeeapbbjhhrUTTjih+fKy03rmmWdqO+20U7Vtx44dawMGDKhtsskmtb///e+ttnvjjTdqe++9d/X1su9yudNymc8xY8Y0bzNq1KjaLrvsUuvbt2+1Tbksajmulpoub3vMMce0ebnRiy666GMv21suqbrxxhvXrr322toyyyxTXdZ0scUWm+57m36+rbbaqtazZ89aly5daiuvvHJ1WdlpL6u69tpr1/r06VPta6GFFqodeOCB1SVzP+rytiNHjqyOo3v37tXXmi7l2talU4sLLrigugRquY/evXvXtt9++9rLL7/capvymHbr1m26n6PpcrQzo1zOtjwe5fns379/bc8996yNHTu2zf3NzOVti/PPP7/aZzn2cpneK664orbllltWt7W137Y+ytdmRvld7dq163SXS255edv999+/upxx2W6NNdao3XHHHdXj3/JyujP6nZrRc/Too4/WNthgg+pyzOV3eLfddqs9+OCD1XYtf48/yXM0efLk6ne9PE7lb6Jc1vnrX/967b777mu1XblU85prrlntt3yU7X/4wx/WnnjiiZl6zABmpK78z8xnCcDsrYwClFfTy+Jt2k+ZplZGUT7LOgYAPl/WaADwhVXWqZSpeC3dfPPN1dS6ss4HgC8uazQA+MIqaxbKQvOybqIsDi9rgMranLKuZdo3rQPgi0VoAPCFVd6Irix8P+OMM6oF3uVqW2Wh/G9/+9vo06dPex8eAB/BGg0AACCdNRoAAEA6oQEAAKQTGgAAQDqhAQAApBMaAABAOqEBAACkExoAAEA6oQEAAKQTGgAAQDqhAQAApBMaAABAug5ZO9rm0m2zdgWznQu2OP+zfX90TDsWAIBtYtJn3ocRDQAAIJ3QAAAA0gkNAAAgndAAAADSCQ0AACCd0AAAANIJDQAAIJ3QAAAA0gkNAAAgndAAAADSCQ0AACCd0JiF3X3SXXHrb29t78MAAGA2JDQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0HfJ3yRfJpHcnxdjn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AwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASFdXq9Vq+bsFAABmZ0Y0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgHRCAwAASCc0AACAdEIDAABIJzQAAIB0QgMAAEgnNAAAgMj2/wEtCAa1pLvhHwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results.plot_sobols_treemap('g1', figsize=(10, 10))\n", "plt.axis('off');" ] }, { "cell_type": "markdown", "id": "b675c192", "metadata": {}, "source": [ "Alternatively you can get the Sobol index values using the method call below." ] }, { "cell_type": "code", "execution_count": 12, "id": "2d5d8b71", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:42.156765Z", "start_time": "2021-06-09T07:14:42.151980Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:14.240959Z", "iopub.status.busy": "2025-07-20T07:23:14.240883Z", "iopub.status.idle": "2025-07-20T07:23:14.243735Z", "shell.execute_reply": "2025-07-20T07:23:14.243416Z", "shell.execute_reply.started": "2025-07-20T07:23:14.240951Z" } }, "outputs": [ { "data": { "text/plain": [ "{'F': array([0.26305477]),\n", " 'L': array([0.02570021]),\n", " 'a': array([0.43887154]),\n", " 'D': array([0.27237348])}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.sobols_first('g1')" ] }, { "cell_type": "code", "execution_count": 13, "id": "ea8b0ac9", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:43.966905Z", "start_time": "2021-06-09T07:14:43.963384Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:14.244260Z", "iopub.status.busy": "2025-07-20T07:23:14.244156Z", "iopub.status.idle": "2025-07-20T07:23:14.246370Z", "shell.execute_reply": "2025-07-20T07:23:14.246172Z", "shell.execute_reply.started": "2025-07-20T07:23:14.244242Z" } }, "outputs": [ { "data": { "text/plain": [ "['min', 'max', '10%', '90%', '1%', '99%', 'median', 'mean', 'var', 'std']" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.supported_stats()" ] }, { "cell_type": "code", "execution_count": 14, "id": "48133c45", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:44.923622Z", "start_time": "2021-06-09T07:14:44.919985Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:14.246663Z", "iopub.status.busy": "2025-07-20T07:23:14.246600Z", "iopub.status.idle": "2025-07-20T07:23:14.248743Z", "shell.execute_reply": "2025-07-20T07:23:14.248450Z", "shell.execute_reply.started": "2025-07-20T07:23:14.246657Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0.26305477])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results._get_sobols_first('g1', 'F')" ] }, { "cell_type": "code", "execution_count": 15, "id": "4305a259", "metadata": { "ExecuteTime": { "end_time": "2021-06-09T07:14:51.580848Z", "start_time": "2021-06-09T07:14:51.576505Z" }, "execution": { "iopub.execute_input": "2025-07-20T07:23:14.249342Z", "iopub.status.busy": "2025-07-20T07:23:14.249230Z", "iopub.status.idle": "2025-07-20T07:23:14.251352Z", "shell.execute_reply": "2025-07-20T07:23:14.251073Z", "shell.execute_reply.started": "2025-07-20T07:23:14.249332Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0.26305477])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.sobols_total('g1', 'F')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.11" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false } }, "nbformat": 4, "nbformat_minor": 5 }