amachine.am_cohesion
1from abc import ABC, abstractmethod 2import warnings 3from dataclasses import dataclass 4 5class CohesionKernel(ABC): 6 """ 7 Defines the substitution weight distributions over target symbols 8 given a source symbol. 9 """ 10 11 def _normalize(self, source : str, dist: dict[str, float]) -> dict[str, float]: 12 wsum = sum(w for w in dist.values()) 13 if wsum <= 1e-15: 14 warnings.warn( "Weight function sums to 0, implicitly mapping source with probability 1" ) 15 res = dist.copy() 16 res[ source ] = 1.0 17 return res 18 return {s: w / wsum for s, w in dist.items()} 19 20 @abstractmethod 21 def cohesion_scores( self, source: str, symbols: set[str] ) -> dict[str, float]: 22 """ 23 Maps a source symbol to a distribution of cohesion scores over other symbols. 24 """ 25 26@dataclass 27class Uniform(CohesionKernel): 28 def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]: 29 return { s: 1.0 for s in symbols } 30 31@dataclass 32class Marginal(CohesionKernel): 33 """Per-symbol weight distribution.""" 34 scores : dict[str, float] 35 36 def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]: 37 return {s: self.scores[s] for s in symbols } 38 39@dataclass 40class Symmetric(CohesionKernel): 41 """w(a->b) == w(b->a)""" 42 scores : dict[frozenset, float] 43 def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]: 44 return {s: self.scores[frozenset({source, s})] for s in symbols } 45 46@dataclass 47class Asymmetric(CohesionKernel): 48 """Directed pairwise scores.""" 49 scores : dict[tuple[str,str], float] 50 51 def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]: 52 return {s: self.scores[(source, s)] for s in symbols }
class
CohesionKernel(abc.ABC):
6class CohesionKernel(ABC): 7 """ 8 Defines the substitution weight distributions over target symbols 9 given a source symbol. 10 """ 11 12 def _normalize(self, source : str, dist: dict[str, float]) -> dict[str, float]: 13 wsum = sum(w for w in dist.values()) 14 if wsum <= 1e-15: 15 warnings.warn( "Weight function sums to 0, implicitly mapping source with probability 1" ) 16 res = dist.copy() 17 res[ source ] = 1.0 18 return res 19 return {s: w / wsum for s, w in dist.items()} 20 21 @abstractmethod 22 def cohesion_scores( self, source: str, symbols: set[str] ) -> dict[str, float]: 23 """ 24 Maps a source symbol to a distribution of cohesion scores over other symbols. 25 """
Defines the substitution weight distributions over target symbols given a source symbol.
@abstractmethod
def
cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
21 @abstractmethod 22 def cohesion_scores( self, source: str, symbols: set[str] ) -> dict[str, float]: 23 """ 24 Maps a source symbol to a distribution of cohesion scores over other symbols. 25 """
Maps a source symbol to a distribution of cohesion scores over other symbols.
32@dataclass 33class Marginal(CohesionKernel): 34 """Per-symbol weight distribution.""" 35 scores : dict[str, float] 36 37 def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]: 38 return {s: self.scores[s] for s in symbols }
Per-symbol weight distribution.
40@dataclass 41class Symmetric(CohesionKernel): 42 """w(a->b) == w(b->a)""" 43 scores : dict[frozenset, float] 44 def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]: 45 return {s: self.scores[frozenset({source, s})] for s in symbols }
w(a->b) == w(b->a)
def
cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
44 def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]: 45 return {s: self.scores[frozenset({source, s})] for s in symbols }
Maps a source symbol to a distribution of cohesion scores over other symbols.
47@dataclass 48class Asymmetric(CohesionKernel): 49 """Directed pairwise scores.""" 50 scores : dict[tuple[str,str], float] 51 52 def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]: 53 return {s: self.scores[(source, s)] for s in symbols }
Directed pairwise scores.