# Last edited on 2025-09-15 07:55:23 by stolfi

def mutate(w):
  Lmax = 20
  Lw = len(w)
  p_insert = 0.0 if Lw >= Lmax else 0.25*(Lmax - Lw)/Lmax
  p_delete = 0.0 if Lw <= 1 else 1.0 if Lw >= Lmax else Lw/Lmax
  p_change = 1.0 - (p_insert + p_delete)
  vowels = "aeiouyw"
  stops = "bcdgkpqtx"
  slurs = "fhjlmnrsvz"
  if rand() < p_change:
    # Replace a letter:
    k = abrand(0, len(w))
    c = w[k]
    if re.fullmatch(r"[" + vowels + "]", c):
      rep = vowels
    elif re.fullmatch(r"[" + stops + "]", c):
      rep = stops
    else:
      rep = slurs
    c = rep[abrand(0,len(rep))]
    w = w[:k] + c + w[k+1:]
  elif rand() < p_insert/(p_insert + p_delete):
    # Insert a random letter:
    k = abrand(0, len(w)+1)
    rep = "eeeeeettttaaaaiiiiooonnnhhhrrllssbbccddffggkkmmppuuvvwwyyjqxz"
    c = rep[abrand(0,len(rep))]
    w = w[:k] + c + w[k:]
  else:
    # Delete a random letter:
    k = abrand(0, len(w))
    w = w[:k] + w[k+1:]
  return w
  # ----------------------------------------------------------------------
