Esempio n. 1
0
def test_dummy_sgs():
    a = dummy_sgs([1, 2], 0, 4)
    assert a == [[0, 2, 1, 3, 4, 5]]
    a = dummy_sgs([2, 3, 4, 5], 0, 8)
    assert a == [x._array_form for x in [Perm(9)(2, 3), Perm(9)(4, 5),
                                         Perm(9)(2, 4)(3, 5)]]

    a = dummy_sgs([2, 3, 4, 5], 1, 8)
    assert a == [x._array_form for x in [Perm(2, 3)(8, 9), Perm(4, 5)(8, 9),
                                         Perm(9)(2, 4)(3, 5)]]
Esempio n. 2
0
def test_dummy_sgs():
    a = dummy_sgs([1, 2], 0, 4)
    assert a == [[0, 2, 1, 3, 4, 5]]
    a = dummy_sgs([2, 3, 4, 5], 0, 8)
    assert a == [x._array_form for x in [Perm(9)(2, 3), Perm(9)(4, 5),
                                         Perm(9)(2, 4)(3, 5)]]

    a = dummy_sgs([2, 3, 4, 5], 1, 8)
    assert a == [x._array_form for x in [Perm(2, 3)(8, 9), Perm(4, 5)(8, 9),
                                         Perm(9)(2, 4)(3, 5)]]
Esempio n. 3
0
def canonicalize_naive(g, dummies, sym, *v):
    """
    Canonicalize tensor formed by tensors of the different types

    g  permutation representing the tensor
    dummies  list of dummy indices
    msym symmetry of the metric

    v is a list of (base_i, gens_i, n_i, sym_i) for tensors of type `i`
    base_i, gens_i BSGS for tensors of this type
    n_i  number ot tensors of type `i`

    sym_i symmetry under exchange of two component tensors of type `i`
          None  no symmetry
          0     commuting
          1     anticommuting

    Return 0 if the tensor is zero, else return the array form of
    the permutation representing the canonical form of the tensor.

    Examples
    ========

    >>> from diofant.combinatorics.testutil import canonicalize_naive
    >>> from diofant.combinatorics.tensor_can import get_symmetric_group_sgs
    >>> from diofant.combinatorics import Permutation, PermutationGroup
    >>> g = Permutation([1, 3, 2, 0, 4, 5])
    >>> base2, gens2 = get_symmetric_group_sgs(2)
    >>> canonicalize_naive(g, [2, 3], 0, (base2, gens2, 2, 0))
    [0, 2, 1, 3, 4, 5]
    """
    from diofant.combinatorics.perm_groups import PermutationGroup
    from diofant.combinatorics.tensor_can import gens_products, dummy_sgs
    from diofant.combinatorics.permutations import Permutation, _af_rmul
    v1 = []
    for i in range(len(v)):
        base_i, gens_i, n_i, sym_i = v[i]
        v1.append((base_i, gens_i, [[]]*n_i, sym_i))
    size, sbase, sgens = gens_products(*v1)
    dgens = dummy_sgs(dummies, sym, size-2)
    if isinstance(sym, int):
        num_types = 1
        dummies = [dummies]
        sym = [sym]
    else:
        num_types = len(sym)
    dgens = []
    for i in range(num_types):
        dgens.extend(dummy_sgs(dummies[i], sym[i], size - 2))
    S = PermutationGroup(sgens)
    D = PermutationGroup([Permutation(x) for x in dgens])
    dlist = list(D.generate(af=True))
    g = g.array_form
    st = set()
    for s in S.generate(af=True):
        h = _af_rmul(g, s)
        for d in dlist:
            q = tuple(_af_rmul(d, h))
            st.add(q)
    a = list(st)
    a.sort()
    prev = (0,)*size
    for h in a:
        if h[:-2] == prev[:-2]:
            if h[-1] != prev[-1]:
                return 0
        prev = h
    return list(a[0])