fix: harden simulator data contracts
This commit is contained in:
+79
-23
@@ -1,14 +1,31 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://micarrsim.local/schemas/result.schema.json",
|
||||
"title": "micarrsim result summary",
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["schemaVersion", "kind", "experimentId", "createdAt", "backend", "inputHash", "timingMs", "bands"],
|
||||
"title": "micarrsim simulation result",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"schemaVersion", "kind", "experimentId", "arrayId", "sceneId", "createdAt", "backend",
|
||||
"inputHash", "signalStats", "timingMs", "bands"
|
||||
],
|
||||
"properties": {
|
||||
"schemaVersion": { "const": "1.0.0" }, "kind": { "const": "micarrsim.result" },
|
||||
"schemaVersion": { "const": "1.0.0" },
|
||||
"kind": { "const": "micarrsim.result" },
|
||||
"experimentId": { "type": "string", "minLength": 1 },
|
||||
"createdAt": { "type": "string", "format": "date-time" }, "backend": { "enum": ["cpu", "webgpu"] },
|
||||
"arrayId": { "type": "string", "minLength": 1 },
|
||||
"sceneId": { "type": "string", "minLength": 1 },
|
||||
"createdAt": { "type": "string", "format": "date-time" },
|
||||
"backend": { "enum": ["cpu", "webgpu"] },
|
||||
"inputHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
||||
"signalStats": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["preNormalizationPeak", "appliedScale", "clippedSampleCount"],
|
||||
"properties": {
|
||||
"preNormalizationPeak": { "type": "number", "minimum": 0 },
|
||||
"appliedScale": { "type": "number", "minimum": 0 },
|
||||
"clippedSampleCount": { "type": "integer", "minimum": 0 }
|
||||
}
|
||||
},
|
||||
"timingMs": {
|
||||
"type": "object", "additionalProperties": false, "required": ["total", "beamforming"],
|
||||
"properties": {
|
||||
@@ -19,24 +36,63 @@
|
||||
},
|
||||
"environment": { "type": "object", "additionalProperties": { "type": ["string", "number", "boolean"] } },
|
||||
"bands": {
|
||||
"type": "array", "minItems": 1,
|
||||
"items": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["id", "peakPosition", "peakValue", "metrics"],
|
||||
"properties": {
|
||||
"id": { "type": "string", "minLength": 1 },
|
||||
"peakPosition": {
|
||||
"type": "array", "prefixItems": [{ "type": "number" }, { "type": "number" }, { "type": "number" }],
|
||||
"items": false, "minItems": 3, "maxItems": 3
|
||||
},
|
||||
"peakValue": { "type": "number", "minimum": 0 },
|
||||
"metrics": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["localizationErrorM", "peakToSidelobeDb"],
|
||||
"properties": {
|
||||
"localizationErrorM": { "type": "number", "minimum": 0 }, "peakToSidelobeDb": { "type": "number" },
|
||||
"energyInsideTruthRatio": { "type": "number", "minimum": 0, "maximum": 1 }
|
||||
}
|
||||
"type": "array", "minItems": 1, "maxItems": 8,
|
||||
"items": { "$ref": "#/$defs/bandResult" }
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"position": {
|
||||
"type": "array",
|
||||
"prefixItems": [{ "type": "number" }, { "type": "number" }, { "type": "number" }],
|
||||
"items": false, "minItems": 3, "maxItems": 3
|
||||
},
|
||||
"map": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["rows", "columns", "scale", "values"],
|
||||
"properties": {
|
||||
"rows": { "type": "integer", "minimum": 1, "maximum": 512 },
|
||||
"columns": { "type": "integer", "minimum": 1, "maximum": 512 },
|
||||
"scale": { "enum": ["power", "normalized", "db"] },
|
||||
"values": {
|
||||
"type": "array", "minItems": 1, "maxItems": 262144,
|
||||
"items": { "type": "number" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"peak": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["position", "value"],
|
||||
"properties": {
|
||||
"sourceId": { "type": "string", "minLength": 1 },
|
||||
"position": { "$ref": "#/$defs/position" },
|
||||
"value": { "type": "number", "minimum": 0 },
|
||||
"localizationErrorM": { "type": "number", "minimum": 0 }
|
||||
}
|
||||
},
|
||||
"processedMap": {
|
||||
"type": "object", "additionalProperties": false, "required": ["algorithm", "map"],
|
||||
"properties": {
|
||||
"algorithm": { "enum": ["damas", "clean-sc", "custom"] },
|
||||
"map": { "$ref": "#/$defs/map" }
|
||||
}
|
||||
},
|
||||
"bandResult": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["id", "color", "rawMap", "peaks", "metrics"],
|
||||
"properties": {
|
||||
"id": { "type": "string", "minLength": 1 },
|
||||
"color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
|
||||
"rawMap": { "$ref": "#/$defs/map" },
|
||||
"displayMap": { "$ref": "#/$defs/map" },
|
||||
"processedMaps": { "type": "array", "maxItems": 8, "items": { "$ref": "#/$defs/processedMap" } },
|
||||
"peaks": { "type": "array", "maxItems": 128, "items": { "$ref": "#/$defs/peak" } },
|
||||
"metrics": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"properties": {
|
||||
"peakToSidelobeDb": { "type": "number" },
|
||||
"energyInsideTruthRatio": { "type": "number", "minimum": 0, "maximum": 1 },
|
||||
"precision": { "type": "number", "minimum": 0, "maximum": 1 },
|
||||
"recall": { "type": "number", "minimum": 0, "maximum": 1 }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user