defmodule Jido.Evolve do @moduledoc """ Jido.Evolve is a generic evolutionary algorithm framework for Elixir. The canonical public API is `evolve/1`. """ alias Jido.Evolve.{Engine, Error, Options} @doc """ Run an evolutionary search over a population. ## Required options - `:initial_population` - List of entities to evolve. - `:fitness` - Module implementing `evaluate/2`. ## Optional options - `:config` - `%Jido.Evolve.Config{}` or config options map/keyword. - `:context` - Context map passed to `fitness.evaluate/2`. - `:mutation` - Mutation strategy module override. - `:selection` - Selection strategy module override. - `:crossover` - Crossover strategy module override. ## Examples defmodule MyFitness do use Jido.Evolve.Fitness def evaluate(entity, _ctx), do: {:ok, String.length(entity)} end Jido.Evolve.evolve( initial_population: ["a", "abc", "ab"], fitness: MyFitness ) |> Enum.to_list() """ @spec evolve(keyword() | map()) :: Enumerable.t() def evolve(opts) when is_list(opts) or is_map(opts) do normalized = Options.new!(opts) Engine.evolve( normalized.initial_population, normalized.config, normalized.fitness, mutation: normalized.mutation, selection: normalized.selection, crossover: normalized.crossover, context: normalized.context ) end def evolve(_opts) do raise Error.validation_error("evolve/1 expects a keyword list or map") end @doc """ Get version information. """ @spec version() :: String.t() def version do Application.spec(:jido_evolve, :vsn) |> List.to_string() end end