Stefan Sperling wrote on Wed, 18 Nov 2009 at 09:57 +0100: > On Wed, Nov 18, 2009 at 12:41:37AM +0200, Daniel Shahaf wrote: > > Stefan Sperling wrote on Tue, 17 Nov 2009 at 09:16 +0100: > > > On Mon, Nov 16, 2009 at 11:31:12PM +0200, Daniel Shahaf wrote: > > > > i.e., iterate all 1st candidates, then all 2nd candidates, etc. Why not > > > > iterate by hunks first? (i.e., first all candidates of 1st hunk, then > > > > all candidates of 2nd hunk, etc.) > > > > > So you were asking why, in the following step, we loop over candidate > offsets, considering each hunk in turn as we do so, rather than > looping over hunks, considering each candidate offset as we do so. > > The answer is that we want to end up using the best possible offset for > every hunk. Looking at hunks in isolation does not achieve this goal. > When we pick a candidate offset for a hunk, we want to make sure the > resulting line range occupied by the hunk does not overlap with a range > we assigned to a different hunk earlier. If the range is already occupied, > we know that it is occupied by a "better" hunk (because the hunk list > is already sorted accordingly) and that ignoring the current candidate > offset for the current hunk will give the best overall result. >
In this case, how about losing the "GROUP BY hunk" from the sort? i.e., BIG_LIST = [] for each hunk: for each candidate in hunk: compute a score for candidate BIG_LIST.append(candidate) # based on line offset, endifs, whatever sort BIG_LIST by score for each candidate in BIG_LIST: if candidate->hunk.state not in ['applied', 'rejected']: # try to apply candidate->hunk at candidate->offset I'm pretty sure it differs from your suggestion on at least one pathological input sample. > What you [first proposed] does not answer any interesting question. > Iterating over hunks first and looking at each candidate offset for the > current hunk in turn does not give us any new information because we > already sorted the candidate offset list in the best way we can for > the current hunk. > I see. > Is it more clear now? > Yes, thanks a lot. (I've trimmed context, but it was an excellent explanation.) > Stefan >