Metrics¶
This page records research and audit vocabulary. It is not a public CLI dashboard, a semantic verifier for hosted-model prose, or a release-gating policy. The supported read-only operational report is:
rfgen inspect STORE_URI
Current executable contracts validate configuration, storage structure, annotation overlay identity, and schema shape. They do not promise a distribution audit, PAES threshold, hallucination score, sim-to-real metric, or automatic release decision. Treat proposed metrics in historical research notes as design context until an implemented API and test explicitly expose them.
Physical Attribute Extraction Score (PAES)¶
PAES (Physical Attribute Extraction Score) scores one piece of hosted-model
text, such as an annotation caption, against physical attributes recovered
locally from the stored record it describes. compute_paes(record, text, *, model=...) in rfgen.inspection.audit is the shipped implementation; see
rfgen.inspection for its parameters and
return type. The ground truth never leaves the process: only text is sent to
the extractor, and the recovered attributes are compared against the record
locally. PAES is a recall score, the fraction of locally known ground-truth
attributes the extractor recovered correctly from text:
PAES = matches / len(A_gt) if A_gt else 1.0
A record with no available ground-truth fields scores 1.0 instead of dividing by zero.
Ground truth: constructing A_gt¶
A_gt is the set of (path, value) pairs read straight from the stored
record. The pseudocode below mirrors the private _ground_truth() helper in
rfgen.inspection.audit; the real implementation also walks per-emitter
tx_pose and radar/pulse extras fields the same way, one add() call per
field.
def construct_a_gt(record):
"""Build the local ground-truth attribute set A_gt for one stored record."""
pairs = []
def add(path, value):
if _available(value):
pairs.append((path, value))
add("scene.duration_s", record.scene.duration_s)
add("scene.num_emitters", record.scene.num_emitters)
add("scene.realized_emitter_count", record.scene.realized_emitter_count)
for key, value in record.scene.realized_snr_db_stats.items():
add(f"scene.realized_snr_db_stats.{key}", value)
for key, value in record.scene.realized_class_histogram.items():
add(f"scene.realized_class_histogram.{key}", value)
add(
"scene.realized_cochannel_overlap_rate",
record.scene.realized_cochannel_overlap_rate,
)
add("scene.realized_spectral_occupancy", record.scene.realized_spectral_occupancy)
for index, emitter in enumerate(record.emitters):
add(f"emitters[{index}].class_name", emitter.class_name)
add(f"emitters[{index}].realized_carrier_hz", emitter.realized_carrier_hz)
add(f"emitters[{index}].bandwidth_hz", emitter.bandwidth_hz)
add(f"emitters[{index}].snr_db", emitter.snr_db)
# ... remaining emitter, tx_pose, and extras fields follow the same pattern
for index, bbox in enumerate(record.bboxes):
add(f"bboxes[{index}].low_freq_hz", bbox.low_freq_hz)
add(f"bboxes[{index}].high_freq_hz", bbox.high_freq_hz)
add(f"bboxes[{index}].class_id", bbox.class_id)
# ... remaining bbox fields follow the same pattern
return pairs
Canonical units¶
All keys use these, and the extractor recovers in the same units:
Path suffix |
Canonical unit |
Extractor-recoverable unit tokens |
|---|---|---|
|
hertz (absolute RF) |
|
|
decibels |
|
|
seconds |
|
|
degrees |
|
|
meters per second |
|
The suffixes are matched exactly, not as a *_hz family. Several walked
ground-truth fields therefore fall outside this table entirely:
sample_rate_hz, and every box field — bboxes[i].low_freq_hz,
high_freq_hz, start_sample, duration_samples, class_id, and
emitter_index. None has a unit-token entry, so a string answer such as
"20 mhz" never matches; none has a dedicated tolerance branch, so a numeric
answer must equal the stored value exactly. That is strict, and deliberately
so for the identifier columns; for the continuous box edges it means a
correct-but-rounded answer scores as a miss.
paes_attribute_matches(path, expected, actual) performs the unit conversion
and the per-attribute tolerance check; see
rfgen.inspection for the full
comparison contract.