feat: implement cluster averaging pipeline, UI controls
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
"""Tests for src/pygui/backend/cluster_average.py."""
|
||||
import math
|
||||
import pytest
|
||||
from pygui.backend.cluster_average import average_clusters, group_sensors_by_radius
|
||||
from pygui.backend.wafer.zwafer_models import Sensor
|
||||
|
||||
|
||||
def test_members_take_cluster_mean():
|
||||
vals = [10.0, 20.0, 100.0, 0.0]
|
||||
clusters = [[0, 1], [2, 3]]
|
||||
assert average_clusters(vals, clusters) == [15.0, 15.0, 50.0, 50.0]
|
||||
|
||||
|
||||
def test_unclustered_sensors_unchanged():
|
||||
vals = [10.0, 20.0, 30.0]
|
||||
assert average_clusters(vals, [[0, 1]]) == [15.0, 15.0, 30.0]
|
||||
|
||||
|
||||
def test_empty_clusters_is_identity():
|
||||
assert average_clusters([1.0, 2.0], []) == [1.0, 2.0]
|
||||
|
||||
|
||||
def test_nan_handling_in_averaging():
|
||||
vals = [10.0, float('nan'), 100.0, float('nan')]
|
||||
clusters = [[0, 1], [2, 3]]
|
||||
res = average_clusters(vals, clusters)
|
||||
assert res[0] == 10.0
|
||||
assert res[1] == 10.0
|
||||
assert res[2] == 100.0
|
||||
assert res[3] == 100.0
|
||||
|
||||
|
||||
def test_all_nan_cluster():
|
||||
vals = [float('nan'), float('nan'), 5.0]
|
||||
clusters = [[0, 1]]
|
||||
res = average_clusters(vals, clusters)
|
||||
assert math.isnan(res[0])
|
||||
assert math.isnan(res[1])
|
||||
assert res[2] == 5.0
|
||||
|
||||
|
||||
def test_group_by_radius():
|
||||
sensors = [
|
||||
Sensor(label="1", x=0.0, y=0.0), # center (r=0)
|
||||
Sensor(label="2", x=10.0, y=0.0), # r=10
|
||||
Sensor(label="3", x=0.0, y=10.5), # r=10.5 (within 2mm)
|
||||
Sensor(label="4", x=20.0, y=0.0), # r=20
|
||||
]
|
||||
# Center should be excluded or not grouped; other sensors grouped
|
||||
clusters = group_sensors_by_radius(sensors, tolerance=2.0)
|
||||
# Expected: 2 and 3 are in the same cluster because 10.5 - 10.0 <= 2.0.
|
||||
assert [1, 2] in clusters
|
||||
Reference in New Issue
Block a user