Pular para o conteúdo principal

GeneticEngine — herança de traços

Arquivo: persona_db/engines/genetics.py

Este motor garante que filhos sejam geneticamente compatíveis com os pais — a restrição mais visível de coerência do PersonaDB, verificada também pelo validador de genealogia e por uma função PL/pgSQL (validar_tipo_sanguineo_filho).

1. Sistema ABO e fator Rh​

Alelos {IA,IB,i}\{I^A, I^B, i\}, com IAI^A e IBI^B codominantes e ii recessivo:

FenótipoGenótipos
A(IA,IA)(I^A, I^A), (IA,i)(I^A, i)
B(IB,IB)(I^B, I^B), (IB,i)(I^B, i)
AB(IA,IB)(I^A, I^B)
O(i,i)(i, i)

Priors populacionais usados quando não há pais conhecidos: O 47%, A 41%, B 9%, AB 3%; Rh+ 87%, Rh− 13%.

Os fenótipos entram como "A", "B", "AB" e "O", e o Rh como "positivo" ou "negativo"; o tipo do filho é informado com o sufixo de Rh ("A+", "O-").

GeneticEngine.punnett_abo("A", "B")
# {"AB": 0.5625, "A": 0.1875, "B": 0.1875, "O": 0.0625}
# (gametas ponderados sobre todos os genótipos compatíveis com cada fenótipo)

GeneticEngine.rh_punnett("negativo", "negativo") # {"positivo": 0.0, "negativo": 1.0}
GeneticEngine.validate_child_blood("O", "O", "positivo", "negativo", "A+") # False
GeneticEngine.validate_child_blood("O", "O", "positivo", "negativo", "O+") # True

Regra dura: dois pais Rh− só podem ter filhos Rh−, e validate_child_blood rejeita qualquer combinação impossível.

2. Cor dos olhos (poligênico simplificado OCA2/HERC2)​

Dois loci equivalentes com alelos {B,G,g,b}\{B, G, g, b\} — castanho dominante, verde intermediário, avelã e azul recessivo. O quadro de Punnett de olhos (eye_color_chart) cruza os genótipos dos pais; pais homozigotos (b,b)×(b,b)(b,b) \times (b,b) nunca geram filhos castanhos.

Há ainda um mecanismo de variante rara (_rare_variant) que introduz, com baixa probabilidade, um alelo não presente nos pais, simulando mutações e ancestralidade não registrada.

3. Cor do cabelo​

hair_color(hair_pai_str, hair_mae_str, ancestry_european_pct) parte da dominância entre as cores dos pais (preto > castanho > loiro > ruivo) e aplica dois desvios proporcionais à ancestralidade europeia informada: uma pequena chance de loiro (quando a base é preta ou castanha e a ancestralidade europeia é baixa) e uma chance menor ainda de ruivo. Um sorteio normal adicional converte o resultado em grisalho nos casos extremos. A função não consulta ANCESTRY_TO_TRAITS nem recebe pele/cor_olhos — essa coordenação, quando existe, é feita pelo gerador que a chama.

4. Lateralidade (modelo logístico familiar)​

logit(P(canhoto))=−2,10+0,69⋅I(pai canhoto)+0,55⋅I(ma˜e canhota)\text{logit}\big(\mathbb{P}(\text{canhoto})\big) = -2{,}10 + 0{,}69 \cdot \mathbb{I}(\text{pai canhoto}) + 0{,}55 \cdot \mathbb{I}(\text{mãe canhota})

PaisP(canhoto)
nenhum canhoto≈ 10,9%
só o pai≈ 19,6%
só a mãe≈ 17,4%
ambos≈ 30,0%

5. Estatura adulta (mid-parent de Galton)​

undefined