def analyze_dependence(program): program_w_attributes = assign_node_ids(program) graph = DependenceGraph() for (ref1, ref2) in iterate_unique_reference_pairs(program_w_attributes): for dependence_dv in iterate_dependence_direction_vectors(ref1, ref2): for ref1_then_ref2_dv in iterate_execution_order_direction_vector( ref1, ref2): logger.debug( f'Testing:\n' f'{ref1.pprint()} -> {ref2.pprint()}:, ' f'dep({dependence_dv}) exe_order({ref1_then_ref2_dv})') dv1 = calculate_valid_direction_vector(dependence_dv, ref1_then_ref2_dv) if dv1 is not None: logger.debug(f'Valid direction vector: {dv1}') graph.add(ref1, ref2, dv1) dependence_dv_inv = negate_direction_vector(dependence_dv) for ref2_then_ref1_dv in iterate_execution_order_direction_vector( ref2, ref1): logger.debug( f'Testing:\n' f'{ref2.pprint()} -> {ref2.pprint()}:, ' f'dep({dependence_dv_inv}) exe_order({ref2_then_ref1_dv})') dv2 = calculate_valid_direction_vector(dependence_dv_inv, ref2_then_ref1_dv) if dv2 is not None: logger.debug(f'Valid direction vector: {dv2}') graph.add(ref2, ref1, dv2) return graph, program_w_attributes