def test_vector_hash():
    cg = ChangeGraph()
    cn1 = ChangeNode(None, None, 'M1', ChangeNode.Kind.OPERATION_NODE, 0, sub_kind=ChangeNode.SubKind.OP_FUNC_CALL)
    cn2 = ChangeNode(None, None, '=', ChangeNode.Kind.OPERATION_NODE, 0, sub_kind=ChangeNode.SubKind.OP_ASSIGNMENT)
    cn3 = ChangeNode(None, None, 'M2', ChangeNode.Kind.OPERATION_NODE, 1, sub_kind=ChangeNode.SubKind.OP_FUNC_CALL)
    cn4 = ChangeNode(None, None, '=', ChangeNode.Kind.OPERATION_NODE, 1, sub_kind=ChangeNode.SubKind.OP_ASSIGNMENT)

    ChangeEdge.create(LinkType.MAP, cn1, cn3)
    ChangeEdge.create(LinkType.MAP, cn2, cn4)
    ChangeEdge.create(LinkType.PARAMETER, cn1, cn2)
    ChangeEdge.create(LinkType.PARAMETER, cn3, cn4)

    cg.nodes.update([cn1, cn2, cn3, cn4])

    fr = Fragment.create_from_node_pair([cn1, cn3])
    ext_fr = Fragment.create_extended(fr, ext_nodes=(cn2, cn4))

    vector_hash = ext_fr.vector.get_hash()
    assert vector_hash == normalize(27320942899360)
def _get_freq_group(fr):
    max_freq = 0
    freq_group = None

    label_to_ext_list = fr.get_label_to_ext_list()
    for label, ext_list in label_to_ext_list.items():
        ext_fragments = set()
        for ext in ext_list:
            ext_fr = Fragment.create_extended(fr, ext)
            ext_fragments.add(ext_fr)

            groups = Fragment.create_groups(ext_fragments)
            for num, group in enumerate(groups):
                freq = len(group)
                if freq > max_freq:
                    max_freq = freq
                    freq_group = group

                logger.log(logger.DEBUG, f'Elements in group #{num + 1} -> {len(group)}')

    return freq_group