GitLab Repo

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.

@dataclass
class Uniform(CohesionKernel):
27@dataclass
28class Uniform(CohesionKernel):
29    def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
30        return { s: 1.0 for s in symbols }
def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
29    def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
30        return { s: 1.0 for s in symbols }

Maps a source symbol to a distribution of cohesion scores over other symbols.

@dataclass
class Marginal(CohesionKernel):
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.

Marginal(scores: dict[str, float])
scores: dict[str, float]
def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
37    def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
38        return {s: self.scores[s] for s in symbols }

Maps a source symbol to a distribution of cohesion scores over other symbols.

@dataclass
class Symmetric(CohesionKernel):
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)

Symmetric(scores: dict[frozenset, float])
scores: dict[frozenset, float]
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.

@dataclass
class Asymmetric(CohesionKernel):
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.

Asymmetric(scores: dict[tuple[str, str], float])
scores: dict[tuple[str, str], float]
def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
52    def cohesion_scores(self, source: str, symbols: set[str]) -> dict[str, float]:
53        return {s: self.scores[(source, s)] for s in symbols }

Maps a source symbol to a distribution of cohesion scores over other symbols.