Source code for tyssue.utils.testing
import numpy as np
[docs]def effector_tester(eptm, effector):
for u in eptm.ucoords:
eptm.edge_df[u] = 0
for elem, spec in effector.specs.items():
for col in spec:
if col not in eptm.datasets[elem].columns:
eptm.datasets[elem][col] = 1.0
energy = effector.energy(eptm)
assert energy.shape == (eptm.datasets[effector.element].shape[0],)
assert np.all(np.isfinite(energy.values))
grad_s, grad_t = effector.gradient(eptm)
assert np.all(np.isfinite(grad_s))
if grad_s.shape == (eptm.Nv, eptm.dim):
assert grad_t is None
elif grad_s.shape == (eptm.Ne, eptm.dim):
assert grad_t.shape == (eptm.Ne, eptm.dim)
assert np.all(np.isfinite(grad_t))
else:
raise ValueError(
f"""
The computed gradients for effector {effector.label}
should have shape {(eptm.Ne, eptm.dim)} or {(eptm.Nv, eptm.dim)},
found {grad_s.shape}.
"""
)
[docs]def model_tester(eptm, model):
for u in eptm.ucoords:
eptm.edge_df[u] = 0
nondim_specs = {elem: {k: 1 for k in spec} for elem, spec in model.specs.items()}
dim_specs = model.dimensionalize(nondim_specs)
for elem, spec in model.specs.items():
assert set(dim_specs[elem].keys()) == set(spec.keys())
nondim_specs = model.dimensionalize(dim_specs)
for elem, spec in model.specs.items():
assert set(nondim_specs[elem].keys()) == set(spec.keys())
eptm.update_specs(dim_specs, reset=False)
energies = model.compute_energy(eptm, full_output=True)
assert len(energies) == len(model.labels)
energy = model.compute_energy(eptm, full_output=False)
assert np.isfinite(energy)
gradients = model.compute_gradient(eptm, components=True)
assert len(gradients) == len(model.labels)
gradient = model.compute_gradient(eptm, components=False)
assert gradient.shape == eptm.vert_df[eptm.coords].shape
assert np.all(np.isfinite(gradient))