예제 #1
0
def test_topology_type():
    """(DL)^{i} L^{j} (DH)^{k} (DDH)^{l}"""
    eff_ops = [
        EffectiveOperator("", op)
        for op in invariants(D(L, "01"), L, D(H, "11"), D(D(H, "11"), "22"))
    ]
    assert eff_ops[0].topology_type == {"n_scalars": 2, "n_fermions": 2}
예제 #2
0
def test_get_lorentz_epsilons():
    passes, epsilons = get_lorentz_epsilons((D(D(H, "11"),
                                               "00")("i0"), H("i1")))
    assert passes
    assert not epsilons

    passes, epsilons = get_lorentz_epsilons(
        (D(H, "11")("u0 d0 i0"), D(H, "11")("u1 d1 i1")))
    assert passes
    assert epsilons == [eps("-u0 -u1"), eps("-d0 -d1")]

    passes, epsilons = get_lorentz_epsilons((Q("u0 c0 i0"), L("u1 i1")))
    assert passes
    assert epsilons == [eps("-u0 -u1")]

    passes, epsilons = get_lorentz_epsilons((Q("u0 c0 i0"), L.conj("d1 i1")))
    assert not passes
    assert not epsilons

    passes, epsilons = get_lorentz_epsilons(
        (D(L, "01")("d0 i0"), D(H, "11")("u0 d1 i1")))
    assert passes
    assert epsilons == [eps("-d0 -d1")]

    passes, epsilons = get_lorentz_epsilons(
        (D(Q, "01")("d0 c0 i0"), D(L, "01")("d1 i1")))
    assert passes
    assert epsilons == [eps("-d0 -d1")]
