61 lines
2.3 KiB
Python
61 lines
2.3 KiB
Python
import numpy as np
|
|
from backend.data_types import LineData
|
|
from backend.node_registry import get_node_info
|
|
from backend.execution_context import active_node, execution_callbacks
|
|
from tests.node_tests._shared import make_field
|
|
|
|
|
|
def test_fractal_dimension():
|
|
from backend.nodes.fractal_dimension import FractalDimension
|
|
|
|
node = FractalDimension()
|
|
assert get_node_info("FractalDimension")["category"] == "Measure"
|
|
|
|
N = 129
|
|
yy, xx = np.mgrid[0:N, 0:N] / (N - 1)
|
|
data = 0.25 * xx + 0.12 * yy + 0.03 * np.sin(6.0 * np.pi * xx) + 0.02 * np.cos(4.0 * np.pi * yy)
|
|
field = make_field(data=data, xreal=4.0e-6, yreal=4.0e-6)
|
|
|
|
overlays = []
|
|
tables = []
|
|
with execution_callbacks(
|
|
overlay=lambda nid, payload: overlays.append(payload),
|
|
table=lambda nid, rows: tables.append(rows),
|
|
), active_node("test"):
|
|
dimension, curve, table = node.process(
|
|
field, method="partitioning", interpolation="linear", x1=0.0, y1=0.5, x2=1.0, y2=0.5,
|
|
)
|
|
|
|
assert np.isfinite(dimension)
|
|
assert 1.5 < dimension < 2.5
|
|
assert isinstance(curve, LineData)
|
|
assert len(curve) > 3
|
|
assert curve.x_axis is not None
|
|
assert np.all(np.diff(curve.x_axis) > 0.0)
|
|
assert len(overlays) == 1
|
|
assert overlays[0]["kind"] == "line_plot"
|
|
assert len(tables) == 1
|
|
assert table[0]["quantity"] == "Dimension"
|
|
|
|
methods = ["partitioning", "cube_counting", "triangulation", "psdf", "hhcf"]
|
|
for method in methods:
|
|
dim, line, measurements = node.process(
|
|
field, method=method, interpolation="linear", x1=0.0, y1=0.5, x2=1.0, y2=0.5,
|
|
)
|
|
assert np.isfinite(dim), f"{method} should produce a finite fractal dimension"
|
|
if method == "psdf":
|
|
assert -1.0 < dim < 3.2
|
|
else:
|
|
assert 1.2 < dim < 3.2
|
|
assert isinstance(line, LineData)
|
|
assert len(line) >= 2
|
|
assert measurements[0]["quantity"] == "Dimension"
|
|
|
|
narrowed_dim, _, narrowed_table = node.process(
|
|
field, method="partitioning", interpolation="linear", x1=0.15, y1=0.5, x2=0.55, y2=0.5,
|
|
)
|
|
assert np.isfinite(narrowed_dim)
|
|
fit_from = next(row["value"] for row in narrowed_table if row["quantity"] == "Fit from")
|
|
fit_to = next(row["value"] for row in narrowed_table if row["quantity"] == "Fit to")
|
|
assert fit_to > fit_from
|