jax-ml/jax · error · InconclusiveDimensionOperation

Cannot divide {self} by {divisor}.

Error message

Cannot divide {self} by {divisor}.

What it means

JAX's symbolic dimension algebra can only divide (floordiv) a polynomial term by another when every factor of the divisor cancels to a positive exponent, e.g. (n^3*m)//n == n^2*m. If any factor would end with exponent <= 0 (or the divisor has factors absent from the dividend), the operation is inconclusive.

Source

Thrown at jax/_src/export/shape_poly.py:380

  def mul(self, other: _DimTerm) -> _DimTerm:
    """
    Returns the product with another term. Example: (n^2*m) * n == n^3 * m.
    """
    return _DimTerm(_DimExpr._linear_combination_sorted_pairs(self._factors, 0, 1,
                                                              other._factors, 0, 1))

  def divide(self, divisor: _DimTerm) -> _DimTerm:
    """
    Divides by another term. Raises a InconclusiveDimensionOperation
    if the result is not a term.
    For example, (n^3 * m) // n == n^2*m, but n // m fails.
    """
    new_factors = _DimExpr._linear_combination_sorted_pairs(self._factors, 0, 1,
                                                            divisor._factors, 0, -1)
    for _, f_exp in new_factors:
      if f_exp <= 0:
        raise InconclusiveDimensionOperation(f"Cannot divide {self} by {divisor}.")
    return _DimTerm(new_factors)

  def evaluate(self, env: DimVarEnv, scope: SymbolicScope):
    prod = lambda xs: functools.reduce(_evaluate_multiply, xs) if xs else core.dim_constant(1)
    def pow_opt(v, p: int):
      return v if p == 1 else prod([v] * p)
    return prod([pow_opt(f.evaluate(env, scope), exp) for f, exp in self._factors])

  def __deepcopy__(self, memo):
    return _DimTerm(copy.deepcopy(self._factors, memo))

# The constant 1, as a term.
_DimTerm_one = _DimTerm(())


class _DimExpr:
  """Symbolic expressions using dimension variables.

View on GitHub (pinned to 1e1c6a8fc0)

Solutions

  1. Rewrite the computation so the division is by a factor that provably divides the dividend (express dims as n, n*2, etc.)
  2. Use explicit dimension variables tied by constraints (SymbolicScope equality constraints) so normalization can cancel
  3. Pass concrete shapes (drop polymorphism) for that part of the model

Example fix

# before
y = x.reshape(n, -1)  # divides n*m by n symbolically ok, but x.reshape(-1, m) with unknowns fails
# after
# make total size a known multiple: parameterize shape as (n, m) and reshape to (n*m,) explicitly
y = x.reshape(n * m)
Defensive patterns

Strategy: try-catch

Validate before calling

# before exporting, dry-run reshape arithmetic on a sample symbolic scope
scope = jax.export.shape_poly.SymbolicScope(())
n, m = jax.export.shape_poly.make_symbolic_scope_vars  # or construct dims via parsing
# simply: verify divisor factors subset of dividend factors

Try / catch

from jax._src.export import shape_poly
try:
    y = x.reshape(-1, m)
except shape_poly.InconclusiveDimensionOperation:
    y = x.reshape(n * m)  # explicit total

Prevention

When it happens

Trigger: Calling // or divmod on symbolic dims like n // m, (2*n) // n**2, or reshape logic that divides unrelated dim vars during polymorphic export.

Common situations: Reshapes or poolings with symbolic batch dims where JAX must divide symbolic dims that don't divide evenly; using x.reshape(-1, m) with two independent symbolic variables.

Related errors


AI-assisted analysis of jax-ml/jax@1e1c6a8fc0 (2026-08-27). Data as JSON: /api/errors/fd33cb61839a6dec. Report an issue: GitHub.