class GEPA::Core::Engine
def process_merge_iteration(state)
def process_merge_iteration(state) return :skipped unless @merge_proposer && @merge_proposer.use_merge if @merge_proposer.merges_due.positive? && @merge_proposer.last_iter_found_new_program proposal = @merge_proposer.propose(state) @merge_proposer.last_iter_found_new_program = false if proposal&.tag == 'merge' parent_sums = Array(proposal.subsample_scores_before).map(&:to_f) new_sum = Array(proposal.subsample_scores_after).map(&:to_f).sum if parent_sums.empty? @logger.log("Iteration #{state.i}: Missing parent subscores for merge proposal, skipping") return :handled end if new_sum >= parent_sums.max with_span('gepa.engine.full_evaluation', iteration: state.i) do run_full_evaluation(state, proposal.candidate, proposal.parent_program_ids) end @merge_proposer.merges_due -= 1 @merge_proposer.total_merges_tested += 1 return :accepted else @logger.log( "Iteration #{state.i}: Merge subsample score #{new_sum.round(4)} "\ "did not beat parents #{parent_sums.map { |v| v.round(4) }}, skipping" ) return :attempted end end end @merge_proposer.last_iter_found_new_program = false :skipped end