aegis_sim.submodels.genetics.architect

Abstract away genetic architecture.

 1"""
 2Abstract away genetic architecture.
 3"""
 4
 5from aegis_sim.submodels.genetics.envdrift import Envdrift
 6from aegis_sim.submodels.genetics.composite.architecture import CompositeArchitecture
 7from aegis_sim.submodels.genetics.modifying.architecture import ModifyingArchitecture
 8from aegis_sim.dataclasses.phenotypes import Phenotypes
 9
10
11class Architect:
12    """Wrapper for a genetic architecture"""
13
14    def __init__(self, BITS_PER_LOCUS, PHENOMAP, AGE_LIMIT, THRESHOLD, ENVDRIFT_RATE, GENARCH_TYPE, MODIF_GENOME_SIZE):
15
16        assert GENARCH_TYPE in ("modifying", "composite")
17
18        if GENARCH_TYPE == "modifying":
19            assert (
20                BITS_PER_LOCUS == 1
21            ), f"BITS_PER_LOCUS should be 1 if PHENOMAP is specified but it is set to {BITS_PER_LOCUS}"
22            architecture = ModifyingArchitecture(
23                PHENOMAP=PHENOMAP,
24                AGE_LIMIT=AGE_LIMIT,
25                MODIF_GENOME_SIZE=MODIF_GENOME_SIZE,
26            )
27
28        elif GENARCH_TYPE == "composite":
29            architecture = CompositeArchitecture(
30                BITS_PER_LOCUS=BITS_PER_LOCUS,
31                AGE_LIMIT=AGE_LIMIT,
32                THRESHOLD=THRESHOLD,
33            )
34        self.architecture = architecture
35        self.envdrift = Envdrift(ENVDRIFT_RATE=ENVDRIFT_RATE, genome_shape=self.architecture.get_shape())
36
37    def __call__(self, genomes):
38        """Translate genomes into an array of phenotypes probabilities."""
39
40        # Apply the envdrift
41        envgenomes = self.envdrift.call(genomes.get_array())
42        assert envgenomes.shape == genomes.shape()  # envgenome retains the same shape as genome array
43
44        pheno_array = self.architecture.compute(envgenomes)
45        assert len(pheno_array) == len(genomes)  # no individuals are lost during the computation
46
47        smooth_pheno_array = Phenotypes.gaussian_smoothing(pheno_array)
48        phenotypes = Phenotypes(smooth_pheno_array)
49
50        return phenotypes
class Architect:
12class Architect:
13    """Wrapper for a genetic architecture"""
14
15    def __init__(self, BITS_PER_LOCUS, PHENOMAP, AGE_LIMIT, THRESHOLD, ENVDRIFT_RATE, GENARCH_TYPE, MODIF_GENOME_SIZE):
16
17        assert GENARCH_TYPE in ("modifying", "composite")
18
19        if GENARCH_TYPE == "modifying":
20            assert (
21                BITS_PER_LOCUS == 1
22            ), f"BITS_PER_LOCUS should be 1 if PHENOMAP is specified but it is set to {BITS_PER_LOCUS}"
23            architecture = ModifyingArchitecture(
24                PHENOMAP=PHENOMAP,
25                AGE_LIMIT=AGE_LIMIT,
26                MODIF_GENOME_SIZE=MODIF_GENOME_SIZE,
27            )
28
29        elif GENARCH_TYPE == "composite":
30            architecture = CompositeArchitecture(
31                BITS_PER_LOCUS=BITS_PER_LOCUS,
32                AGE_LIMIT=AGE_LIMIT,
33                THRESHOLD=THRESHOLD,
34            )
35        self.architecture = architecture
36        self.envdrift = Envdrift(ENVDRIFT_RATE=ENVDRIFT_RATE, genome_shape=self.architecture.get_shape())
37
38    def __call__(self, genomes):
39        """Translate genomes into an array of phenotypes probabilities."""
40
41        # Apply the envdrift
42        envgenomes = self.envdrift.call(genomes.get_array())
43        assert envgenomes.shape == genomes.shape()  # envgenome retains the same shape as genome array
44
45        pheno_array = self.architecture.compute(envgenomes)
46        assert len(pheno_array) == len(genomes)  # no individuals are lost during the computation
47
48        smooth_pheno_array = Phenotypes.gaussian_smoothing(pheno_array)
49        phenotypes = Phenotypes(smooth_pheno_array)
50
51        return phenotypes

Wrapper for a genetic architecture

Architect( BITS_PER_LOCUS, PHENOMAP, AGE_LIMIT, THRESHOLD, ENVDRIFT_RATE, GENARCH_TYPE, MODIF_GENOME_SIZE)
15    def __init__(self, BITS_PER_LOCUS, PHENOMAP, AGE_LIMIT, THRESHOLD, ENVDRIFT_RATE, GENARCH_TYPE, MODIF_GENOME_SIZE):
16
17        assert GENARCH_TYPE in ("modifying", "composite")
18
19        if GENARCH_TYPE == "modifying":
20            assert (
21                BITS_PER_LOCUS == 1
22            ), f"BITS_PER_LOCUS should be 1 if PHENOMAP is specified but it is set to {BITS_PER_LOCUS}"
23            architecture = ModifyingArchitecture(
24                PHENOMAP=PHENOMAP,
25                AGE_LIMIT=AGE_LIMIT,
26                MODIF_GENOME_SIZE=MODIF_GENOME_SIZE,
27            )
28
29        elif GENARCH_TYPE == "composite":
30            architecture = CompositeArchitecture(
31                BITS_PER_LOCUS=BITS_PER_LOCUS,
32                AGE_LIMIT=AGE_LIMIT,
33                THRESHOLD=THRESHOLD,
34            )
35        self.architecture = architecture
36        self.envdrift = Envdrift(ENVDRIFT_RATE=ENVDRIFT_RATE, genome_shape=self.architecture.get_shape())
architecture
envdrift