{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Process Model simulation\n", "In this example, we present a simple process model and simulate its execution to obtain performance metrics.\n", "## Initialization\n", "As usual, we start the notebook by initializing the Modelverse connection.\n", "Additionally, we will be using matplotlib to draw a figure at the end, so include it now already" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append(\"../wrappers/\")\n", "from modelverse import *\n", "init()\n", "login(None, None)\n", "\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load libraries\n", "Load all the necessary formalisms and activities first.\n", "They might already exist in the Modelverse, but it doesn't matter that much now: just overwrite.\n", "Also loads the DEVS library for process modelling building blocks." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "model_add(\"~/formalisms/DEVS/DEVS_MM\", \"formalisms/SimpleClassDiagrams\", open(\"../models/ClassicDEVS/metamodels/DEVS.mvc\", 'r').read())\n", "model_add(\"~/formalisms/PM/PM_Extended_MM\", \"formalisms/SimpleClassDiagrams\", open(\"../models/FTGPM/metamodels/control_patterns.mvc\", 'r').read())\n", "model_add(\"~/formalisms/Experiment/Experiment_MM\", \"formalisms/SimpleClassDiagrams\", open(\"../models/PythonPDEVS_Experiment/metamodels/experiment.mvc\", 'r').read())\n", "model_add(\"~/models/DEVS/PM_library\", \"~/formalisms/DEVS/DEVS_MM\", open(\"../models/ClassicDEVS/models/process_patterns_library.mvc\", 'r').read())\n", "model_add(\"~/formalisms/String\", \"formalisms/SimpleClassDiagrams\", open(\"../models/String/metamodels/String.mvc\", 'r').read())\n", "\n", "def traceability_pm_devs(model):\n", " instantiate(model, \"Association\", (\"PM/ProcessNode\", \"DEVS/DEVSInstance\"), ID=\"Trace\")\n", "\n", "transformation_add_MT({\"PM\": \"~/formalisms/PM/PM_Extended_MM\"}, {\"DEVS\": \"~/formalisms/DEVS/DEVS_MM\"}, \"~/formalisms/PM/to_DEVS\", open(\"../models/FTGPM/transformations/patterns_to_DEVS.mvc\", 'r').read(), traceability_pm_devs)\n", "transformation_add_AL({\"model1\": \"~/formalisms/DEVS/DEVS_MM\", \"model2\": \"~/formalisms/DEVS/DEVS_MM\"}, {\"result\": \"~/formalisms/DEVS/DEVS_MM\"}, \"~/formalisms/DEVS/merge\", open(\"../models/ClassicDEVS/transformations/merge.alc\", 'r').read())\n", "transformation_add_AL({\"DEVS\": \"~/formalisms/DEVS/DEVS_MM\", \"Experiment\": \"~/formalisms/Experiment/Experiment_MM\"}, {\"result\": \"~/formalisms/String\"}, \"~/formalisms/DEVS/simulate\", open(\"../models/ClassicDEVS/transformations/simulate.alc\", 'r').read())\n", "\n", "model_add(\"~/models/PM/to_DEVS\", \"formalisms/ProcessModel\", open(\"../models/FTGPM/PM_patterns_simulation_relative.mvc\", 'r').read())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Specify Input\n", "Next we specify the input models and the experiment that we wish to perform.\n", "The input Process Model is the one that will be simulated, and can be tuned in a variety of ways, such as through the use of different parameters.\n", "The experiment can be further tweaked to alter the range of available resources or to change the number of samples." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "model_add(\"~/models/PM/example_PM\", \"~/formalisms/PM/PM_Extended_MM\", \"\"\"\n", " Initial init {\n", " name = \"initial\"\n", " }\n", " Activity req {\n", " name = \"define_requirements\"\n", " distribution = \"lambda iteration: max(0.0, random.gauss(10.0 * (1-math.exp(-(iteration+1) / 0.7)), (10.0 * (1-math.exp(-(iteration+1) / 0.7)))*0.15625))\"\n", " }\n", " SimpleMerge merge {\n", " name = \"merge_0\"\n", " }\n", " Activity model {\n", " name = \"model_system\"\n", " distribution = \"lambda iteration: max(0.0, random.gauss(100.0 * (1-math.exp(-(iteration+1) / 0.7)), (100.0 * (1-math.exp(-(iteration+1) / 0.7)))*0.15625))\"\n", " }\n", " ParallelSplit split {\n", " name = \"split_0\"\n", " }\n", " MultiInstance simulate {\n", " name = \"simulate\"\n", " nr_instances = 10\n", " distribution = \"lambda iteration: max(0.0, random.gauss(20.0 * (1-math.exp(-(iteration+1) / 0.7)), (20.0 * (1-math.exp(-(iteration+1) / 0.7)))*0.15625))\"\n", " }\n", " Activity check {\n", " name = \"check\"\n", " distribution = \"lambda iteration: max(0.0, random.gauss(30.0 * (1-math.exp(-(iteration+1) / 0.7)), (30.0 * (1-math.exp(-(iteration+1) / 0.7)))*0.15625))\"\n", " }\n", " Synchronization sync {\n", " name = \"sync_0\"\n", " }\n", " Activity evaluate {\n", " name = \"evaluate\"\n", " distribution = \"lambda iteration: max(0.0, random.gauss(0.1 * (1-math.exp(-(iteration+1) / 0.7)), (0.1 * (1-math.exp(-(iteration+1) / 0.7)))*0.15625))\"\n", " }\n", " ExclusiveChoice choice {\n", " name = \"xor_0\"\n", " distribution = \"lambda iteration: random.random() > {0: 0.99, 1: 0.9, 2: 0.8, 3: 0.5, 4: 0.2, 5: 0.1, 6: 0.02}.get(iteration, 0.0)\"\n", " }\n", " Finish finish {\n", " name = \"finish\"\n", " }\n", "\n", " Next (init, req) {}\n", " Next (req, merge) {}\n", " Next (merge, model) {}\n", " Next (model, split) {}\n", " Next (split, simulate) {}\n", " Next (split, check) {}\n", " Next (simulate, sync) {}\n", " Next (check, sync) {}\n", " Next (sync, evaluate) {}\n", " Next (evaluate, choice) {}\n", " DecisionTrue (choice, finish) {}\n", " DecisionFalse (choice, merge) {}\n", " \"\"\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "model_add(\"~/models/Experiment/example_experiment\", \"~/formalisms/Experiment/Experiment_MM\", \"\"\"\n", " Experiment {\n", " code = \\\"\\\"\\\"\n", " import random\n", " import math\n", "\n", " from pypdevs.simulator import Simulator\n", "\n", " def simulate(nresources, seed):\n", " random.seed(seed)\n", " model = Root('root', [nresources])\n", " sim = Simulator(model)\n", " sim.setClassicDEVS()\n", " sim.simulate()\n", " return model.submodels['finish'].state\n", "\n", " def main():\n", " results = ''\n", " for i in range(1, 14):\n", " results = results + str(i)\n", " for v in range(2, 10):\n", " results = results + ' ' + str(simulate(i, v))\n", " results = results + '\\\\n'\n", " return results\n", " \\\"\\\"\\\"\n", " }\n", " \"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Enact process\n", "Finally we enact the process, thereby generating the *~/results* model." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "process_execute(\"~/models/PM/to_DEVS\", {\"PM\": \"~/models/PM/example_PM\", \"DEVS library\": \"~/models/DEVS/PM_library\", \"Experiment\": \"~/models/Experiment/example_experiment\", \"result\": \"~/result\"}, {})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally plot the simulation results, by reading out the value of the string model.\n", "Using this information, we split it up and then forward it to matplotlib for plotting as a boxplot." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results = read_attrs(\"~/result\", all_instances(\"~/result\", \"String\").pop())[\"value\"]\n", "data = results.strip().split(\"\\n\")\n", "data = [i.split() for i in data]\n", "data = [[float(j) for j in i[1:]] for i in data]\n", "plt.boxplot(data);" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }