Greedy Swap Partial Lookahead
while first layer not empty: used_qubits = empty execute gates that can be executed, update used_qubits swap_dist(-2) swap_dist(-1) if used qubits empty: fallback
swap_dist(dist): for i in range (inf) if swap on edge[i % number of edges] reduces total distance by dist: do that swap else if no swap has performed for number of edges iterations: return