Skip to content

Complete Model in Jupiter ​

In this real-world case study, we build and analyze a model of a distributed Internet of Things (IoT) edge computing system featuring seven sequential processing stages, whose parameters were calibrated against empirical production telemetry.

The system performs real-time wildfire monitoring: smart cameras capture continuous video frames, an edge computer runs deep learning inference to detect smoke and flames, a business rule engine filters false positives, and a persistent logging service records events to a database.


Workflow of an Image Frame ​

Each video frame passes through seven sequential stages:

  1. Producer: Captures the camera frame and uploads it to temporary buffer storage.
  2. Message Broker Notice: Emits a notification to the message bus that a new frame is ready.
  3. Consumer: Edge processing node receives the notification.
  4. Download: The worker node fetches the corresponding image from storage.
  5. Fire Classifier Inference: Deep learning model processes the pixel matrix.
  6. Rule Engine: Evaluates confidence thresholds and deduplicates alerts.
  7. Database Logger: Persists metadata and detection results.

Petri Net Architecture ​

The pipeline structure repeats consistently across every stage:

  • A queue place for items waiting for that specific operation.
  • A capacity place governing how many items can be processed concurrently.
  • A timed transition with the stage's execution delay.
  • Because stages feature concurrent worker threads, transitions are set to Infinite Server (I), with real concurrency bounded by the capacity place.

Below is the complete model definition in JSON (ready to import in Jupiter via File → Import (Local)):

