(g1, g2, x)
return Or(*conds)
Return a condition under which the integral theorem applies.
Return a condition under which the integral theorem applies.
Return a condition under which the integral theorem applies .
def _check_antecedents(g1, g2, x):
    """ Return a condition under which the integral theorem applies. """
    from sympy import (re, Eq, Not, Ne, cos, I, exp, ceiling, sin, sign,
                       unpolarify)
    from sympy import arg as arg_, unbranched_argument as arg
    #  Yes, this is madness.
    # XXX TODO this is a testing *nightmare*
    # NOTE if you update these conditions, please update the documentation as well

    # The following conditions are found in
    # [P], Section 2.24.1
    #
    # They are also reproduced (verbatim!) at
    # http://functions.wolfram.com/HypergeometricFunctions/MeijerG/21/02/03/
    #
    # Note: k=l=r=alpha=1
    sigma, _ = _get_coeff_exp(g1.argument, x)
    omega, _ = _get_coeff_exp(g2.argument, x)
    s, t, u, v = S([len(g1.bm), len(g1.an), len(g1.ap), len(g1.bq)])
    m, n, p, q = S([len(g2.bm), len(g2.an), len(g2.ap), len(g2.bq)])
    bstar = s + t - (u + v)/2
    cstar = m + n - (p + q)/2
    rho = g1.nu + (u - v)/2 + 1
    mu = g2.nu + (p - q)/2 + 1
    phi = q - p - (v - u)
    eta = 1 - (v - u) - mu - rho
    psi = (pi*(q - m - n) + abs(arg(omega)))/(q - p)
    theta = (pi*(v - s - t) + abs(arg(sigma)))/(v - u)
    lambda_c = (q - p)*abs(omega)**(1/(q - p))*cos(psi) \
        + (v - u)*abs(sigma)**(1/(v - u))*cos(theta)

    def lambda_s0(c1, c2):
        return c1*(q - p)*abs(omega)**(1/(q - p))*sin(psi) \
            + c2*(v - u)*abs(sigma)**(1/(v - u))*sin(theta)
    lambda_s = Piecewise(
        ((lambda_s0(+1, +1)*lambda_s0(-1, -1)),
         And(Eq(arg(sigma), 0), Eq(arg(omega), 0))),
        (lambda_s0(sign(arg(omega)), +1)*lambda_s0(sign(arg(omega)), -1),
         And(Eq(arg(sigma), 0), Ne(arg(omega), 0))),
        (lambda_s0(+1, sign(arg(sigma)))*lambda_s0(-1, sign(arg(sigma))),
         And(Ne(arg(sigma), 0), Eq(arg(omega), 0))),
        (lambda_s0(sign(arg(omega)), sign(arg(sigma))), True))

    _debug('Checking antecedents:')
    _debug('  sigma=%s, s=%s, t=%s, u=%s, v=%s, b*=%s, rho=%s'
           % (sigma, s, t, u, v, bstar, rho))
    _debug('  omega=%s, m=%s, n=%s, p=%s, q=%s, c*=%s, mu=%s,'
           % (omega, m, n, p, q, cstar, mu))
    _debug('  phi=%s, eta=%s, psi=%s, theta=%s' % (phi, eta, psi, theta))

    c1 = True
    for g in [g1, g2]:
        for a in g1.an:
            for b in g1.bm:
                diff = a - b
                if (diff > 0) == True and diff.is_integer:
                    c1 = False

    tmp = []
    for b in g1.bm:
        for d in g2.bm:
            tmp += [re(1 + b + d) > 0]
    c2 = And(*tmp)

    tmp = []
    for a in g1.an:
        for c in g2.an:
            tmp += [re(1 + a + c) < 1 + 1]
    c3 = And(*tmp)

    tmp = []
    for c in g1.an:
        tmp += [(p - q)*re(1 + c - 1) - re(mu) > -S(3)/2]
    c4 = And(*tmp)

    tmp = []
    for d in g1.bm:
        tmp += [(p - q)*re(1 + d) - re(mu) > -S(3)/2]
    c5 = And(*tmp)

    tmp = []
    for c in g2.an:
        tmp += [(u - v)*re(1 + c - 1) - re(rho) > -S(3)/2]
    c6 = And(*tmp)

    tmp = []
    for d in g2.bm:
        tmp += [(u - v)*re(1 + d) - re(rho) > -S(3)/2]
    c7 = And(*tmp)

    c8 = (abs(phi) + 2*re((rho - 1)*(q - p) + (v - u)*(q - p) + (mu -
          1)*(v - u)) > 0)
    c9 = (abs(phi) - 2*re((rho - 1)*(q - p) + (v - u)*(q - p) + (mu -
          1)*(v - u)) > 0)
    c10 = (abs(arg(sigma)) < bstar*pi)
    c11 = Eq(abs(arg(sigma)), bstar*pi)
    c12 = (abs(arg(omega)) < cstar*pi)
    c13 = Eq(abs(arg(omega)), cstar*pi)

    # The following condition is *not* implemented as stated on the wolfram
    # function site. In the book of prudnikov there is an additional part
    # (the And involving re()). However, I only have this book in russian, and
    # I don't read any russian. The following condition is what other people
    # have told me it means.
    # Worryingly, it is different from the condition implemented in REDUCE.
    # The REDUCE implementation:
    #   https://reduce-algebra.svn.sourceforge.net/svnroot/reduce-algebra/trunk/packages/defint/definta.red
    #   (search for tst14)
    # The Wolfram alpha version:
    #   http://functions.wolfram.com/HypergeometricFunctions/MeijerG/21/02/03/03/0014/
    z0 = exp(-(bstar + cstar)*pi*I)
    zos = unpolarify(z0*omega/sigma)
    zso = unpolarify(z0*sigma/omega)
    if zos == 1/zso:
        c14 = And(Eq(phi, 0), bstar + cstar <= 1,
                  Or(Ne(zos, 1), re(mu + rho + v - u) < 1,
                     re(mu + rho + q - p) < 1))
    else:
        c14 = And(Eq(phi, 0), bstar - 1 + cstar <= 0,
                  Or(And(Ne(zos, 1), abs(arg_(1 - zos)) < pi),
                     And(re(mu + rho + v - u) < 1, Eq(zos, 1))))

        c14_alt = And(Eq(phi, 0), cstar - 1 + bstar <= 0,
                  Or(And(Ne(zso, 1), abs(arg_(1 - zso)) < pi),
                     And(re(mu + rho + q - p) < 1, Eq(zso, 1))))

        # Since r=k=l=1, in our case there is c14_alt which is the same as calling
        # us with (g1, g2) = (g2, g1). The conditions below enumerate all cases
        # (i.e. we don't have to try arguments reversed by hand), and indeed try
        # all symmetric cases. (i.e. whenever there is a condition involving c14,
        # there is also a dual condition which is exactly what we would get when g1,
        # g2 were interchanged, *but c14 was unaltered*).
        # Hence the following seems correct:
        c14 = Or(c14, c14_alt)

    tmp = [lambda_c > 0,
           And(Eq(lambda_c, 0), Ne(lambda_s, 0), re(eta) > -1),
           And(Eq(lambda_c, 0), Eq(lambda_s, 0), re(eta) > 0)]
    c15 = Or(*tmp)
    if _eval_cond(lambda_c > 0) != False:
        c15 = (lambda_c > 0)

    for cond, i in [(c1, 1), (c2, 2), (c3, 3), (c4, 4), (c5, 5), (c6, 6),
                    (c7, 7), (c8, 8), (c9, 9), (c10, 10), (c11, 11),
                    (c12, 12), (c13, 13), (c14, 14), (c15, 15)]:
        _debug('  c%s:' % i, cond)

    # We will return Or(*conds)
    conds = []

    def pr(count):
        _debug('  case %s:' % count, conds[-1])
    conds += [And(m*n*s*t != 0, bstar.is_positive is True, cstar.is_positive is True, c1, c2, c3, c10,
                  c12)]  # 1
    pr(1)
    conds += [And(Eq(u, v), Eq(bstar, 0), cstar.is_positive is True, sigma.is_positive is True, re(rho) < 1,
                  c1, c2, c3, c12)]  # 2
    pr(2)
    conds += [And(Eq(p, q), Eq(cstar, 0), bstar.is_positive is True, omega.is_positive is True, re(mu) < 1,
                  c1, c2, c3, c10)]  # 3
    pr(3)
    conds += [And(Eq(p, q), Eq(u, v), Eq(bstar, 0), Eq(cstar, 0),
                  sigma.is_positive is True, omega.is_positive is True, re(mu) < 1, re(rho) < 1,
                  Ne(sigma, omega), c1, c2, c3)]  # 4
    pr(4)
    conds += [And(Eq(p, q), Eq(u, v), Eq(bstar, 0), Eq(cstar, 0),
                  sigma.is_positive is True, omega.is_positive is True, re(mu + rho) < 1,
                  Ne(omega, sigma), c1, c2, c3)]  # 5
    pr(5)
    conds += [And(p > q, s.is_positive is True, bstar.is_positive is True, cstar >= 0,
                  c1, c2, c3, c5, c10, c13)]  # 6
    pr(6)
    conds += [And(p < q, t.is_positive is True, bstar.is_positive is True, cstar >= 0,
                  c1, c2, c3, c4, c10, c13)]  # 7
    pr(7)
    conds += [And(u > v, m.is_positive is True, cstar.is_positive is True, bstar >= 0,
                  c1, c2, c3, c7, c11, c12)]  # 8
    pr(8)
    conds += [And(u < v, n.is_positive is True, cstar.is_positive is True, bstar >= 0,
                  c1, c2, c3, c6, c11, c12)]  # 9
    pr(9)
    conds += [And(p > q, Eq(u, v), Eq(bstar, 0), cstar >= 0, sigma.is_positive is True,
                  re(rho) < 1, c1, c2, c3, c5, c13)]  # 10
    pr(10)
    conds += [And(p < q, Eq(u, v), Eq(bstar, 0), cstar >= 0, sigma.is_positive is True,
                  re(rho) < 1, c1, c2, c3, c4, c13)]  # 11
    pr(11)
    conds += [And(Eq(p, q), u > v, bstar >= 0, Eq(cstar, 0), omega.is_positive is True,
                  re(mu) < 1, c1, c2, c3, c7, c11)]  # 12
    pr(12)
    conds += [And(Eq(p, q), u < v, bstar >= 0, Eq(cstar, 0), omega.is_positive is True,
                  re(mu) < 1, c1, c2, c3, c6, c11)]  # 13
    pr(13)
    conds += [And(p < q, u > v, bstar >= 0, cstar >= 0,
                  c1, c2, c3, c4, c7, c11, c13)]  # 14
    pr(14)
    conds += [And(p > q, u < v, bstar >= 0, cstar >= 0,
                  c1, c2, c3, c5, c6, c11, c13)]  # 15
    pr(15)
    conds += [And(p > q, u > v, bstar >= 0, cstar >= 0,
                  c1, c2, c3, c5, c7, c8, c11, c13, c14)]  # 16
    pr(16)
    conds += [And(p < q, u < v, bstar >= 0, cstar >= 0,
                  c1, c2, c3, c4, c6, c9, c11, c13, c14)]  # 17
    pr(17)
    conds += [And(Eq(t, 0), s.is_positive is True, bstar.is_positive is True, phi.is_positive is True, c1, c2, c10)]  # 18
    pr(18)
    conds += [And(Eq(s, 0), t.is_positive is True, bstar.is_positive is True, phi.is_negative is True, c1, c3, c10)]  # 19
    pr(19)
    conds += [And(Eq(n, 0), m.is_positive is True, cstar.is_positive is True, phi.is_negative is True, c1, c2, c12)]  # 20
    pr(20)
    conds += [And(Eq(m, 0), n.is_positive is True, cstar.is_positive is True, phi.is_positive is True, c1, c3, c12)]  # 21
    pr(21)
    conds += [And(Eq(s*t, 0), bstar.is_positive is True, cstar.is_positive is True,
                  c1, c2, c3, c10, c12)]  # 22
    pr(22)
    conds += [And(Eq(m*n, 0), bstar.is_positive is True, cstar.is_positive is True,
                  c1, c2, c3, c10, c12)]  # 23
    pr(23)

    # The following case is from [Luke1969]. As far as I can tell, it is *not*
    # covered by prudnikov's.
    # Let G1 and G2 be the two G-functions. Suppose the integral exists from
    # 0 to a > 0 (this is easy the easy part), that G1 is exponential decay at
    # infinity, and that the mellin transform of G2 exists.
    # Then the integral exists.
    mt1_exists = _check_antecedents_1(g1, x, helper=True)
    mt2_exists = _check_antecedents_1(g2, x, helper=True)
    conds += [And(mt2_exists, Eq(t, 0), u < s, bstar.is_positive is True, c10, c1, c2, c3)]
    pr('E1')
    conds += [And(mt2_exists, Eq(s, 0), v < t, bstar.is_positive is True, c10, c1, c2, c3)]
    pr('E2')
    conds += [And(mt1_exists, Eq(n, 0), p < m, cstar.is_positive is True, c12, c1, c2, c3)]
    pr('E3')
    conds += [And(mt1_exists, Eq(m, 0), q < n, cstar.is_positive is True, c12, c1, c2, c3)]
    pr('E4')

    # Let's short-circuit if this worked ...
    # the rest is corner-cases and terrible to read.
    r = Or(*conds)
    if _eval_cond(r) != False:
        return r

    conds += [And(m + n > p, Eq(t, 0), Eq(phi, 0), s.is_positive is True, bstar.is_positive is True, cstar.is_negative is True,
                  abs(arg(omega)) < (m + n - p + 1)*pi,
                  c1, c2, c10, c14, c15)]  # 24
    pr(24)
    conds += [And(m + n > q, Eq(s, 0), Eq(phi, 0), t.is_positive is True, bstar.is_positive is True, cstar.is_negative is True,
                  abs(arg(omega)) < (m + n - q + 1)*pi,
                  c1, c3, c10, c14, c15)]  # 25
    pr(25)
    conds += [And(Eq(p, q - 1), Eq(t, 0), Eq(phi, 0), s.is_positive is True, bstar.is_positive is True,
                  cstar >= 0, cstar*pi < abs(arg(omega)),
                  c1, c2, c10, c14, c15)]  # 26
    pr(26)
    conds += [And(Eq(p, q + 1), Eq(s, 0), Eq(phi, 0), t.is_positive is True, bstar.is_positive is True,
                  cstar >= 0, cstar*pi < abs(arg(omega)),
                  c1, c3, c10, c14, c15)]  # 27
    pr(27)
    conds += [And(p < q - 1, Eq(t, 0), Eq(phi, 0), s.is_positive is True, bstar.is_positive is True,
                  cstar >= 0, cstar*pi < abs(arg(omega)),
                  abs(arg(omega)) < (m + n - p + 1)*pi,
                  c1, c2, c10, c14, c15)]  # 28
    pr(28)
    conds += [And(
        p > q + 1, Eq(s, 0), Eq(phi, 0), t.is_positive is True, bstar.is_positive is True, cstar >= 0,
                  cstar*pi < abs(arg(omega)),
                  abs(arg(omega)) < (m + n - q + 1)*pi,
                  c1, c3, c10, c14, c15)]  # 29
    pr(29)
    conds += [And(Eq(n, 0), Eq(phi, 0), s + t > 0, m.is_positive is True, cstar.is_positive is True, bstar.is_negative is True,
                  abs(arg(sigma)) < (s + t - u + 1)*pi,
                  c1, c2, c12, c14, c15)]  # 30
    pr(30)
    conds += [And(Eq(m, 0), Eq(phi, 0), s + t > v, n.is_positive is True, cstar.is_positive is True, bstar.is_negative is True,
                  abs(arg(sigma)) < (s + t - v + 1)*pi,
                  c1, c3, c12, c14, c15)]  # 31
    pr(31)
    conds += [And(Eq(n, 0), Eq(phi, 0), Eq(u, v - 1), m.is_positive is True, cstar.is_positive is True,
                  bstar >= 0, bstar*pi < abs(arg(sigma)),
                  abs(arg(sigma)) < (bstar + 1)*pi,
                  c1, c2, c12, c14, c15)]  # 32
    pr(32)
    conds += [And(Eq(m, 0), Eq(phi, 0), Eq(u, v + 1), n.is_positive is True, cstar.is_positive is True,
                  bstar >= 0, bstar*pi < abs(arg(sigma)),
                  abs(arg(sigma)) < (bstar + 1)*pi,
                  c1, c3, c12, c14, c15)]  # 33
    pr(33)
    conds += [And(
        Eq(n, 0), Eq(phi, 0), u < v - 1, m.is_positive is True, cstar.is_positive is True, bstar >= 0,
        bstar*pi < abs(arg(sigma)),
        abs(arg(sigma)) < (s + t - u + 1)*pi,
        c1, c2, c12, c14, c15)]  # 34
    pr(34)
    conds += [And(
        Eq(m, 0), Eq(phi, 0), u > v + 1, n.is_positive is True, cstar.is_positive is True, bstar >= 0,
        bstar*pi < abs(arg(sigma)),
        abs(arg(sigma)) < (s + t - v + 1)*pi,
        c1, c3, c12, c14, c15)]  # 35
    pr(35)

    return Or(*conds)
