low pri features
This commit is contained in:
64
tests/node_tests/dwt_anisotropy.py
Normal file
64
tests/node_tests/dwt_anisotropy.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import numpy as np
|
||||
import pytest
|
||||
from tests.node_tests._shared import make_field
|
||||
|
||||
|
||||
def test_output_shape():
|
||||
"""Anisotropy map shape must match the input field."""
|
||||
from backend.nodes.dwt_anisotropy import DWTAnisotropy
|
||||
|
||||
node = DWTAnisotropy()
|
||||
field = make_field(shape=(64, 64))
|
||||
aniso_field, stats = node.process(field, n_levels=4, ratio_threshold=0.2)
|
||||
assert aniso_field.data.shape == (64, 64)
|
||||
|
||||
|
||||
def test_isotropic_surface():
|
||||
"""A random isotropic surface should have X/Y energy ratios near 1.0."""
|
||||
from backend.nodes.dwt_anisotropy import DWTAnisotropy
|
||||
|
||||
rng = np.random.default_rng(42)
|
||||
# Use a larger field so deeper levels still have enough coefficients
|
||||
data = rng.standard_normal((128, 128))
|
||||
field = make_field(data=data)
|
||||
node = DWTAnisotropy()
|
||||
aniso_field, stats = node.process(field, n_levels=3, ratio_threshold=0.2)
|
||||
|
||||
for row in stats:
|
||||
assert 0.5 < row["ratio"] < 2.0, (
|
||||
f"Level {row['level']} ratio {row['ratio']:.3f} too far from 1.0 for isotropic surface"
|
||||
)
|
||||
|
||||
|
||||
def test_statistics_table():
|
||||
"""Statistics output is a list of dicts with the expected keys."""
|
||||
from backend.nodes.dwt_anisotropy import DWTAnisotropy
|
||||
|
||||
node = DWTAnisotropy()
|
||||
field = make_field(shape=(64, 64))
|
||||
aniso_field, stats = node.process(field, n_levels=3, ratio_threshold=0.2)
|
||||
|
||||
assert isinstance(stats, list)
|
||||
assert len(stats) == 3
|
||||
expected_keys = {"level", "x_energy", "y_energy", "ratio", "anisotropic"}
|
||||
for row in stats:
|
||||
assert isinstance(row, dict)
|
||||
assert set(row.keys()) == expected_keys
|
||||
|
||||
|
||||
def test_anisotropic_detection():
|
||||
"""Horizontal stripes should produce a ratio clearly different from 1.0."""
|
||||
from backend.nodes.dwt_anisotropy import DWTAnisotropy
|
||||
|
||||
# Create horizontal stripes: constant along columns, varying along rows
|
||||
data = np.tile(np.sin(np.linspace(0, 10 * np.pi, 64)), (64, 1))
|
||||
field = make_field(data=data)
|
||||
node = DWTAnisotropy()
|
||||
aniso_field, stats = node.process(field, n_levels=4, ratio_threshold=0.2)
|
||||
|
||||
# At least one level should show a ratio far from 1.0
|
||||
has_anisotropic = any(abs(row["ratio"] - 1.0) > 0.2 for row in stats)
|
||||
assert has_anisotropic, (
|
||||
f"Expected anisotropic detection for horizontal stripes, ratios: "
|
||||
f"{[row['ratio'] for row in stats]}"
|
||||
)
|
||||
Reference in New Issue
Block a user