65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
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]}"
|
|
)
|