Compare long , complex, expressions by replacing all symbols by a set of arbitrary expressions

    :param expr1: first expression
    :param expr2: second expression
    :return: True if expressions are empirically equal, false otherwise

def sympy_empirical_equal(expr1, expr2):

    """
    Compare long , complex, expressions by replacing all symbols by a set of arbitrary expressions

    :param expr1: first expression
    :param expr2: second expression
    :return: True if expressions are empirically equal, false otherwise
    """

    atoms_1 = expr1.atoms()
    atoms_1 = [a for a in atoms_1 if isinstance(a,sympy.Symbol)]
    atoms_2 = expr2.atoms()
    atoms_2 = [a for a in atoms_2 if isinstance(a,sympy.Symbol)]


    # lets us merge symbol in case one equation has more / different symbols
    atoms = set(atoms_1 + atoms_2)


    arbitrary_values = []
    arbitrary_values.append([i * 7.1 for i in range(1,len(atoms)+1)])
    arbitrary_values.append([i / 9.3 for i in range(1,len(atoms)+1)])
    arbitrary_values.append([i ** 2 for i in range(1,len(atoms)+1)])

    # test for arbitrary value. return false at the first failure
    for av in arbitrary_values:
        if not _eval_res_equal(expr1, expr2, atoms, av):
            return False

    return True