# `GEPA.Utils.Pareto`
[🔗](https://github.com/nshkrdotcom/gepa_ex/blob/v0.3.0/lib/gepa/utils/pareto.ex#L1)

Pareto-front utilities used for candidate selection and merge parent choice.

The domination algorithm follows the official Python GEPA utility: a program
is dominated when, for every Pareto front that contains it, another active
program also appears on that front. Programs absent from every front are
considered dominated/irrelevant.

# `find_dominator_programs`

```elixir
@spec find_dominator_programs(GEPA.Types.pareto_fronts(), %{
  required(GEPA.Types.program_idx()) =&gt; float()
}) :: [GEPA.Types.program_idx()]
```

# `get_all_programs`

```elixir
@spec get_all_programs(GEPA.Types.pareto_fronts()) :: [GEPA.Types.program_idx()]
```

# `is_dominated?`

```elixir
@spec is_dominated?(
  GEPA.Types.program_idx(),
  [GEPA.Types.program_idx()] | MapSet.t(),
  GEPA.Types.pareto_fronts()
) :: boolean()
```

# `remove_dominated_programs`

```elixir
@spec remove_dominated_programs(GEPA.Types.pareto_fronts(), %{
  required(GEPA.Types.program_idx()) =&gt; float()
}) :: GEPA.Types.pareto_fronts()
```

# `select_from_pareto_front`

```elixir
@spec select_from_pareto_front(
  GEPA.Types.pareto_fronts(),
  %{required(GEPA.Types.program_idx()) =&gt; float()},
  :rand.state()
) :: {GEPA.Types.program_idx(), :rand.state()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
