def remove_first_log_move(align, ret_tuple_as_trans_desc): left_bound = 0 while True: move = align[left_bound] if not align_utils.is_log_move(move, ret_tuple_as_trans_desc): break left_bound += 1 return [RangeInterval(left_bound, len(align) - 1)]
def compute_ranges_for_sequence(align, tree_info, mapping_t, node_index, ranges, ret_tuple_as_trans_desc): lb, ub = tree_info[node_index].tree.parent.index, tree_info[ node_index].tree_range.lower_bound - 1 left_nei = RangeInterval(lb, ub) lb = tree_info[node_index].tree_range.upper_bound + 1 ub = tree_info[ tree_info[node_index].tree.parent.index].tree_range.upper_bound right_nei = RangeInterval(lb, ub) new_ranges = list() for ri in ranges: new_range = compute_one_range_for_sequence(align, tree_info, mapping_t, node_index, ri, left_nei, right_nei, ret_tuple_as_trans_desc) if new_range is not None: new_ranges.append(new_range) return new_ranges
def apply(align, tree_info, mapping_t, com_res, ret_tuple_as_trans_desc): add_lock_for_each_node(tree_info[1].tree, align, tree_info, mapping_t, ret_tuple_as_trans_desc) scope_expand_trace(align, com_res.subtree1, ret_tuple_as_trans_desc) index = search_scope_index(align, com_res.subtree1, ret_tuple_as_trans_desc) index = remove_lock(align, index) ranges = list() for j in range(len(index) // 2): ranges.append(RangeInterval(index[j * 2], index[j * 2 + 1])) return ranges
def compute_one_range_for_sequence(align, tree_info, mapping_t, node_index, range_interval, left_nei, right_nei, ret_tuple_as_trans_desc): left_bound = find_left_bound(range_interval, align, node_index, tree_info, mapping_t, left_nei, ret_tuple_as_trans_desc) if left_bound == -1: return None right_bound = find_right_bound(range_interval, align, node_index, tree_info, mapping_t, right_nei, ret_tuple_as_trans_desc) return RangeInterval(left_bound, right_bound)
def apply(align, tree_info, mapping_t, com_res, stop_condition, ret_tuple_as_trans_desc): ranges = list() subtree_range = tree_info[com_res.subtree1.index].tree_range anchor = True range_interval = remove_first_log_move(align, 0, mapping_t, subtree_range, ret_tuple_as_trans_desc) if range_interval is not None: cur_index = left_bound = right_bound = range_interval.lower_bound while cur_index < len(align): move = align[cur_index] if align_utils.is_log_move(move, ret_tuple_as_trans_desc): if anchor: right_bound += 1 else: move_cur_index = align_utils.move_index( move, mapping_t, ret_tuple_as_trans_desc) if subtree_range.is_in_range(move_cur_index): anchor = True right_bound = cur_index elif stop_condition[0].is_in_range( move_cur_index) or stop_condition[1].is_in_range( move_cur_index): ranges.append(RangeInterval(left_bound, right_bound)) anchor = True range_interval = remove_first_log_move( align, cur_index, mapping_t, subtree_range, ret_tuple_as_trans_desc) if range_interval is None: break cur_index = left_bound = right_bound = range_interval.lower_bound else: anchor = False if cur_index == len(align) - 1: ranges.append(RangeInterval(left_bound, right_bound)) cur_index += 1 return ranges
def remove_first_log_move(align, begin, mapping_t, subtree_range, ret_tuple_as_trans_desc): left_bound = begin while True: if left_bound == len(align): return None move = align[left_bound] if not align_utils.is_log_move(move, ret_tuple_as_trans_desc): move_cur_index = align_utils.move_index(move, mapping_t, ret_tuple_as_trans_desc) if subtree_range.is_in_range(move_cur_index): break left_bound += 1 return RangeInterval(left_bound, len(align) - 1)
def apply(align, tree_info, mapping_t, com_res, ret_tuple_as_trans_desc): ranges = list() for node_index in tree_info[com_res.subtree1.index].paths: node = tree_info[node_index].tree if node_index == 1: ranges = [RangeInterval(0, len(align) - 1)] elif node.parent.operator == Operator.LOOP: ranges = compute_ranges_for_loop(align, tree_info, mapping_t, node.index, ranges, ret_tuple_as_trans_desc) elif node.parent.operator == Operator.SEQUENCE: ranges = compute_ranges_for_sequence(align, tree_info, mapping_t, node.index, ranges, ret_tuple_as_trans_desc) elif node.parent.operator == Operator.XOR: ranges = compute_ranges_for_xor(align, tree_info, mapping_t, node.index, ranges, ret_tuple_as_trans_desc) else: pass return ranges
def compute_ranges_for_loop(align, tree_info, mapping_t, node_index, ranges, ret_tuple_as_trans_desc): parent_node_index = tree_info[node_index].tree.parent.index if node_index == parent_node_index + 1: ub = tree_info[parent_node_index].tree_range.upper_bound nei_ranges = RangeInterval(tree_info[node_index].tree_range.upper_bound + 1, ub) else: lb = tree_info[parent_node_index].tree_range.lower_bound nei_ranges = RangeInterval(lb, tree_info[node_index].tree_range.lower_bound - 1) new_ranges = list() for range_interval in ranges: ri = compute_one_range_for_sequence(align, tree_info, mapping_t, node_index, range_interval, ret_tuple_as_trans_desc) if ri is not None: cur_pos = left_bound = ri.lower_bound while cur_pos <= ri.upper_bound: move = align[cur_pos] if not align_utils.is_log_move(move, ret_tuple_as_trans_desc): move_cur_index = align_utils.move_index(move, mapping_t, ret_tuple_as_trans_desc) move_in_nei = nei_ranges.is_in_range(move_cur_index) else: move_in_nei = False if move_in_nei or cur_pos == ri.upper_bound: new_ranges.append(compute_one_range_for_sequence(align, tree_info, mapping_t, node_index, RangeInterval(left_bound, cur_pos), ret_tuple_as_trans_desc)) ri = compute_one_range_for_sequence(align, tree_info, mapping_t, node_index, RangeInterval(cur_pos + 1, ri.upper_bound), ret_tuple_as_trans_desc) if ri is None: break elif ri.upper_bound == ri.lower_bound: new_ranges.append(RangeInterval(ri.lower_bound, ri.upper_bound)) left_bound = cur_pos = ri.lower_bound cur_pos += 1 return new_ranges
def compute_ranges_for_loop(align, tree_info, mapping_t, node_index, ranges, ret_tuple_as_trans_desc): parent_node_index = tree_info[node_index].tree.parent.index if node_index == parent_node_index + 1: ub = tree_info[parent_node_index].tree_range.upper_bound nei_ranges = RangeInterval( tree_info[node_index].tree_range.upper_bound + 1, ub) else: lb = tree_info[parent_node_index].tree_range.lower_bound nei_ranges = RangeInterval( lb, tree_info[node_index].tree_range.lower_bound - 1) new_ranges = list() for range_interval in ranges: ri = compute_one_range_for_sequence(align, tree_info, mapping_t, node_index, range_interval, nei_ranges, nei_ranges, ret_tuple_as_trans_desc) if ri is not None: left_bound = cur_pos = ri.lower_bound scatter_align = False while cur_pos <= ri.upper_bound: move = align[cur_pos] move_in_nei = True if not align_utils.is_log_move(move, ret_tuple_as_trans_desc): move_cur_index = align_utils.move_index( move, mapping_t, ret_tuple_as_trans_desc) move_in_nei = nei_ranges.is_in_range(move_cur_index) scatter_align = True if move_in_nei else scatter_align if scatter_align and align_utils.move_in_subtree( move, tree_info[node_index].tree_range, mapping_t): new_ranges.append( compute_one_range_for_sequence( align, tree_info, mapping_t, node_index, RangeInterval(left_bound, cur_pos - 1), nei_ranges, nei_ranges, ret_tuple_as_trans_desc)) ri = compute_one_range_for_sequence( align, tree_info, mapping_t, node_index, RangeInterval(cur_pos, ri.upper_bound), nei_ranges, nei_ranges, ret_tuple_as_trans_desc) if ri is None: break left_bound = cur_pos = ri.lower_bound scatter_align = False if (align_utils.is_sync_move(move, True) and move_in_nei) or cur_pos == ri.upper_bound: new_ranges.append( compute_one_range_for_sequence( align, tree_info, mapping_t, node_index, RangeInterval(left_bound, cur_pos), nei_ranges, nei_ranges, ret_tuple_as_trans_desc)) ri = compute_one_range_for_sequence( align, tree_info, mapping_t, node_index, RangeInterval(cur_pos + 1, ri.upper_bound), nei_ranges, nei_ranges, ret_tuple_as_trans_desc) if ri is None: break left_bound = cur_pos = ri.lower_bound scatter_align = False else: cur_pos += 1 return new_ranges