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

Official-compatible merge proposer.

Merge is scheduled after an accepted reflective mutation. The proposer finds
two Pareto-front programs with a useful common ancestor, merges component
changes relative to that ancestor, and evaluates the merged candidate on a
balanced validation subsample. Counter consumption and final acceptance are
handled by the engine, matching the Python implementation.

# `t`

```elixir
@type t() :: %GEPA.Proposer.Merge{
  evaluator: function(),
  last_iter_found_new_program: boolean(),
  max_merge_invocations: non_neg_integer(),
  merges_due: non_neg_integer(),
  merges_performed: {[tuple()], [tuple()]},
  seed: integer(),
  total_merges_tested: non_neg_integer(),
  use_merge: boolean(),
  val_overlap_floor: pos_integer(),
  valset: GEPA.DataLoader.t()
}
```

# `new`

```elixir
@spec new(keyword()) :: t()
```

# `propose`

```elixir
@spec propose(t(), GEPA.State.t()) :: {GEPA.CandidateProposal.t() | nil, t()}
```

# `schedule_if_needed`

```elixir
@spec schedule_if_needed(t()) :: t()
```

# `select_eval_subsample_for_merged_program`

```elixir
@spec select_eval_subsample_for_merged_program(t(), map(), map(), keyword()) :: [
  term()
]
```

---

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