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 , com e codominantes e recessivo:
| Fenótipo | Genótipos |
|---|---|
| A | , |
| B | , |
| AB | |
| O |
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 — 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 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)
| Pais | P(canhoto) |
|---|---|
| nenhum canhoto | ≈ 10,9% |
| só o pai | ≈ 19,6% |
| só a mãe | ≈ 17,4% |
| ambos | ≈ 30,0% |