iMAKS (industrial Multi-Agent Knowledge extraction Synthetic dataset)
收藏资源简介:
iMAKS — Scientific Dataset v1.0 Synthetic, reproducible scientific dataset for the paper:Multi-Agent Knowledge Extraction and Agentic Digital Twinvia Ontology-Driven Knowledge Graphs Seed: `2026` | Days simulated: 5 | Facility: Production Line A, iMAKSGenerated by: `build_dataset.py` --- Structure overview ```iMAKS_dataset/ ├── README.md ← this file ├── sensors/ ← Layer 1: process sensor data │ ├── timeseries_annotated.csv 211,200 rows │ ├── ground_truth_labels.csv 14 anomaly events │ ├── mqtt_payloads.json 21,600 IoT payloads ├── rules/ ← Layer 1: SOP PDF documents │ ├── SOP_001_OperatingProcedures.pdf │ ├── SOP_002_AlarmThresholds.pdf │ ├── SOP_003_MaintenanceRules.pdf │ └── SOP_004_PersonnelZoneAccess.pdf ├── human/ ← Layer 2: human presence │ ├── person_registry.csv 44 persons │ ├── occupancy_timeseries.csv 211,200 rows (30-sec cadence) │ ├── access_events.csv 448 entry/exit events │ └── alarm_response_log.csv 14 GT alarm responses ├── csi/ ← Layer 3: WiFi CSI signals │ ├── soggetto 1/ ... soggetto 44/ 1,100 CSV files total │ │ ├── walking1.csv ... walking5.csv │ │ ├── falling1.csv ... falling5.csv │ │ ├── picking1.csv ... picking5.csv │ │ ├── sit_stand1.csv ... sit_stand5.csv │ │ └── standing1.csv ... standing5.csv ├── datasheets/ ← Layer 4: sensor datasheets │ ├── DS_Thermal_Sensors.pdf │ ├── DS_Mechanical_Sensors.pdf │ └── DS_Electrical_Sensors.pdf └── kg_seed/ ← Knowledge Graph ground truth ├── nodes.csv 115 nodes └── edges.csv 341 edges``` --- ## Layer 1 — Process sensor data ### Monitored stations | Station ID | Zone | Sensors ||---------------------------|------------------|--------------------|| ST01_FILLING | Production Area | TMP, PRS, FLW || ST02_SEALING | Production Area | TMP, PRS, CUR || ST03_LABELLING | Production Area | SPD, TEN, CNT || ST04_PACKAGING | Production Area | VIB, CUR, SPD || SRV01_SERVERROOM | Server Room | TMP, HUM || WRH01_WAREHOUSE | General Warehouse | TMP, HUM || CHM01_CHEMICALSTORAGE | Chemical Storage | TMP, HUM || RND01_RDLAB | R&D Lab | TMP, HUM || CAF01_CAFETERIA | Cafeteria | TMP, HUM | ### timeseries_annotated.csv30-second cadence, 5 days × 2 shifts × 22 sensors (9 stations) = **211,200 rows**.Days 1–3: development set. Days 4–5: test set. | Column | Description ||--------|-------------|| timestamp | ISO-8601 datetime || day, shift, batch_id | Temporal context || zone, station_id, sensor_id, sensor_type | Spatial context || value, unit | Sensor reading || nominal, warn_hi, crit_hi, warn_lo, crit_lo | SOP-002 reference thresholds || anomaly_label | NORMAL / SPIKE / DRIFT / STUCK / OUT_OF_RANGE / CORRELATED || severity | '' / WARNING / CRITICAL || alarm_flag | NONE / WARNING / CRITICAL || quality | GOOD / UNCERTAIN (STUCK windows) | ### ground_truth_labels.csv**14 anomaly events**, 5 distinct types.Anomaly density: ~0.73% of rows (ISA-18.2 target: 0.3–1.0%). | GT ID | Station | Sensor | Type | Severity | Timing ||-------|---------|--------|------|----------|--------|| GT-0001 | ST02_SEALING | TMP | SPIKE | CRITICAL | day 1, 2.5h, 3min || GT-0002 | ST01_FILLING | PRS | DRIFT | WARNING | day 1, 5.0h, 45min || GT-0003 | ST04_PACKAGING | VIB | DRIFT | WARNING | day 2, 1.0h, 90min || GT-0004 | ST03_LABELLING | TEN | STUCK | WARNING | day 2, 3.5h, 12min || GT-0005 | SRV01_SERVERROOM | TMP | OUT_OF_RANGE | CRITICAL | day 2, 6.0h, 20min || GT-0006 | CAF01_CAFETERIA | TMP | OUT_OF_RANGE | WARNING | day 2, 10.0h, 30min || GT-0007 | ST01_FILLING | FLW | SPIKE | WARNING | day 3, 0.5h, 2min || GT-0008 | ST02_SEALING | CUR | DRIFT | WARNING | day 3, 2.0h, 120min || GT-0009 | ST04_PACKAGING | SPD | CORRELATED | WARNING | day 3, 3.5h, 60min || GT-0010 | ST03_LABELLING | CNT | OUT_OF_RANGE | CRITICAL | day 4, 1.5h, 25min || GT-0011 | CHM01_CHEMICALSTORAGE | TMP | OUT_OF_RANGE | CRITICAL | day 4, 2.0h, 45min || GT-0012 | WRH01_WAREHOUSE | TMP | DRIFT | CRITICAL | day 4, 4.0h, 180min || GT-0013 | RND01_RDLAB | HUM | DRIFT | WARNING | day 4, 5.5h, 90min || GT-0014 | ST04_PACKAGING | VIB | SPIKE | CRITICAL | day 4, 7.0h, 1min | **GT-0008 is the CORRELATED event**: ST02_SEALING CUR DRIFT causesST04_PACKAGING SPD REDUCTION via shared electrical coupling (RULE-ST02-04).This triple requires fusion of timeseries + SOP-001 §4.2 + SOP-003 §4.It cannot be extracted by any single agent without coordination. ### mqtt_payloads.json**21,600 payloads** at 2-minute cadence.Topic schema: `plant/imaks/<zone_slug>/<station_lower>/telemetry`Each payload includes: `device`, `readings` (sensor → value/unit/quality),`status` (RUNNING / ALARM), and `alarms` array (empty when no anomaly active). ### SOP PDF documents| Document | Content | Key element ||----------|---------|-------------|| SOP-001 | Operating rules, station dependencies | RULE-ST02-04 (cross-station correlation) || SOP-002 | Quantitative alarm thresholds | Anomaly type definitions with ontology class names || SOP-003 | Predictive maintenance rules | Correlated fault resolution procedures || SOP-004 | Zone access, occupancy limits, response times | Role-zone authorisation matrix | --- Layer 2 — Human presence ### person_registry.csv**44 persons** (P001–P044), linked 1:1 to CSI dataset (soggetto 1–44). | Column | Description ||--------|-------------|| person_id | P001–P044 || csi_subject | "soggetto N" — links to Layer 3 folder name || role | operator / technician / supervisor / manager / security || shift | Morning / Afternoon || department | Production / IT / Operations / Management / Security || authorized_zones | pipe-separated list of authorised zones (from SOP-004) || max_ack_warning, max_ack_critical | Maximum ack time in minutes | Role distribution: 20 operator, 10 technician, 8 supervisor, 4 manager, 2 security. occupancy_timeseries.csv**211,200 rows** — zone presence snapshot every 30 seconds. | Column | Description ||--------|-------------|| timestamp | ISO-8601, aligned to timeseries grid || day, shift | Temporal context || zone | Zone name (respects max occupancy from SOP-004) || person_id | Links to person_registry || role | Person's role || csi_subject | "soggetto N" — **links to Layer 3** folder || csi_gesture | Gesture the person is performing at this timestamp — **links to Layer 3 file type** || zone_count | Number of active persons in the zone at this timestamp | The `csi_gesture` field is the **semantic bridge between Layer 2 and Layer 3**:it records what the CSI signal processing agent would infer for that personat that moment, enabling supervised training and evaluation. ### access_events.csv**448 events** — entry/exit at shift boundaries + 3 controlledUNAUTHORIZED_ACCESS events as ground truth for KG OccupancyEvent extraction:- Day 2: operator P005 enters Server Room (not authorised by SOP-004)- Day 3: UNKNOWN visitor at General Warehouse after hours- Day 4: operator P003 enters Server Room during CRITICAL alarm ### alarm_response_log.csv**14 responses** — one per GT event.Responder selected by role (supervisor → CRITICAL, technician → WARNING).Acknowledgment delay drawn from Gamma(shape, scale) distribution.`action_taken` uses formal SOP-004 vocabulary. --- ## Layer 3 — WiFi CSI signals **1,100 CSV files** — 44 persons × 5 gestures × 5 repetitions. ### File format (identical to real dataset)- CSV, no header, **128 integer columns**- `[0–11]` : metadata (RSSI, noise floor, rate, channel, ...)- `[12–107]` : 48 subcarriers × 2 (amplitude at even cols, phase at odd)- `[108–127]`: zero padding- Value range: −122 to +112- Sampling rate: 60 Hz ### Gestures | Gesture | Samples | Duration | Physical model ||---------|---------|----------|----------------|| walking | 180 | 3.0 s | Periodic Doppler at gait_freq (0.9–1.5 Hz) + harmonics || falling | 60 | 1.0 s | Spike at impact + floor micro-motion || picking | 150 | 2.5 s | Single bend/recover cycle || sit_stand | 120 | 2.0 s | Sigmoid CG transition || standing | 180 | 3.0 s | Breathing (0.2–0.35 Hz) + postural sway | ### Re-identification designEach person has a **stable body_signature** (body_scale, gait_freq,subcarrier_weight[48], phase_bias[48], breath_freq, speed_mult) deriveddeterministically from `person_id` (seed=2026 + pid×997). This signature modulates **all gestures**: the same RF fingerprint appearsin walking, standing, and falling files for the same person, enablingcross-gesture re-identification. Same-subject cosine similarity >0.99;cross-subject 0.19–0.43. ### Linking to Layer 2```occupancy_timeseries.csi_subject → csi/soggetto N/occupancy_timeseries.csi_gesture → csi/soggetto N/<gesture><1-5>.csvperson_registry.csi_subject → csi/soggetto N/``` --- ## Layer 4 — Sensor datasheets Three manufacturer PDF documents with **controlled quantitative tensions**against SOP-002 thresholds — the ground truth for Conflict Resolution Agent: | Datasheet | Sensors | Tension ||-----------|---------|---------|| DS_Thermal_Sensors.pdf | TMP, HUM | Manufacturer max continuous: **200°C** vs SOP-002 CRIT_HI: **210°C** || DS_Mechanical_Sensors.pdf | PRS, FLW, VIB, SPD | Recommended min alarm margin: **5× accuracy = 0.50 bar** vs WARN_LO at 0.50 bar from nominal || DS_Electrical_Sensors.pdf | CUR | Continuous overload rating: **14 A** vs SOP-002 CRIT_HI: **15 A** | --- ## Knowledge Graph seed Neo4j-compatible CSV import files. | File | Count | Node/Edge labels ||------|-------|-----------------|| nodes.csv | 115 | System, Zone, Component, Sensor, AnomalyEvent, Maintenance, Person || edges.csv | 341 | part_of, contains, monitors, feeds_into, correlates_with, triggers, resolves, authorized_for | Key edge: `ST02_SEALING_CUR --[correlates_with]--> ST04_PACKAGING_SPD`(ruleRef: RULE-ST02-04) — required for GT-0008 extraction. --- ## Cross-layer linkage map ```person_registry.person_id → occupancy_timeseries.person_id → access_events.person_id → alarm_response_log.responder_id → kg_seed/nodes.csv (Person nodes, personId field) person_registry.csi_subject ("soggetto N") → csi/soggetto N/ (Layer 3 folder) occupancy_timeseries.csi_gesture → csi/soggetto N/<gesture><1-5>.csv (Layer 3 file type) ground_truth_labels.gt_id → alarm_response_log.gt_id → kg_seed/nodes.csv (AnomalyEvent nodes, gtId field) ground_truth_labels.sensor_id → timeseries_annotated.sensor_id → kg_seed/nodes.csv (Sensor nodes, name field)``` --- ## Loading examples (Python) ```pythonimport pandas as pdimport json base = "./factory_dataset" # Layer 1 — timeseriests = pd.read_csv(f"{base}/sensors/timeseries_annotated.csv", parse_dates=["timestamp"])gt = pd.read_csv(f"{base}/sensors/ground_truth_labels.csv") # Filter anomaly rows onlyanomalies = ts[ts["anomaly_label"] != "NORMAL"] # GT-0008: the CORRELATED eventgt0008 = gt[gt["anomaly_type"] == "CORRELATED"].iloc[0]window = ts[(ts["station_id"] == gt0008["station_id"]) & (ts["timestamp"] >= gt0008["start_ts"]) & (ts["timestamp"] <= gt0008["end_ts"])] # Layer 2 — who was on site during GT-0008occ = pd.read_csv(f"{base}/human/occupancy_timeseries.csv")on_site = occ[occ["timestamp"] == gt0008["start_ts"]] # Layer 3 — load CSI for person 1, walkingimport numpy as npcsi = np.genfromtxt(f"{base}/csi/soggetto 1/walking1.csv", delimiter=",", dtype=int)amp = csi[:, 12:108:2] # 48 subcarrier amplitudes, shape (180, 48)ph = csi[:, 13:108:2] # 48 subcarrier phases # MQTTwith open(f"{base}/sensors/mqtt_payloads.json") as f: mqtt = json.load(f)alarm_payloads = [p for p in mqtt if p["status"] == "ALARM"]```



