Source code for worms.criteria.base

"""TODO: Summary

Attributes:
    Ux (TYPE): Description
    Uy (TYPE): Description
    Uz (TYPE): Description
"""
import abc
import numpy as np
import homog as hm
from numpy.linalg import inv
from worms.util import jit

Ux = np.array([1, 0, 0, 0])
Uy = np.array([0, 1, 0, 0])
Uz = np.array([0, 0, 1, 0])


[docs]class WormCriteria(abc.ABC): """TODO: Summary Attributes: allowed_attributes (TYPE): Description """
[docs] @abc.abstractmethod def score(self, **kw): """TODO: Summary Args: kw: passthru args """ pass
allowed_attributes = ( 'last_body_same_as', 'symname', 'is_cyclic', 'alignment', 'from_seg', 'to_seg', 'origin_seg', 'symfile_modifiers', 'crystinfo', )
[docs]class CriteriaList(WormCriteria): """TODO: Summary Attributes: children (TYPE): Description """ def __init__(self, children): """TODO: Summary Args: children (TYPE): Description """ if isinstance(children, WormCriteria): children = [children] self.children = children
[docs] def score(self, **kw): """TODO: Summary Args: kw: passthru args Returns: TYPE: Description """ return sum(c.score(**kw) for c in self.children)
def __getattr__(self, name): """TODO: Summary Args: name (TYPE): Description Returns: TYPE: Description Raises: AttributeError: Description """ if name not in WormCriteria.allowed_attributes: raise AttributeError('CriteriaList has no attribute: ' + name) r = [getattr(c, name) for c in self.children if hasattr(c, name)] r = [x for x in r if x is not None] assert len(r) < 2 return r[0] if len(r) else None def __getitem__(self, index): """TODO: Summary Args: index (TYPE): Description Returns: TYPE: Description """ assert isinstance(index, int) return self.children[index] def __len__(self): """TODO: Summary Returns: TYPE: Description """ return len(self.children) def __iter__(self): """TODO: Summary Returns: TYPE: Description """ return iter(self.children)
[docs]class NullCriteria(WormCriteria): """TODO: Summary Attributes: from_seg (TYPE): Description to_seg (TYPE): Description """ def __init__(self, from_seg=0, to_seg=-1, origin_seg=None): """TODO: Summary Args: from_seg (int, optional): Description to_seg (TYPE, optional): Description origin_seg (None, optional): Description """ self.from_seg = from_seg self.to_seg = to_seg self.origin_seg = None self.is_cyclic = False
[docs] def score(self, segpos, **kw): """TODO: Summary Args: segpos (TYPE): Description kw: passthru args Returns: TYPE: Description """ return np.zeros(segpos[-1].shape[:-2])
[docs] def alignment(self, segpos, **kw): """TODO: Summary Args: segpos (TYPE): Description kw: passthru args Returns: TYPE: Description """ r = np.empty_like(segpos[-1]) r[..., :, :] = np.eye(4) return r
[docs] def jit_lossfunc(self): @jit def null_lossfunc(pos, idx, verts): return 0.0 return null_lossfunc