Skip to main content

lib/jido_evolve/evolvable/list.ex

defimpl Jido.Evolve.Evolvable, for: List do
  @moduledoc """
  Implementation of Jido.Evolve.Evolvable for lists.

  Lists are already genomes, so to_genome/from_genome are identity operations.
  Similarity is calculated using Hamming distance for equal-length lists.
  """

  @doc """
  Convert list to genome (identity operation).
  """
  def to_genome(list) when is_list(list) do
    list
  end

  @doc """
  Convert genome back to list (identity operation).
  """
  def from_genome(_original, genome) when is_list(genome) do
    genome
  end

  @doc """
  Calculate similarity using normalized Hamming distance.

  Returns 0.0 for identical lists, 1.0 for completely different lists.
  Only works for equal-length lists.
  """
  def similarity(list1, list2) when is_list(list1) and is_list(list2) do
    if length(list1) != length(list2) do
      1.0
    else
      differences =
        Enum.zip(list1, list2)
        |> Enum.count(fn {a, b} -> a != b end)

      differences / length(list1)
    end
  end
end