Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rubi loops in rule50 #14600

Open
rwst opened this issue Apr 5, 2018 · 1 comment
Open

Rubi loops in rule50 #14600

rwst opened this issue Apr 5, 2018 · 1 comment

Comments

@rwst
Copy link
Contributor

rwst commented Apr 5, 2018

My 32GB RAM Linux system killed the voracious Rubi after 30min before it was too late:

In [7]: rubi_integrate((a + b*x)**(3/2) * (c + d*x)**(1/3), x)
Killed

This part of the backtrace repeats:

~/sympy/sympy/integrals/rubi/utility_function.py in Int(expr, var)
    160 def Int(expr, var):
    161     from sympy.integrals.rubi.rubi import rubi_integrate
--> 162     return rubi_integrate(expr, var)
    163 
    164 def Set(expr, value):

~/sympy/sympy/integrals/rubi/rubi.py in rubi_integrate(expr, var, showsteps)
    203         return S(expr)*var
    204 
--> 205     result = rubi.replace(Integral(expr, var))
    206 
    207     return result

~/.pyenv/versions/3.6.3/lib/python3.6/site-packages/matchpy-0.4.5.dev22+g39dabdc.d20180419-py3.6.egg/matchpy/matching/many_to_one.py in replace(self, expression, max_count)
    795                 try:
    796                     replacement, subst = next(iter(self.matcher.match(subexpr)))
--> 797                     result = replacement(**subst)
    798                     expression = functions.replace(expression, pos, result)
    799                     replaced = True

~/sympy/sympy/integrals/rubi/rules/linear_products.py in <lambda>(d, a, b, m, x, n, c)
    256 
    257     pattern50 = Pattern(Integral((a_ + x_*WC('b', S(1)))**m_*(c_ + x_*WC('d', S(1)))**n_, x_), CustomConstraint(lambda a, x: FreeQ(a, x)), CustomConstraint(lambda b, x: FreeQ(b, x)), CustomConstraint(lambda c, x: FreeQ(c, x)), CustomConstraint(lambda d, x: FreeQ(d, x)), CustomConstraint(lambda m, x: FreeQ(m, x)), CustomConstraint(lambda n, x: FreeQ(n, x)), CustomConstraint(lambda a, c, b, d: NonzeroQ(-a*d + b*c)), CustomConstraint(lambda m: Not(IntegerQ(m))), CustomConstraint(lambda n: Not(IntegerQ(n))), CustomConstraint(lambda m, n: RationalQ(m) | Not(SimplerQ(n + S(1), m + S(1)))))
--> 258     rule50 = ReplacementRule(pattern50, lambda d, a, b, m, x, n, c : (b/(-a*d + b*c))**(-IntPart(n))*(b*(c + d*x)/(-a*d + b*c))**(-FracPart(n))*(c + d*x)**FracPart(n)*Int((a + b*x)**m*(b*c/(-a*d + b*c) + b*d*x/(-a*d + b*c))**n, x))
    259     rubi.add(rule50)
    260 

~/sympy/sympy/integrals/rubi/utility_function.py in Int(expr, var)
    160 def Int(expr, var):
    161     from sympy.integrals.rubi.rubi import rubi_integrate
--> 162     return rubi_integrate(expr, var)

When using Rubi in Mathematica the following rule matches first:

Rule 71: If NeQ[b c-a d,0]&&GtQ[n,0]&&NeQ[m+n+1,0]&&!(IGtQ[m,0]&&(!IntegerQ[n]||(GtQ[m,0]&&LtQ[m-n,0])))&&!ILtQ[m+n+2,0]&&IntLinearQ[a,b,c,d,m,n,x],

\[Integral](a+b x)^m (c+d x)^n\[DifferentialD]x \[LongRightArrow] Simp[((a+b x)^(m+1) (c+d x)^n)/(b (m+n+1)),x]+Dist[(n (b c-a d))/(b (m+n+1)),\[Integral](a+b x)^m (c+d x)^(n-1)\[DifferentialD]x,x]

(6 (a + b x)^(5/2) (c + d x)^(1/3))/(17 b) + 
 Dist[(2 (b c - a d))/(17 b), Int[(a + b x)^(3/2)/(c + d x)^(2/3), x],
   x]
@rwst rwst changed the title Rubi exhausts system resources Rubi loops in rule50 Apr 19, 2018
@ashishkg0022
Copy link
Contributor

I think this is fixed in current master

In [4]: rubi_integrate((a + b*x)**(S(3)/2) * (c + d*x)**(S(1)/3), x)
Out[4]: 6*(a + b*x)**(3/2)*(c + d*x)**(4/3)/(17*d) + 54*sqrt(a + b*x)*(c + d*x)**(4/3)*(a*d - b*c)/(187*d**2) + 162*sqrt(a + b*x)*(c + d*x)**(1/3)*(a*d - b*c)**2/(935*b*d**2) - 108*3**(3/4)*sqrt((b**(2/3)*(c + d*x)**(2/3) - b**(1/3)*(c + d*x)**(1/3)*(a*d - b*c)**(1/3) + (a*d - b*c)**(2/3))/(b**(1/3)*(c + d*x)**(1/3) + (1 + sqrt(3))*(a*d - b*c)**(1/3))**2)*sqrt(sqrt(3) + 2)*(a*d - b*c)**3*(b**(1/3)*(c + d*x)**(1/3) + (a*d - b*c)**(1/3))*elliptic_f(asin((b**(1/3)*(c + d*x)**(1/3) - (-1 + sqrt(3))*(a*d - b*c)**(1/3))/(b**(1/3)*(c + d*x)**(1/3) + (1 + sqrt(3))*(a*d - b*c)**(1/3))), -7 - 4*sqrt(3))/(935*b**(4/3)*d**3*sqrt((a*d - b*c)**(1/3)*(b**(1/3)*(c + d*x)**(1/3) + (a*d - b*c)**(1/3))/(b**(1/3)*(c + d*x)**(1/3) + (1 + sqrt(3))*(a*d - b*c)**(1/3))**2)*sqrt(a - b*c/d + b*(c + d*x)/d))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants