From 2d13584d1599ec75bfd6e9e499379e7fc4987cbb Mon Sep 17 00:00:00 2001 From: Timotej Lazar Date: Wed, 25 Feb 2015 16:47:17 +0100 Subject: monkey.fix.step: apply all edits in line order For instance, don't add a new rule at line 1 after changing line 3 - only the ordered sequence of edits will be checked. --- monkey/monkey.py | 30 ++++++++++++++++-------------- monkey/test.py | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/monkey/monkey.py b/monkey/monkey.py index 3491186..b67f7fe 100755 --- a/monkey/monkey.py +++ b/monkey/monkey.py @@ -31,20 +31,22 @@ def fix(name, code, edits, program_lines, aux_code='', timeout=30, debug=False): rule_lines = lines[start:end] rule_tokens = [t for line in rule_lines for t in line] - # Add a new rule (fact) before this rule. - for after, cost in inserts.items(): - new_lines = lines[:start] + (after,) + lines[start:] - new_rules = [] - for old_start, old_end in rules: - if old_start == start: - new_rules.append((start, start+1)) - new_rules.append((old_start + (0 if old_start < start else 1), - old_end + (0 if old_end < start else 1))) - new_step = ('add_rule', start, (tuple(), after)) - # Decrease probability as we add more rules. - new_cost = cost * math.pow(0.3, len(rules)) - - yield (new_lines, new_rules, new_step, new_cost) + # Prepend a new rule (fact) before this rule (only if no line in + # the current rule has been modified yet). + if start_line == 0 or start > start_line: + for after, cost in inserts.items(): + new_lines = lines[:start] + (after,) + lines[start:] + new_rules = [] + for old_start, old_end in rules: + if old_start == start: + new_rules.append((start, start+1)) + new_rules.append((old_start + (0 if old_start < start else 1), + old_end + (0 if old_end < start else 1))) + new_step = ('add_rule', start, (tuple(), after)) + # Decrease probability as we add more rules. + new_cost = cost * math.pow(0.3, len(rules)) + + yield (new_lines, new_rules, new_step, new_cost) # Apply some edits for each line in this rule. for line_idx in range(start, end): diff --git a/monkey/test.py b/monkey/test.py index b75858a..2b01b95 100755 --- a/monkey/test.py +++ b/monkey/test.py @@ -170,5 +170,5 @@ else: # Try finding a fix. print(colored('Analyzing program…', 'yellow')) - solution, steps, fix_time, n_tested = fix(problem.name, code, edits, aux_code=aux_code, debug=True) + solution, steps, fix_time, n_tested = fix(problem.name, code, edits, lines, aux_code=aux_code, debug=True) print_hint(solution, steps, fix_time, n_tested) -- cgit v1.2.1