164 lines
5.0 KiB
Python
164 lines
5.0 KiB
Python
from __future__ import annotations
|
|
|
|
import numpy as np
|
|
import pytest
|
|
|
|
from k1link.compute.e41_evaluation_boundary import (
|
|
E41EvaluationBoundaryError,
|
|
evaluate_visible_engineering_contract,
|
|
predict_from_frozen_e40_model,
|
|
)
|
|
|
|
|
|
def _model() -> dict[str, object]:
|
|
return {
|
|
"schema_version": "missioncore.e40-development-product-model/v1",
|
|
"feature_names": ["signal"],
|
|
"validation_labels_used_for_training": False,
|
|
"robust_clip": 10.0,
|
|
"fixed_presence_by_stratum": {
|
|
"agree": "object-present",
|
|
"conflict": "background-or-noise",
|
|
"geometry-only": "occupied-environment",
|
|
"unknown": "object-present",
|
|
},
|
|
"dimension_projection": "source-stratum-plus-presence/v1",
|
|
"classifier": {
|
|
"type": "deterministic-softmax",
|
|
"labels": [
|
|
"background-or-noise",
|
|
"object-present",
|
|
"occupied-environment",
|
|
],
|
|
"weights": [
|
|
[-2.0, 2.0, 0.0],
|
|
[0.0, 0.0, 0.0],
|
|
],
|
|
"scaler": {
|
|
"median": [0.0],
|
|
"scale": [1.0],
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
def test_e41_predictor_output_is_truth_free_and_deterministic() -> None:
|
|
items = [
|
|
{
|
|
"schema_version": "missioncore.e41-predictor-item/v1",
|
|
"sequence": 0,
|
|
"item_id": "a",
|
|
"source_stratum": "camera-only",
|
|
},
|
|
{
|
|
"schema_version": "missioncore.e41-predictor-item/v1",
|
|
"sequence": 1,
|
|
"item_id": "b",
|
|
"source_stratum": "geometry-only",
|
|
},
|
|
]
|
|
matrix = np.asarray([[1.0], [0.0]], dtype=np.float64)
|
|
first = predict_from_frozen_e40_model(
|
|
items=items,
|
|
feature_names=["signal"],
|
|
feature_matrix=matrix,
|
|
model=_model(),
|
|
)
|
|
second = predict_from_frozen_e40_model(
|
|
items=items,
|
|
feature_names=["signal"],
|
|
feature_matrix=matrix,
|
|
model=_model(),
|
|
)
|
|
|
|
assert first == second
|
|
assert first[0]["prediction"]["presence"] == "object-present"
|
|
assert first[1]["prediction"]["presence"] == "occupied-environment"
|
|
assert not any(
|
|
forbidden in row
|
|
for row in first
|
|
for forbidden in ("reference", "scored", "severity", "split", "truth")
|
|
)
|
|
|
|
|
|
def test_e41_predictor_rejects_truth_bearing_item_metadata() -> None:
|
|
with pytest.raises(E41EvaluationBoundaryError, match="truth/evaluation"):
|
|
predict_from_frozen_e40_model(
|
|
items=[
|
|
{
|
|
"sequence": 0,
|
|
"item_id": "a",
|
|
"source_stratum": "camera-only",
|
|
"reference": {"presence": "object-present"},
|
|
}
|
|
],
|
|
feature_names=["signal"],
|
|
feature_matrix=np.asarray([[1.0]], dtype=np.float64),
|
|
model=_model(),
|
|
)
|
|
|
|
|
|
def test_e41_visible_evaluator_joins_truth_after_prediction() -> None:
|
|
predictions = [
|
|
{
|
|
"item_id": "dev",
|
|
"prediction": {
|
|
"presence": "object-present",
|
|
"geometry_association": "insufficient-support",
|
|
"freshness": "unavailable",
|
|
},
|
|
},
|
|
{
|
|
"item_id": "val",
|
|
"prediction": {
|
|
"presence": "object-present",
|
|
"geometry_association": "object-associated",
|
|
"freshness": "current",
|
|
},
|
|
},
|
|
]
|
|
acceptance = [
|
|
{
|
|
"item_id": "dev",
|
|
"split": "development",
|
|
"source_stratum": "camera-only",
|
|
"severity": "standard",
|
|
"reference": {
|
|
"presence": "background-or-noise",
|
|
"geometry_association": "rejected-nonobject",
|
|
"freshness": "unavailable",
|
|
},
|
|
},
|
|
{
|
|
"item_id": "val",
|
|
"split": "validation",
|
|
"source_stratum": "agree",
|
|
"severity": "standard",
|
|
"reference": {
|
|
"presence": "object-present",
|
|
"geometry_association": "object-associated",
|
|
"freshness": "current",
|
|
},
|
|
},
|
|
]
|
|
evaluation = evaluate_visible_engineering_contract(
|
|
predictions=predictions,
|
|
acceptance_rows=acceptance,
|
|
targets={
|
|
"presence_target": 0.9,
|
|
"geometry_association_target": 0.9,
|
|
"freshness_target": 0.9,
|
|
},
|
|
label_provenance={
|
|
"engineering_items": 2,
|
|
"human_exception_items": 0,
|
|
"independent_ground_truth": False,
|
|
},
|
|
)
|
|
|
|
assert evaluation["metrics"]["validation_items"] == 1
|
|
assert evaluation["metrics"]["dimensions"]["presence"]["accuracy"] == 1.0
|
|
assert evaluation["engineering_contract_targets_reached"] is True
|
|
assert evaluation["blind_gate_eligible"] is False
|
|
assert evaluation["label_provenance"]["independent_accuracy_authority"] is False
|