# `GEPA.Proposer.MergeUtils`
[🔗](https://github.com/nshkrdotcom/gepa_ex/blob/v0.3.0/lib/gepa/proposer/merge_utils.ex#L1)

Genealogy and triplet-selection helpers for the merge proposer.

# `canonical_triplet`

```elixir
@spec canonical_triplet(non_neg_integer(), non_neg_integer(), non_neg_integer()) ::
  tuple()
```

Canonical tuple for recording a merge triplet irrespective of pair ordering.

# `does_triplet_have_desirable_predictors?`

```elixir
@spec does_triplet_have_desirable_predictors?(
  [map()],
  non_neg_integer(),
  non_neg_integer(),
  non_neg_integer()
) :: boolean()
```

Return true when a common-ancestor triplet can produce a useful merged predictor.

# `filter_ancestors`

```elixir
@spec filter_ancestors(
  non_neg_integer(),
  non_neg_integer(),
  [non_neg_integer()],
  {[tuple()], [tuple()]},
  map(),
  [map()]
) :: [non_neg_integer()]
```

Filter common ancestors to official-compatible merge triplet candidates.

# `find_common_ancestor_pair`

```elixir
@spec find_common_ancestor_pair([non_neg_integer()], map() | list(), map(), keyword()) ::
  {non_neg_integer(), non_neg_integer(), non_neg_integer()} | nil
```

Find a non-ancestor pair of programs with a valid common ancestor.

# `get_ancestors`

```elixir
@spec get_ancestors(non_neg_integer(), map() | list()) :: [non_neg_integer()]
```

Return all ancestors of `program`, excluding the program itself.

---

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