def METHOD_NAME(
    a_true: str, a_sub: str, variables: List[str]
) -> Tuple[float, str]:
    sym_true, sym_true_source = phs.convert_string_to_sympy_with_source(
        a_true, variables, allow_complex=False, allow_trig_functions=False
    )
    sym_sub, sym_sub_source = phs.convert_string_to_sympy_with_source(
        a_sub, variables, allow_complex=False, allow_trig_functions=False
    )
    if sym_true_source == sym_sub_source:
        return (1, CORRECT_UNCONDITIONAL_FEEDBACK)
    try:
        if sym_true.equals(sym_sub):
            return (1, CORRECT_COMPLEX_FEEDBACK)
        elif sympy.limit(sym_sub, sympy.Symbol(variables[0]), sympy.oo) < sympy.sympify(
            0
        ):
            return (0.0, NEGATIVE_FEEDBACK)
        L = sympy.limit(
            sympy.simplify(sym_true / sym_sub), sympy.Symbol(variables[0]), sympy.oo
        )
        if L < sympy.sympify(0):
            return (0.0, NEGATIVE_FEEDBACK)
        elif L == sympy.oo:
            return (0.25, TOO_LOOSE_FEEDBACK)
        elif L == sympy.sympify(0):
            return (0.0, INCORRECT_FEEDBACK)
        elif L == sympy.sympify(1):
            return (0.5, LOWER_ORDER_TERMS_FEEDBACK)
        return (0.5, CONSTANT_FACTORS_FEEDBACK)
    except TypeError:
        return (0.0, TYPE_ERROR_FEEDBACK)