json
{
  "modelName": "SPN Fire Monitoring Sabino 2024",
  "places": [
    {
      "name": "Pafp",
      "initialMarking": 1,
      "stringMarking": "1",
      "initialStringMarking": "1",
      "id": "p1",
      "x": 201.0028419494629,
      "y": 179.34091186523438
    },
    {
      "name": "Paqfp",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p2",
      "x": 406.0028419494629,
      "y": 185.34091186523438,
      "labelX": 406.0028419494629,
      "labelY": 225.34091186523438
    },
    {
      "name": "PfpMI",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p3",
      "x": 675.5512382158005,
      "y": 195.502203527524
    },
    {
      "name": "Pfp",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p4",
      "x": 966.0028419494629,
      "y": 190.34091186523438
    },
    {
      "name": "Pmq1",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p5",
      "x": 1255.002841949463,
      "y": 197.34091186523438,
      "labelX": 1255.002841949463,
      "labelY": 237.34091186523438
    },
    {
      "name": "Pcmq1",
      "initialMarking": 1,
      "stringMarking": "CMQ",
      "initialStringMarking": "CMQ",
      "id": "p6",
      "x": 1244.4544521434996,
      "y": 101.46994704088726,
      "labelX": 1244.4544521434996,
      "labelY": 137.92156000365569
    },
    {
      "name": "Pccap",
      "initialMarking": 1,
      "stringMarking": "CAP",
      "initialStringMarking": "CAP",
      "id": "p7",
      "x": 687.9593376888156,
      "y": 86.90041041628149,
      "labelX": 687.9593376888156,
      "labelY": 126.90041041628149
    },
    {
      "name": "Pcfc",
      "initialMarking": 1,
      "stringMarking": "CFC",
      "initialStringMarking": "CFC",
      "id": "p8",
      "x": 523.6337575777551,
      "y": 352.7557665510285
    },
    {
      "name": "PfcMI",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p9",
      "x": 515.959339019524,
      "y": 466.5929751647899
    },
    {
      "name": "PfcPM",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p10",
      "x": 758.982593363509,
      "y": 476.8255332424314,
      "labelX": 758.982593363509,
      "labelY": 518.1046030021366
    },
    {
      "name": "PfcF",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p11",
      "x": 1021.1918941030717,
      "y": 479.38367276184175,
      "labelX": 1021.1918941030717,
      "labelY": 518.1046030021366
    },
    {
      "name": "Pmq2",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p12",
      "x": 1229.6802649350168,
      "y": 478.10460300213657
    },
    {
      "name": "Pcmq2",
      "initialMarking": 1,
      "stringMarking": "CMQ",
      "initialStringMarking": "CMQ",
      "id": "p13",
      "x": 1222.0058463767857,
      "y": 365.54646414808036
    },
    {
      "name": "Pcrm",
      "initialMarking": 2,
      "stringMarking": "CRM",
      "initialStringMarking": "CRM",
      "id": "p14",
      "x": 512.1221297404084,
      "y": 637.9883229652846,
      "labelX": 512.1221297404084,
      "labelY": 608.1496146275742
    },
    {
      "name": "PrmAP",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p15",
      "x": 502.55123821580054,
      "y": 794.3371590837155
    },
    {
      "name": "PrmF",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p16",
      "x": 735.9593376888156,
      "y": 804.2673917269585
    },
    {
      "name": "Pmq3",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p17",
      "x": 1017.3546848239562,
      "y": 811.9418102851896,
      "labelX": 1017.3546848239562,
      "labelY": 851.9418102851896
    },
    {
      "name": "Pem",
      "initialMarking": 0,
      "stringMarking": "0",
      "initialStringMarking": "0",
      "id": "p18",
      "x": 1234.7965439738375,
      "y": 801.709252207548,
      "labelX": 1234.7965439738375,
      "labelY": 844.2673917269585
    },
    {
      "name": "Pcem",
      "initialMarking": 2,
      "stringMarking": "CEM",
      "initialStringMarking": "CEM",
      "id": "p19",
      "x": 1232.2384044544272,
      "y": 696.825531911723,
      "labelX": 1232.2384044544272,
      "labelY": 736.825531911723
    },
    {
      "name": "Pcmq3",
      "initialMarking": 1,
      "stringMarking": "CMQ",
      "initialStringMarking": "CMQ",
      "id": "p20",
      "x": 1010.9593360254303,
      "y": 704.4999504699541
    }
  ],
  "definitions": [
    {
      "name": "TAFP",
      "type": "DOUBLE",
      "value": "60",
      "id": "def0"
    },
    {
      "name": "T1",
      "type": "DOUBLE",
      "value": "0.4427",
      "id": "def1"
    },
    {
      "name": "T2",
      "type": "DOUBLE",
      "value": "0.0001",
      "id": "def2"
    },
    {
      "name": "T3",
      "type": "DOUBLE",
      "value": "0.0033",
      "id": "def3"
    },
    {
      "name": "T4",
      "type": "DOUBLE",
      "value": "0.0945",
      "id": "def4"
    },
    {
      "name": "T5",
      "type": "DOUBLE",
      "value": "0.643",
      "id": "def5"
    },
    {
      "name": "T6",
      "type": "DOUBLE",
      "value": "0.0001",
      "id": "def6"
    },
    {
      "name": "T7",
      "type": "DOUBLE",
      "value": "0.0027",
      "id": "def7"
    },
    {
      "name": "T8",
      "type": "DOUBLE",
      "value": "0.0015",
      "id": "def8"
    },
    {
      "name": "T9",
      "type": "DOUBLE",
      "value": "0.0052",
      "id": "def9"
    },
    {
      "name": "T10",
      "type": "DOUBLE",
      "value": "0.0001",
      "id": "def10"
    },
    {
      "name": "T11",
      "type": "DOUBLE",
      "value": "0.0084",
      "id": "def11"
    },
    {
      "name": "CAP",
      "type": "INTEGER",
      "value": "1",
      "id": "def12"
    },
    {
      "name": "CFC",
      "type": "INTEGER",
      "value": "1",
      "id": "def13"
    },
    {
      "name": "CRM",
      "type": "INTEGER",
      "value": "2",
      "id": "def14"
    },
    {
      "name": "CMQ",
      "type": "INTEGER",
      "value": "1",
      "id": "def15"
    },
    {
      "name": "CEM",
      "type": "INTEGER",
      "value": "2",
      "id": "def16"
    }
  ],
  "rewardMeasures": [
    {
      "name": "TP",
      "expression": "E{#Pem} / T11",
      "id": "rm0"
    },
    {
      "name": "MRT",
      "expression": "IF E{#Pem} > 0 THEN ((E{#PfpMI} + E{#Pfp} + E{#Pmq1} + E{#PfcMI} + E{#PfcPM} + E{#PfcF} + E{#Pmq2} + E{#PrmAP} + E{#PrmF} + E{#Pmq3} + E{#Pem}) * T11) / E{#Pem} ELSE 0",
      "id": "rm1"
    },
    {
      "name": "DP",
      "expression": "P{(#Pccap = 0) AND (#Paqfp > 0)} * 100",
      "id": "rm2"
    },
    {
      "name": "FC_U",
      "expression": "((E{#PfcMI} + E{#PfcPM} + E{#PfcF}) / CFC) * 100",
      "id": "rm3"
    },
    {
      "name": "CMQ_U",
      "expression": "((E{#Pmq1} + E{#Pmq2} + E{#Pmq3}) / CMQ) * 100",
      "id": "rm4"
    }
  ],
  "transitions": [
    {
      "name": "Tafp",
      "type": "TIMED",
      "firingPolicy": "SINGLE_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "Pafp",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Paqfp",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "TAFP"
        }
      },
      "id": "t1",
      "x": 299.4544595267844,
      "y": 185.34091186523438,
      "labelX": 299.4544595267844,
      "labelY": 225.34091186523438
    },
    {
      "name": "T1",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "PfpMI",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Pfp",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T1"
        }
      },
      "id": "t2",
      "x": 806.0996344821381,
      "y": 197.34091186523438,
      "labelX": 806.0996344821381,
      "labelY": 236.34091186523438
    },
    {
      "name": "T2",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "Pfp",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "INPUT",
          "place": "Pcmq1",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Pmq1",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "OUTPUT",
          "place": "Pccap",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T2"
        }
      },
      "id": "t3",
      "x": 1122.4709631974226,
      "y": 203.34091186523438
    },
    {
      "name": "T3",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "Pmq1",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "INPUT",
          "place": "Pcfc",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Pcmq1",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "OUTPUT",
          "place": "PfcMI",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T3"
        }
      },
      "id": "t4",
      "x": 1361.5512243721414,
      "y": 207.92155815783448,
      "labelX": 1381.4544521434996,
      "labelY": 215.94481416520486
    },
    {
      "name": "Ti1",
      "type": "IMMEDIATE",
      "firingPolicy": "SINGLE_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "Paqfp",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "INPUT",
          "place": "Pccap",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "PfpMI",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "OUTPUT",
          "place": "Pafp",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "weight": 1,
      "id": "t5",
      "x": 536.5512382158005,
      "y": 195.502203527524,
      "labelX": 536.5512382158005,
      "labelY": 237.34091186523438
    },
    {
      "name": "T4",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "PfcMI",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "PfcPM",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T4"
        }
      },
      "id": "t6",
      "x": 627.2384081138749,
      "y": 471.70925420361067,
      "labelX": 627.2384081138749,
      "labelY": 511.70925420361067
    },
    {
      "name": "T5",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "PfcPM",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "PfcF",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T5"
        }
      },
      "id": "t7",
      "x": 883.0523600549118,
      "y": 481.9418122812521,
      "labelX": 883.0523600549118,
      "labelY": 520.662742521547
    },
    {
      "name": "T6",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "PfcF",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "INPUT",
          "place": "Pcmq2",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Pmq2",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "OUTPUT",
          "place": "Pcfc",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T6"
        }
      },
      "id": "t8",
      "x": 1132.4709631974226,
      "y": 479.38367276184175,
      "labelX": 1133.7500329571278,
      "labelY": 519.3836727618418
    },
    {
      "name": "T7",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "Pmq2",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "INPUT",
          "place": "Pcrm",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Pcmq2",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "OUTPUT",
          "place": "PrmAP",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T7"
        }
      },
      "id": "t9",
      "x": 1341.5512243721414,
      "y": 481.9418122812521,
      "labelX": 1364.5744800468347,
      "labelY": 489.9650682886225
    },
    {
      "name": "T8",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "PrmAP",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "PrmF",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T8"
        }
      },
      "id": "t10",
      "x": 617.0058500362335,
      "y": 805.5464614866637
    },
    {
      "name": "T9",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "PrmF",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "INPUT",
          "place": "Pcmq3",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Pmq3",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "OUTPUT",
          "place": "Pcrm",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T9"
        }
      },
      "id": "t11",
      "x": 879.2151507757962,
      "y": 814.4999498046,
      "labelX": 879.2151507757962,
      "labelY": 851.9418102851896
    },
    {
      "name": "T10",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "Pmq3",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "INPUT",
          "place": "Pcem",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Pem",
          "multiplicity": 1,
          "weight": 1
        },
        {
          "type": "OUTPUT",
          "place": "Pcmq3",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T10"
        }
      },
      "id": "t12",
      "x": 1132.4709631974226,
      "y": 818.3371590837155
    },
    {
      "name": "T11",
      "type": "TIMED",
      "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY",
      "priority": 1,
      "inputArcs": [
        {
          "type": "INPUT",
          "place": "Pem",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "outputArcs": [
        {
          "type": "OUTPUT",
          "place": "Pcem",
          "multiplicity": 1,
          "weight": 1
        }
      ],
      "inhibitorArcs": [],
      "distribution": {
        "type": "exponential",
        "parameters": {
          "Mean delay": "T11"
        }
      },
      "id": "t13",
      "x": 1338.4011945099576,
      "y": 814.4999498046,
      "labelX": 1338.4011945099576,
      "labelY": 851.9418102851896
    }
  ],
  "visualElements": [],
  "arcs": [
    {
      "id": "a1",
      "source": "p1",
      "target": "t1",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 207.6896725021599,
      "lineType": "straight"
    },
    {
      "id": "a2",
      "source": "t1",
      "target": "p2",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a3",
      "source": "p2",
      "target": "t5",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 198.43494882292202,
      "lineType": "straight"
    },
    {
      "id": "a4",
      "source": "t5",
      "target": "p3",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a5",
      "source": "p3",
      "target": "t2",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 195.51590893364124,
      "lineType": "straight"
    },
    {
      "id": "a6",
      "source": "t2",
      "target": "p4",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 190.53088385739326,
      "lineType": "straight"
    },
    {
      "id": "a7",
      "source": "p4",
      "target": "t3",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 205.53489578153696,
      "lineType": "straight"
    },
    {
      "id": "a8",
      "source": "t3",
      "target": "p5",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a9",
      "source": "p5",
      "target": "t4",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 190.6591428975529,
      "lineType": "straight"
    },
    {
      "id": "a10",
      "source": "t4",
      "target": "p6",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 0,
      "lineType": "straight"
    },
    {
      "id": "a11",
      "source": "p6",
      "target": "t3",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "left",
      "targetAnchorAngle": 300.62864839637075,
      "lineType": "straight"
    },
    {
      "id": "a12",
      "source": "t3",
      "target": "p7",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 0,
      "lineType": "right-angle"
    },
    {
      "id": "a13",
      "source": "p7",
      "target": "t5",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "left",
      "targetAnchorAngle": 305.17313428053467,
      "lineType": "right-angle",
      "waypoints": [
        {
          "x": 539.5512382158005,
          "y": 101.46994704088726
        }
      ]
    },
    {
      "id": "a14",
      "source": "t5",
      "target": "p1",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 292.91433571071684,
      "lineType": "right-angle",
      "waypoints": [
        {
          "x": 536.5512382158005,
          "y": 85.96506895397667
        },
        {
          "x": 201.0028419494629,
          "y": 85.96506895397667
        }
      ]
    },
    {
      "id": "a15",
      "source": "t4",
      "target": "p9",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "bottom",
      "targetAnchorAngle": 180,
      "lineType": "right-angle"
    },
    {
      "id": "a17",
      "source": "p8",
      "target": "t4",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 90,
      "lineType": "right-angle",
      "waypoints": [
        {
          "x": 1361.5512243721414,
          "y": 306.7557665510285
        }
      ]
    },
    {
      "id": "a19",
      "source": "p9",
      "target": "t6",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 194.93141717813768,
      "lineType": "straight"
    },
    {
      "id": "a20",
      "source": "t6",
      "target": "p10",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 166.75948008481282,
      "lineType": "straight"
    },
    {
      "id": "a21",
      "source": "p10",
      "target": "t7",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 206.56505117707798,
      "lineType": "straight"
    },
    {
      "id": "a22",
      "source": "t7",
      "target": "p11",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 150.64224645720878,
      "lineType": "straight"
    },
    {
      "id": "a23",
      "source": "p11",
      "target": "t8",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a24",
      "source": "t8",
      "target": "p12",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a25",
      "source": "p12",
      "target": "t9",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 191.88865803962798,
      "lineType": "straight"
    },
    {
      "id": "a26",
      "source": "t9",
      "target": "p13",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 0,
      "lineType": "straight"
    },
    {
      "id": "a16",
      "source": "p13",
      "target": "t8",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "left",
      "targetAnchorAngle": 270,
      "lineType": "straight"
    },
    {
      "id": "a18",
      "source": "t8",
      "target": "p8",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 14.036243467926624,
      "lineType": "right-angle"
    },
    {
      "id": "a27",
      "source": "p14",
      "target": "t9",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 90,
      "lineType": "right-angle"
    },
    {
      "id": "a28",
      "source": "t9",
      "target": "p15",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "bottom",
      "targetAnchorAngle": 180,
      "lineType": "right-angle"
    },
    {
      "id": "a30",
      "source": "p15",
      "target": "t10",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a31",
      "source": "t10",
      "target": "p16",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a32",
      "source": "p16",
      "target": "t11",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a33",
      "source": "t11",
      "target": "p17",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a34",
      "source": "p17",
      "target": "t12",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 196.69924423399362,
      "lineType": "straight"
    },
    {
      "id": "a35",
      "source": "t12",
      "target": "p18",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a36",
      "source": "p18",
      "target": "t13",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "right",
      "targetAnchorAngle": 180,
      "lineType": "straight"
    },
    {
      "id": "a37",
      "source": "t13",
      "target": "p19",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 0,
      "lineType": "straight"
    },
    {
      "id": "a38",
      "source": "p19",
      "target": "t12",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "left",
      "targetAnchorAngle": 261.86989764584405,
      "lineType": "straight"
    },
    {
      "id": "a39",
      "source": "t12",
      "target": "p20",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 344.05460409907715,
      "lineType": "straight"
    },
    {
      "id": "a40",
      "source": "p20",
      "target": "t11",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "left",
      "targetAnchorAngle": 270,
      "lineType": "straight"
    },
    {
      "id": "a41",
      "source": "t11",
      "target": "p14",
      "type": "normal",
      "weight": "1",
      "sourceAnchor": "top",
      "targetAnchorAngle": 90,
      "lineType": "right-angle"
    }
  ],
  "chartSquare": false,
  "executions": []
}

Empirically Calibrated Delays ​

All service durations were collected from empirical production metrics (expressed in seconds):

StageOperationMean Delay
$T_1$Frame capture60.0 s
$T_2$Upload to storage0.4427 s
$T_3$Broker notification0.0001 s
$T_4$Delivery to consumer0.0033 s
$T_5$Download from storage0.0945 s
$T_6$Neural fire detection inference0.6430 s
$T_7$Rule evaluation0.0015 s
$T_8$Database persistence0.0084 s

Notice the wide spread across scales: while broker notification takes a fraction of a millisecond, neural inference requires 643 milliseconds — standing out as the primary isolated bottleneck.


Configured Performance Metrics ​

The model evaluates three primary metrics:

  1. MRT (Mean Response Time): Total end-to-end latency from camera capture to final database commit.
  2. TP (Throughput): Completed frames processed per second.
  3. FC_U (Fire Classifier Utilization): Utilization percentage of neural inference workers.

Validation Against Physical Reality ​

The real-world system was monitored continuously in the field over nearly three days, processing 3,755 frames. Measured physical performance was compared directly with Jupiter's stochastic simulation:

SourceMean Response Time (MRT)
Empirical field telemetry (3 days)1.2016 s
Published theoretical analytical model1.2013 s
Jupiter stochastic simulation1.2114 s

The difference between Jupiter's simulation and physical reality is less than 1%!

Why the tiny divergence?

The static arithmetic sum of all stages equals 1.2016 s (the delay of an item encountering zero queueing anywhere). Jupiter's result is slightly higher (1.2114 s) because it accounts for stochastic queuing when consecutive frames compete for the classifier.


Scalability Study (Scenario Analysis) ​

With the model validated, we can explore scalability under extreme workload conditions that could not be injected into production.

Sweeping the number of parallel neural inference nodes in the Scenarios tab:

Parallel Classifier NodesMax Supported ThroughputResponse Time Under Heavy Load
1 node1.24 frames/s2.16 s
2 nodes1.89 frames/s1.44 s
4 nodes2.15 frames/s1.22 s

Key Findings: ​

  1. With 1 node, the system saturates at 1.24 frames/s: The classifier is the active bottleneck ($0.643\text{ s}$).
  2. Doubling to 2 nodes cuts response time dramatically: Latency drops from 2.16 s to 1.44 s.
  3. Quadrupling nodes yields diminishing returns: Moving from 2 to 4 nodes only nudges throughput from 1.89 to 2.15 frames/s. This is because the bottleneck has shifted: now the upload to storage ($0.4427\text{ s}$) limits overall capacity.

This demonstrates the core value of stochastic modeling: identifying exactly when scaling a resource stops paying off before another component becomes the limiting constraint.

Next steps ​

For reference tables, error messages, and formal grammar rules, see 7 · Reference.