← All challenges
mediumsympy/sympy · v1.9

Unexpected `PolynomialError` when using simple `subs()` for particular expressions

mathsymbolicbase 624217179a
Mode

60 minutes, the full token budget.

  • Time limit60 min
  • Token budgetup to 1M
  • Worth up to210 XP

Opens VS Code with an AI agent in a new tab. Prompts, tokens, tool calls and test runs are recorded and scored.

Problem statement

I am seeing weird behavior with subs for particular expressions with hyperbolic sinusoids with piecewise arguments. When applying subs, I obtain an unexpected PolynomialError. For context, I was umbrella-applying a casting from int to float of all int atoms for a bunch of random expressions before using a tensorflow lambdify to avoid potential tensorflow type errors. You can pretend the expression below has a + 1 at the end, but below is the MWE that I could produce.

See the expression below, and the conditions in which the exception arises.

Sympy version: 1.8.dev

python
from sympy import *
from sympy.core.cache import clear_cache

x, y, z = symbols('x y z')

clear_cache()
expr = exp(sinh(Piecewise((x, y > x), (y, True)) / z))
# This works fine
expr.subs({1: 1.0})

clear_cache()
x, y, z = symbols('x y z', real=True)
expr = exp(sinh(Piecewise((x, y > x), (y, True)) / z))
# This fails with "PolynomialError: Piecewise generators do not make sense"
expr.subs({1: 1.0})  # error
# Now run it again (isympy...) w/o clearing cache and everything works as expected without error
expr.subs({1: 1.0})

I am not really sure where the issue is, but I think it has something to do with the order of assumptions in this specific type of expression. Here is what I found-

  • The error only (AFAIK) happens with cosh or tanh in place of sinh, otherwise it succeeds
  • The error goes away if removing the division by z
  • The error goes away if removing exp (but stays for most unary functions, sin, log, etc.)
  • The error only happens with real symbols for x and y (z does not have to be real)

Not too sure how to debug this one.

The environment starts at commit 624217179aaf (sympy/sympy 1.9), dependencies installed and tests runnable from the first minute. You are graded by hidden tests taken from the fix that was actually merged upstream.