Skip to content

BUG: "constant / ScalarVariable" is unsupported + output_types_preference is missing in InRange #1698

@t-ikegami

Description

@t-ikegami

Describe the issue:

While defining a custom Op, I have encountered two misimplementations in pytensor.scalar. A fix proposal is atached. Tell me if pull-request is more appropriate. (Tested on PyTensor 2.34.0/Python 3.11 and PyTensor 2.35.1/Python 3.14.)

  1. __rtruediv__ is missing in ScalarVariable
>>> import pytensor.tensor as T
>>> x = T.dscalar("x")
>>> sx = T.scalar_from_tensor(x)
>>> 1.0 / sx
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'float' and 'ScalarVariable'
  1. Initialization of superclass is missing in InRange
>>> import pytensor
>>> import pytensor.tensor as T
>>> import pytensor.scalar as S
>>> func = T.elemwise.Elemwise(S.inopenrange, name = "func")
>>> x = T.dscalar("x")
>>> y = func(x, -1.0, 1.0)
>>> f = pytensor.function([x], y)    # f itself is successfully compiled.
ERROR (pytensor.graph.rewriting.basic): SequentialGraphRewriter apply <pytensor.graph.rewriting.basic.EquilibriumGraphRewriter object at 0x121d3c8d0>
ERROR (pytensor.graph.rewriting.basic): Traceback:
ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/basic.py", line 289, in apply
    sub_prof = rewriter.apply(fgraph)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/basic.py", line 2384, in apply
    for node_rewriter in self.node_tracker.get_trackers(node.op):
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/basic.py", line 1139, in get_trackers
    [
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/basic.py", line 1142, in <listcomp>
    if op_pattern.match_parameters(op)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/unify.py", line 427, in match_parameters
    if param.parameters and not param.match_parameters(sub_op):
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/unify.py", line 429, in match_parameters
    elif getattr(op, key) != param:
         ^^^^^^^^^^^^^^^^
AttributeError: 'InRange' object has no attribute 'output_types_preference'

Patch:

diff --git a/pytensor/scalar/basic.py b/pytensor/scalar/basic.py
index 5102d5f60..b0680e51b 100644
--- a/pytensor/scalar/basic.py
+++ b/pytensor/scalar/basic.py
@@ -924,6 +924,9 @@ class _scalar_py_operators:
     def __truediv__(self, other):
         return true_div(self, other)

+    def __rtruediv__(self, other):
+        return true_div(other, self)
+
     def __floordiv__(self, other):
         return int_div(self, other)

@@ -1654,6 +1657,7 @@ class InRange(LogicalComparison):
     nin = 3

     def __init__(self, openlow, openhi):
+        super().__init__()
         self.openlow = openlow
         self.openhi = openhi

Reproducable code example:

# 1.
import pytensor.tensor as T
x = T.dscalar("x")
sx = T.scalar_from_tensor(x)
1.0 / sx

# 2.
import pytensor
import pytensor.tensor as T
import pytensor.scalar as S
func = T.elemwise.Elemwise(S.inopenrange, name = "func")
x = T.dscalar("x")
y = func(x, -1.0, 1.0)
f = pytensor.function([x], y)

Error message:

1.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'float' and 'ScalarVariable'


2.
ERROR (pytensor.graph.rewriting.basic): SequentialGraphRewriter apply <pytensor.graph.rewriting.basic.EquilibriumGraphRewriter object at 0x121d3c8d0>
ERROR (pytensor.graph.rewriting.basic): Traceback:
ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/basic.py", line 289, in apply
    sub_prof = rewriter.apply(fgraph)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/basic.py", line 2384, in apply
    for node_rewriter in self.node_tracker.get_trackers(node.op):
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/basic.py", line 1139, in get_trackers
    [
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/basic.py", line 1142, in <listcomp>
    if op_pattern.match_parameters(op)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/unify.py", line 427, in match_parameters
    if param.parameters and not param.match_parameters(sub_op):
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ikegami/venv3.11/lib/python3.11/site-packages/pytensor/graph/rewriting/unify.py", line 429, in match_parameters
    elif getattr(op, key) != param:
         ^^^^^^^^^^^^^^^^
AttributeError: 'InRange' object has no attribute 'output_types_preference'

PyTensor version information:

PyTensor 2.34.0:Python 3.11:MacOS 26.0.1 and
PyTensor 2.35.1:Python 3.14:MacOS 26.0.1

Context for the issue:

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions