Theme
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:
- Producer: Captures the camera frame and uploads it to temporary buffer storage.
- Message Broker Notice: Emits a notification to the message bus that a new frame is ready.
- Consumer: Edge processing node receives the notification.
- Download: The worker node fetches the corresponding image from storage.
- Fire Classifier Inference: Deep learning model processes the pixel matrix.
- Rule Engine: Evaluates confidence thresholds and deduplicates alerts.
- 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):
| Stage | Operation | Mean Delay |
|---|---|---|
| $T_1$ | Frame capture | 60.0 s |
| $T_2$ | Upload to storage | 0.4427 s |
| $T_3$ | Broker notification | 0.0001 s |
| $T_4$ | Delivery to consumer | 0.0033 s |
| $T_5$ | Download from storage | 0.0945 s |
| $T_6$ | Neural fire detection inference | 0.6430 s |
| $T_7$ | Rule evaluation | 0.0015 s |
| $T_8$ | Database persistence | 0.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:
MRT(Mean Response Time): Total end-to-end latency from camera capture to final database commit.TP(Throughput): Completed frames processed per second.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:
| Source | Mean Response Time (MRT) |
|---|---|
| Empirical field telemetry (3 days) | 1.2016 s |
| Published theoretical analytical model | 1.2013 s |
| Jupiter stochastic simulation | 1.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 Nodes | Max Supported Throughput | Response Time Under Heavy Load |
|---|---|---|
| 1 node | 1.24 frames/s | 2.16 s |
| 2 nodes | 1.89 frames/s | 1.44 s |
| 4 nodes | 2.15 frames/s | 1.22 s |
Key Findings:
- With 1 node, the system saturates at 1.24 frames/s: The classifier is the active bottleneck ($0.643\text{ s}$).
- Doubling to 2 nodes cuts response time dramatically: Latency drops from 2.16 s to 1.44 s.
- 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.