예제 #3
0
def test_derivs_nlo_completions():
    # Derivative operator examples:
    from neutrinomass.tensormethod.sm import L, H
    from neutrinomass.tensormethod.core import D

    o1box = EffectiveOperator(
        "O1box",
        L("u0 i0") * L("u1 i1") * D(H, "11")("u2 d0 i2") *
        D(H, "11")("u3 d1 i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )

    comps = collect_completions(operator_completions(o1box))

    assert len(comps) == 3
    assert not filter_completions(comps, SIEVE)
예제 #4
0
def test_process_derivative_term():
    n = 10
    symbols = {
        "fermion": list(map(lambda i: "F" + str(i), range(n))),
        "boson": list(map(lambda i: "F" + str(i), range(n))),
    }
    exotic_dict = {}

    # Dirac fermion, deriv on fermion
    _, _, term = exotic_field_and_term(
        H("i1") * D(Q, "01")("d0 c0 i0"), symbols, exotic_dict)
    assert process_derivative_term(term)

    # Dirac fermion, deriv on scalar
    _, _, term = exotic_field_and_term(
        D(H, "11")("u0 d0 i1") * Q("u1 c0 i0") * eps("-u0 -u1"), symbols,
        exotic_dict)
    assert process_derivative_term(term)

    # Majorana fermion
    _, _, term = exotic_field_and_term(
        D(H, "11")("u0 d0 i1") * L("u1 i0") * eps("-u0 -u1"), symbols,
        exotic_dict)
    assert process_derivative_term(term)

    # Two derivatives, scalar case
    _, _, term = exotic_field_and_term(
        D(H, "11")("u0 d0 i1") * D(H, "11")("u1 d1 i0") * eps("-u0 -u1") *
        eps("-d0 -d1"),
        symbols,
        exotic_dict,
    )
    assert process_derivative_term(term)

    # Two derivatives, scalar case, four point
    _, _, term = exotic_field_and_term(
        D(H, "11")("u0 d0 i1") * D(H, "11")("u1 d1 i0") * H("i2") *
        eps("-u0 -u1") * eps("-d0 -d1"),
        symbols,
        exotic_dict,
    )
    assert process_derivative_term(term)

    # Two derivatives, fermion case
    _, _, term = exotic_field_and_term(
        D(L, "01")("d0 i1") * D(L, "01")("d1 i0") * eps("-d0 -d1"), symbols,
        exotic_dict)
    assert process_derivative_term(term)

    # Regular fermion case, for comparison above (and check on exotic_dict)
    _, _, term = exotic_field_and_term(
        L("u0 i1") * L("u1 i0") * eps("-u0 -u1"), symbols, exotic_dict)
    assert process_derivative_term(term)
예제 #5
0
def test_strip_derivs():
    from neutrinomass.tensormethod.sm import Q, H
    from neutrinomass.tensormethod.core import D

    return D(D(Q, "01"), "10")("u0 c0 i0").strip_derivs_with_indices()
    assert D(D(Q, "01"),
             "10")("u0 c0 i0").strip_derivs_with_indices() == Q("u0 c0 i0")
    assert D(D(H, "11"), "00")("i0").strip_derivs_with_indices() == H("i0")

    assert D(Q, "01").strip_derivs_with_indices().derivs == 0
예제 #6
0
def test_deriv_completions():
    # operators from the dimension-6 SMEFT
    from neutrinomass.tensormethod.sm import H, eb
    from neutrinomass.tensormethod.core import D

    Ophie_D1 = invariants(D(H, "11"), H.conj, eb.conj, eb)[0]
    Ophie_D2 = invariants(H, D(H.conj, "11"), eb.conj, eb)[0]
    Ophie_D3 = invariants(H, H.conj, D(eb.conj, "10"), eb)[0]
    Ophie_D4 = invariants(H, H.conj, eb.conj, D(eb, "01"))[0]

    eff_ophie_D1 = EffectiveOperator("OphieD1", Ophie_D1)
    eff_ophie_D2 = EffectiveOperator("OphieD2", Ophie_D2)
    eff_ophie_D3 = EffectiveOperator("OphieD3", Ophie_D3)
    eff_ophie_D4 = EffectiveOperator("OphieD4", Ophie_D4)

    models = {
        op.name: sorted(collect_completions(operator_completions(op)))
        for op in [eff_ophie_D1, eff_ophie_D2, eff_ophie_D3, eff_ophie_D4]
    }

    assert models["OphieD1"] == models["OphieD2"]
    assert models["OphieD1"] == models["OphieD3"]
    assert models["OphieD1"] == models["OphieD4"]
예제 #7
0
def test_ophibox_ophiD():
    """Example from section 2.2 in the paper."""

    from neutrinomass.tensormethod.sm import H
    from neutrinomass.tensormethod.core import D

    ohhdd1 = EffectiveOperator(
        "OHHDD1",
        H.conj("i0") * H.conj("i1") * D(H, "11")("u0 d0 i2") *
        D(H, "11")("u1 d1 i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )

    ohhdd2 = EffectiveOperator(
        "OHHDD2",
        H.conj("i0") * H("i1") * D(H.conj, "11")("u0 d0 i2") *
        D(H, "11")("u1 d1 i3") * eps("-i0 -i1") * eps("-i2 -i3"),
    )

    ohhdd3 = EffectiveOperator(
        "OHHDD3",
        H.conj("i0") * H("i1") * D(H.conj, "11")("u0 d0 i2") *
        D(H, "11")("u1 d1 i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )

    ohhdd4 = EffectiveOperator(
        "OHHDD4",
        H.conj("i0") * H("i1") * D(H.conj, "11")("u0 d0 i2") *
        D(H, "11")("u1 d1 i3") * eps("-i0 -i3") * eps("-i1 -i2"),
    )

    comps = {}
    for op in [ohhdd1, ohhdd2, ohhdd3, ohhdd4]:
        comps[op.name] = list(collect_completions(operator_completions(op)))

    assert len(comps["OHHDD1"]) == 1
    assert len(comps["OHHDD2"]) == 1
    assert len(comps["OHHDD3"]) == 1
    assert len(comps["OHHDD4"]) == 1

    assert comps["OHHDD1"][0] == (("S", 0, 0, 2, ("3b", 0), ("y", 1)), )
    assert comps["OHHDD2"][0] == (("S", 0, 0, 0, ("3b", 0), ("y", 0)), )
    assert comps["OHHDD3"][0] == (("S", 0, 0, 2, ("3b", 0), ("y", 0)), )
    assert comps["OHHDD4"][0] == (("S", 0, 0, 2, ("3b", 0), ("y", 0)), )
예제 #8
0
def test_ibp():
    from itertools import combinations
    from collections import defaultdict

    od12_1 = EffectiveOperator(
        "OD12_1",
        D(L, "01")("d3 i0 g0") * Q("u1 c1 i1 g1") * eb.conj("d0 g2") *
        db("u2 -c2") * H("i2") * H("i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )
    od12_2 = EffectiveOperator(
        "OD12_2",
        L("u0 i0 g0") * D(Q, "01")("d3 c1 i1 g1") * eb.conj("d0 g2") *
        db("u2 -c2") * H("i2") * H("i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )
    od12_3 = EffectiveOperator(
        "OD12_3",
        L("u0 i0 g0") * Q("u1 c1 i1 g1") * D(eb.conj, "10")("u5 g2") *
        db("u2 -c2") * H("i2") * H("i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )
    od12_4 = EffectiveOperator(
        "OD12_4",
        L("u0 i0 g0") * Q("u1 c1 i1 g1") * eb.conj("d0 g2") *
        D(db, "01")("d5 -c2") * H("i2") * H("i3") * eps("-i0 -i2") *
        eps("-i1 -i3"),
    )
    od12_5 = EffectiveOperator(
        "OD12_5",
        L("u0 i0 g0") * Q("u1 c1 i1 g1") * eb.conj("d0 g2") * db("u2 -c2") *
        D(H, "11")("u3 d1 i2") * H("i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )
    od12_6 = EffectiveOperator(
        "OD12_6",
        L("u0 i0 g0") * Q("u1 c1 i1 g1") * eb.conj("d0 g2") * db("u2 -c2") *
        H("i2") * D(H, "11")("u3 d1 i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )

    models = {
        op.name: sorted(collect_completions(operator_completions(op)))
        for op in [od12_1, od12_2, od12_3, od12_4, od12_5, od12_6]
    }

    model_names = list(map(lambda i: "OD12_" + str(i), range(1, 7)))
    model_dict = defaultdict(set)
    for a, b in combinations(model_names, 2):
        for model in models[a]:
            if model in models[b]:
                model_dict[model].add(a)
                model_dict[model].add(b)

    return model_dict
예제 #9
0
def derivative_combinations(
    op: Union[Operator, EffectiveOperator]
) -> Union[List[Operator], List[EffectiveOperator]]:
    """Takes an operator with derivatives and returns a list of operators with
    equivalent SU2 structure with the derivative acted in all possible ways.

    Function expects a specific kind of input: no double derivatives on a single
    field.

    """
    eff_op = None
    if isinstance(op, EffectiveOperator):
        eff_op = op
        op = op.operator

    fields, epsilons, n_derivs = operator_strip_derivs(op).values()
    deriv_id_func = lambda x: x
    act_deriv = lambda f: D(f, allowed_lor_dyn(f))

    deriv_tuple = [act_deriv for _ in range(n_derivs)] + [
        deriv_id_func for _ in range(len(fields) - n_derivs)
    ]

    structs, out = [], []
    for perm in permutations(deriv_tuple):
        new_structure = []
        for field, func in zip(fields, perm):
            new_structure.append((func(field[0]), field[1]))

        structs.append(new_structure)

    remove_equivalent(structs, eq_func=lambda x, y: x == y)

    for struct in structs:
        new_op = construct_operator(struct, epsilons)
        if new_op.safe_simplify():
            out.append(new_op)

    return [EffectiveOperator(eff_op.name, i) for i in out] if eff_op else out
예제 #10
0
def test_1204_5986_completions():
    """Paper 1204.5986 lists UV completions of some derivative operators. Check
    output of program against these results.

    """

    from neutrinomass.tensormethod.sm import eb, H, L
    from neutrinomass.tensormethod.core import D

    # fields
    k = ("S", 0, 0, 0, ("3b", 0), ("y", 2))
    xi1 = ("S", 0, 0, 2, ("3b", 0), ("y", 1))
    sigma = ("F", 0, 0, 2, ("3b", 0), ("y", 0))
    ltilde = ("F", 0, 0, 1, ("3b", 0), ("y", Rational("1/2")))
    z = ("S", 0, 0, 1, ("3b", 0), ("y", Rational("3/2")))
    nur = ("F", 0, 0, 0, ("3b", 0), ("y", 0))

    # their notation
    phi_0_2 = ("S", 0, 0, 0, ("3b", 0), ("y", 2))
    phi_12_32 = ("S", 0, 0, 1, ("3b", 0), ("y", Rational("3/2")))
    phi_1_1 = ("S", 0, 0, 2, ("3b", 0), ("y", 1))
    psi_1_0 = ("F", 0, 0, 2, ("3b", 0), ("y", 0))
    psi_12_12 = ("F", 0, 0, 1, ("3b", 0), ("y", Rational("1/2")))
    psi_0_0 = ("F", 0, 0, 0, ("3b", 0), ("y", 0))

    o9 = EffectiveOperator(
        "O9",
        D(H, "11")("u0 d0 i0") * D(H, "11")("u1 d1 i1") * H("i2") * H("i3") *
        eb.conj("d2 g0") * eb.conj("d3 g1") * eps("-i0 -i2") * eps("-i1 -i3"),
    )

    # models from table 5 in 1204.5986 (the ones implying vanishing vertices
    # have been left out)
    o9_models_from_paper = {
        # first topology
        frozenset([phi_0_2, phi_12_32, phi_1_1]),
        frozenset([psi_12_12, phi_12_32, phi_1_1]),
        frozenset([psi_12_12, psi_1_0, phi_1_1]),
        frozenset([psi_12_12, psi_0_0]),
        frozenset([psi_12_12, psi_1_0]),
        frozenset([phi_1_1, psi_1_0]),
        # second topology
        frozenset([phi_0_2, phi_1_1]),
        frozenset([psi_12_12, phi_1_1]),
    }

    o7_models_from_paper = {
        frozenset([psi_1_0, phi_1_1]),
        frozenset([psi_12_12, phi_1_1]),
        frozenset([psi_12_12, psi_0_0]),
        frozenset([psi_12_12, psi_1_0]),
    }

    o7 = EffectiveOperator(
        "O7",
        eb.conj("d0 g0") * L("u0 i0") * D(H, "11")("u1 d1 i1") * H("i2") *
        H("i3") * eps("-i0 -i2") * eps("-i1 -i3"),
    )

    o7_comps = collect_completions(operator_completions(o7))
    o9_comps = collect_completions(operator_completions(o9))
    out = []
    for comps, models in [
        (o7_comps, o7_models_from_paper),
        (o9_comps, o9_models_from_paper),
    ]:
        for k, v in comps.items():
            # we have, they don't have
            if frozenset(k) not in models:
                print("They don't have:")
                print((k, v))
                out.append((k, v))

        for model in models:
            # they have, we don't have
            if model not in set(map(frozenset, comps.keys())):
                print("We don't have:")
                print(model)

    assert not out