def _check_antecedents ( g1 , g2 , x ) : from sympy import ( re , Eq , Not , Ne , cos , I , exp , ceiling , sin , sign , unpolarify ) from sympy import arg as arg_ , unbranched_argument as arg #  Yes, this is madness. # XXX TODO this is a testing *nightmare* # NOTE if you update these conditions, please update the documentation as well # The following conditions are found in # [P], Section 2.24.1 # # They are also reproduced (verbatim!) at # http://functions.wolfram.com/HypergeometricFunctions/MeijerG/21/02/03/ # # Note: k=l=r=alpha=1 sigma , _ = _get_coeff_exp ( g1 . argument , x ) omega , _ = _get_coeff_exp ( g2 . argument , x ) s , t , u , v = S ( [ len ( g1 . bm ) , len ( g1 . an ) , len ( g1 . ap ) , len ( g1 . bq ) ] ) m , n , p , q = S ( [ len ( g2 . bm ) , len ( g2 . an ) , len ( g2 . ap ) , len ( g2 . bq ) ] ) bstar = s + t - ( u + v ) / 2 cstar = m + n - ( p + q ) / 2 rho = g1 . nu + ( u - v ) / 2 + 1 mu = g2 . nu + ( p - q ) / 2 + 1 phi = q - p - ( v - u ) eta = 1 - ( v - u ) - mu - rho psi = ( pi * ( q - m - n ) + abs ( arg ( omega ) ) ) / ( q - p ) theta = ( pi * ( v - s - t ) + abs ( arg ( sigma ) ) ) / ( v - u ) lambda_c = ( q - p ) * abs ( omega ) ** ( 1 / ( q - p ) ) * cos ( psi ) + ( v - u ) * abs ( sigma ) ** ( 1 / ( v - u ) ) * cos ( theta ) def lambda_s0 ( c1 , c2 ) : return c1 * ( q - p ) * abs ( omega ) ** ( 1 / ( q - p ) ) * sin ( psi ) + c2 * ( v - u ) * abs ( sigma ) ** ( 1 / ( v - u ) ) * sin ( theta ) lambda_s = Piecewise ( ( ( lambda_s0 ( + 1 , + 1 ) * lambda_s0 ( - 1 , - 1 ) ) , And ( Eq ( arg ( sigma ) , 0 ) , Eq ( arg ( omega ) , 0 ) ) ) , ( lambda_s0 ( sign ( arg ( omega ) ) , + 1 ) * lambda_s0 ( sign ( arg ( omega ) ) , - 1 ) , And ( Eq ( arg ( sigma ) , 0 ) , Ne ( arg ( omega ) , 0 ) ) ) , ( lambda_s0 ( + 1 , sign ( arg ( sigma ) ) ) * lambda_s0 ( - 1 , sign ( arg ( sigma ) ) ) , And ( Ne ( arg ( sigma ) , 0 ) , Eq ( arg ( omega ) , 0 ) ) ) , ( lambda_s0 ( sign ( arg ( omega ) ) , sign ( arg ( sigma ) ) ) , True ) ) _debug ( 'Checking antecedents:' ) _debug ( '  sigma=%s, s=%s, t=%s, u=%s, v=%s, b*=%s, rho=%s' % ( sigma , s , t , u , v , bstar , rho ) ) _debug ( '  omega=%s, m=%s, n=%s, p=%s, q=%s, c*=%s, mu=%s,' % ( omega , m , n , p , q , cstar , mu ) ) _debug ( '  phi=%s, eta=%s, psi=%s, theta=%s' % ( phi , eta , psi , theta ) ) c1 = True for g in [ g1 , g2 ] : for a in g1 . an : for b in g1 . bm : diff = a - b if ( diff > 0 ) == True and diff . is_integer : c1 = False tmp = [ ] for b in g1 . bm : for d in g2 . bm : tmp += [ re ( 1 + b + d ) > 0 ] c2 = And ( * tmp ) tmp = [ ] for a in g1 . an : for c in g2 . an : tmp += [ re ( 1 + a + c ) < 1 + 1 ] c3 = And ( * tmp ) tmp = [ ] for c in g1 . an : tmp += [ ( p - q ) * re ( 1 + c - 1 ) - re ( mu ) > - S ( 3 ) / 2 ] c4 = And ( * tmp ) tmp = [ ] for d in g1 . bm : tmp += [ ( p - q ) * re ( 1 + d ) - re ( mu ) > - S ( 3 ) / 2 ] c5 = And ( * tmp ) tmp = [ ] for c in g2 . an : tmp += [ ( u - v ) * re ( 1 + c - 1 ) - re ( rho ) > - S ( 3 ) / 2 ] c6 = And ( * tmp ) tmp = [ ] for d in g2 . bm : tmp += [ ( u - v ) * re ( 1 + d ) - re ( rho ) > - S ( 3 ) / 2 ] c7 = And ( * tmp ) c8 = ( abs ( phi ) + 2 * re ( ( rho - 1 ) * ( q - p ) + ( v - u ) * ( q - p ) + ( mu - 1 ) * ( v - u ) ) > 0 ) c9 = ( abs ( phi ) - 2 * re ( ( rho - 1 ) * ( q - p ) + ( v - u ) * ( q - p ) + ( mu - 1 ) * ( v - u ) ) > 0 ) c10 = ( abs ( arg ( sigma ) ) < bstar * pi ) c11 = Eq ( abs ( arg ( sigma ) ) , bstar * pi ) c12 = ( abs ( arg ( omega ) ) < cstar * pi ) c13 = Eq ( abs ( arg ( omega ) ) , cstar * pi ) # The following condition is *not* implemented as stated on the wolfram # function site. In the book of prudnikov there is an additional part # (the And involving re()). However, I only have this book in russian, and # I don't read any russian. The following condition is what other people # have told me it means. # Worryingly, it is different from the condition implemented in REDUCE. # The REDUCE implementation: #   https://reduce-algebra.svn.sourceforge.net/svnroot/reduce-algebra/trunk/packages/defint/definta.red #   (search for tst14) # The Wolfram alpha version: #   http://functions.wolfram.com/HypergeometricFunctions/MeijerG/21/02/03/03/0014/ z0 = exp ( - ( bstar + cstar ) * pi * I ) zos = unpolarify ( z0 * omega / sigma ) zso = unpolarify ( z0 * sigma / omega ) if zos == 1 / zso : c14 = And ( Eq ( phi , 0 ) , bstar + cstar <= 1 , Or ( Ne ( zos , 1 ) , re ( mu + rho + v - u ) < 1 , re ( mu + rho + q - p ) < 1 ) ) else : c14 = And ( Eq ( phi , 0 ) , bstar - 1 + cstar <= 0 , Or ( And ( Ne ( zos , 1 ) , abs ( arg_ ( 1 - zos ) ) < pi ) , And ( re ( mu + rho + v - u ) < 1 , Eq ( zos , 1 ) ) ) ) c14_alt = And ( Eq ( phi , 0 ) , cstar - 1 + bstar <= 0 , Or ( And ( Ne ( zso , 1 ) , abs ( arg_ ( 1 - zso ) ) < pi ) , And ( re ( mu + rho + q - p ) < 1 , Eq ( zso , 1 ) ) ) ) # Since r=k=l=1, in our case there is c14_alt which is the same as calling # us with (g1, g2) = (g2, g1). The conditions below enumerate all cases # (i.e. we don't have to try arguments reversed by hand), and indeed try # all symmetric cases. (i.e. whenever there is a condition involving c14, # there is also a dual condition which is exactly what we would get when g1, # g2 were interchanged, *but c14 was unaltered*). # Hence the following seems correct: c14 = Or ( c14 , c14_alt ) tmp = [ lambda_c > 0 , And ( Eq ( lambda_c , 0 ) , Ne ( lambda_s , 0 ) , re ( eta ) > - 1 ) , And ( Eq ( lambda_c , 0 ) , Eq ( lambda_s , 0 ) , re ( eta ) > 0 ) ] c15 = Or ( * tmp ) if _eval_cond ( lambda_c > 0 ) != False : c15 = ( lambda_c > 0 ) for cond , i in [ ( c1 , 1 ) , ( c2 , 2 ) , ( c3 , 3 ) , ( c4 , 4 ) , ( c5 , 5 ) , ( c6 , 6 ) , ( c7 , 7 ) , ( c8 , 8 ) , ( c9 , 9 ) , ( c10 , 10 ) , ( c11 , 11 ) , ( c12 , 12 ) , ( c13 , 13 ) , ( c14 , 14 ) , ( c15 , 15 ) ] : _debug ( '  c%s:' % i , cond ) # We will return Or(*conds) conds = [ ] def pr ( count ) : _debug ( '  case %s:' % count , conds [ - 1 ] ) conds += [ And ( m * n * s * t != 0 , bstar . is_positive is True , cstar . is_positive is True , c1 , c2 , c3 , c10 , c12 ) ] # 1 pr ( 1 ) conds += [ And ( Eq ( u , v ) , Eq ( bstar , 0 ) , cstar . is_positive is True , sigma . is_positive is True , re ( rho ) < 1 , c1 , c2 , c3 , c12 ) ] # 2 pr ( 2 ) conds += [ And ( Eq ( p , q ) , Eq ( cstar , 0 ) , bstar . is_positive is True , omega . is_positive is True , re ( mu ) < 1 , c1 , c2 , c3 , c10 ) ] # 3 pr ( 3 ) conds += [ And ( Eq ( p , q ) , Eq ( u , v ) , Eq ( bstar , 0 ) , Eq ( cstar , 0 ) , sigma . is_positive is True , omega . is_positive is True , re ( mu ) < 1 , re ( rho ) < 1 , Ne ( sigma , omega ) , c1 , c2 , c3 ) ] # 4 pr ( 4 ) conds += [ And ( Eq ( p , q ) , Eq ( u , v ) , Eq ( bstar , 0 ) , Eq ( cstar , 0 ) , sigma . is_positive is True , omega . is_positive is True , re ( mu + rho ) < 1 , Ne ( omega , sigma ) , c1 , c2 , c3 ) ] # 5 pr ( 5 ) conds += [ And ( p > q , s . is_positive is True , bstar . is_positive is True , cstar >= 0 , c1 , c2 , c3 , c5 , c10 , c13 ) ] # 6 pr ( 6 ) conds += [ And ( p < q , t . is_positive is True , bstar . is_positive is True , cstar >= 0 , c1 , c2 , c3 , c4 , c10 , c13 ) ] # 7 pr ( 7 ) conds += [ And ( u > v , m . is_positive is True , cstar . is_positive is True , bstar >= 0 , c1 , c2 , c3 , c7 , c11 , c12 ) ] # 8 pr ( 8 ) conds += [ And ( u < v , n . is_positive is True , cstar . is_positive is True , bstar >= 0 , c1 , c2 , c3 , c6 , c11 , c12 ) ] # 9 pr ( 9 ) conds += [ And ( p > q , Eq ( u , v ) , Eq ( bstar , 0 ) , cstar >= 0 , sigma . is_positive is True , re ( rho ) < 1 , c1 , c2 , c3 , c5 , c13 ) ] # 10 pr ( 10 ) conds += [ And ( p < q , Eq ( u , v ) , Eq ( bstar , 0 ) , cstar >= 0 , sigma . is_positive is True , re ( rho ) < 1 , c1 , c2 , c3 , c4 , c13 ) ] # 11 pr ( 11 ) conds += [ And ( Eq ( p , q ) , u > v , bstar >= 0 , Eq ( cstar , 0 ) , omega . is_positive is True , re ( mu ) < 1 , c1 , c2 , c3 , c7 , c11 ) ] # 12 pr ( 12 ) conds += [ And ( Eq ( p , q ) , u < v , bstar >= 0 , Eq ( cstar , 0 ) , omega . is_positive is True , re ( mu ) < 1 , c1 , c2 , c3 , c6 , c11 ) ] # 13 pr ( 13 ) conds += [ And ( p < q , u > v , bstar >= 0 , cstar >= 0 , c1 , c2 , c3 , c4 , c7 , c11 , c13 ) ] # 14 pr ( 14 ) conds += [ And ( p > q , u < v , bstar >= 0 , cstar >= 0 , c1 , c2 , c3 , c5 , c6 , c11 , c13 ) ] # 15 pr ( 15 ) conds += [ And ( p > q , u > v , bstar >= 0 , cstar >= 0 , c1 , c2 , c3 , c5 , c7 , c8 , c11 , c13 , c14 ) ] # 16 pr ( 16 ) conds += [ And ( p < q , u < v , bstar >= 0 , cstar >= 0 , c1 , c2 , c3 , c4 , c6 , c9 , c11 , c13 , c14 ) ] # 17 pr ( 17 ) conds += [ And ( Eq ( t , 0 ) , s . is_positive is True , bstar . is_positive is True , phi . is_positive is True , c1 , c2 , c10 ) ] # 18 pr ( 18 ) conds += [ And ( Eq ( s , 0 ) , t . is_positive is True , bstar . is_positive is True , phi . is_negative is True , c1 , c3 , c10 ) ] # 19 pr ( 19 ) conds += [ And ( Eq ( n , 0 ) , m . is_positive is True , cstar . is_positive is True , phi . is_negative is True , c1 , c2 , c12 ) ] # 20 pr ( 20 ) conds += [ And ( Eq ( m , 0 ) , n . is_positive is True , cstar . is_positive is True , phi . is_positive is True , c1 , c3 , c12 ) ] # 21 pr ( 21 ) conds += [ And ( Eq ( s * t , 0 ) , bstar . is_positive is True , cstar . is_positive is True , c1 , c2 , c3 , c10 , c12 ) ] # 22 pr ( 22 ) conds += [ And ( Eq ( m * n , 0 ) , bstar . is_positive is True , cstar . is_positive is True , c1 , c2 , c3 , c10 , c12 ) ] # 23 pr ( 23 ) # The following case is from [Luke1969]. As far as I can tell, it is *not* # covered by prudnikov's. # Let G1 and G2 be the two G-functions. Suppose the integral exists from # 0 to a > 0 (this is easy the easy part), that G1 is exponential decay at # infinity, and that the mellin transform of G2 exists. # Then the integral exists. mt1_exists = _check_antecedents_1 ( g1 , x , helper = True ) mt2_exists = _check_antecedents_1 ( g2 , x , helper = True ) conds += [ And ( mt2_exists , Eq ( t , 0 ) , u < s , bstar . is_positive is True , c10 , c1 , c2 , c3 ) ] pr ( 'E1' ) conds += [ And ( mt2_exists , Eq ( s , 0 ) , v < t , bstar . is_positive is True , c10 , c1 , c2 , c3 ) ] pr ( 'E2' ) conds += [ And ( mt1_exists , Eq ( n , 0 ) , p < m , cstar . is_positive is True , c12 , c1 , c2 , c3 ) ] pr ( 'E3' ) conds += [ And ( mt1_exists , Eq ( m , 0 ) , q < n , cstar . is_positive is True , c12 , c1 , c2 , c3 ) ] pr ( 'E4' ) # Let's short-circuit if this worked ... # the rest is corner-cases and terrible to read. r = Or ( * conds ) if _eval_cond ( r ) != False : return r conds += [ And ( m + n > p , Eq ( t , 0 ) , Eq ( phi , 0 ) , s . is_positive is True , bstar . is_positive is True , cstar . is_negative is True , abs ( arg ( omega ) ) < ( m + n - p + 1 ) * pi , c1 , c2 , c10 , c14 , c15 ) ] # 24 pr ( 24 ) conds += [ And ( m + n > q , Eq ( s , 0 ) , Eq ( phi , 0 ) , t . is_positive is True , bstar . is_positive is True , cstar . is_negative is True , abs ( arg ( omega ) ) < ( m + n - q + 1 ) * pi , c1 , c3 , c10 , c14 , c15 ) ] # 25 pr ( 25 ) conds += [ And ( Eq ( p , q - 1 ) , Eq ( t , 0 ) , Eq ( phi , 0 ) , s . is_positive is True , bstar . is_positive is True , cstar >= 0 , cstar * pi < abs ( arg ( omega ) ) , c1 , c2 , c10 , c14 , c15 ) ] # 26 pr ( 26 ) conds += [ And ( Eq ( p , q + 1 ) , Eq ( s , 0 ) , Eq ( phi , 0 ) , t . is_positive is True , bstar . is_positive is True , cstar >= 0 , cstar * pi < abs ( arg ( omega ) ) , c1 , c3 , c10 , c14 , c15 ) ] # 27 pr ( 27 ) conds += [ And ( p < q - 1 , Eq ( t , 0 ) , Eq ( phi , 0 ) , s . is_positive is True , bstar . is_positive is True , cstar >= 0 , cstar * pi < abs ( arg ( omega ) ) , abs ( arg ( omega ) ) < ( m + n - p + 1 ) * pi , c1 , c2 , c10 , c14 , c15 ) ] # 28 pr ( 28 ) conds += [ And ( p > q + 1 , Eq ( s , 0 ) , Eq ( phi , 0 ) , t . is_positive is True , bstar . is_positive is True , cstar >= 0 , cstar * pi < abs ( arg ( omega ) ) , abs ( arg ( omega ) ) < ( m + n - q + 1 ) * pi , c1 , c3 , c10 , c14 , c15 ) ] # 29 pr ( 29 ) conds += [ And ( Eq ( n , 0 ) , Eq ( phi , 0 ) , s + t > 0 , m . is_positive is True , cstar . is_positive is True , bstar . is_negative is True , abs ( arg ( sigma ) ) < ( s + t - u + 1 ) * pi , c1 , c2 , c12 , c14 , c15 ) ] # 30 pr ( 30 ) conds += [ And ( Eq ( m , 0 ) , Eq ( phi , 0 ) , s + t > v , n . is_positive is True , cstar . is_positive is True , bstar . is_negative is True , abs ( arg ( sigma ) ) < ( s + t - v + 1 ) * pi , c1 , c3 , c12 , c14 , c15 ) ] # 31 pr ( 31 ) conds += [ And ( Eq ( n , 0 ) , Eq ( phi , 0 ) , Eq ( u , v - 1 ) , m . is_positive is True , cstar . is_positive is True , bstar >= 0 , bstar * pi < abs ( arg ( sigma ) ) , abs ( arg ( sigma ) ) < ( bstar + 1 ) * pi , c1 , c2 , c12 , c14 , c15 ) ] # 32 pr ( 32 ) conds += [ And ( Eq ( m , 0 ) , Eq ( phi , 0 ) , Eq ( u , v + 1 ) , n . is_positive is True , cstar . is_positive is True , bstar >= 0 , bstar * pi < abs ( arg ( sigma ) ) , abs ( arg ( sigma ) ) < ( bstar + 1 ) * pi , c1 , c3 , c12 , c14 , c15 ) ] # 33 pr ( 33 ) conds += [ And ( Eq ( n , 0 ) , Eq ( phi , 0 ) , u < v - 1 , m . is_positive is True , cstar . is_positive is True , bstar >= 0 , bstar * pi < abs ( arg ( sigma ) ) , abs ( arg ( sigma ) ) < ( s + t - u + 1 ) * pi , c1 , c2 , c12 , c14 , c15 ) ] # 34 pr ( 34 ) conds += [ And ( Eq ( m , 0 ) , Eq ( phi , 0 ) , u > v + 1 , n . is_positive is True , cstar . is_positive is True , bstar >= 0 , bstar * pi < abs ( arg ( sigma ) ) , abs ( arg ( sigma ) ) < ( s + t - v + 1 ) * pi , c1 , c3 , c12 , c14 , c15 ) ] # 35 pr ( 35 ) return Or ( * conds )