diff --git a/pytensor/tensor/basic.py b/pytensor/tensor/basic.py index 931c7009b3..bf9638c473 100644 --- a/pytensor/tensor/basic.py +++ b/pytensor/tensor/basic.py @@ -664,6 +664,11 @@ def c_code_cache_version(self): tensor_from_scalar = TensorFromScalar() +@_vectorize_node.register(TensorFromScalar) +def vectorize_tensor_from_scalar(op, node, batch_x): + return identity(batch_x).owner + + class ScalarFromTensor(COp): __props__ = () @@ -2046,6 +2051,7 @@ def register_transfer(fn): """Create a duplicate of `a` (with duplicated storage)""" tensor_copy = Elemwise(ps.identity) pprint.assign(tensor_copy, printing.IgnorePrinter()) +identity = tensor_copy class Default(Op): @@ -4603,6 +4609,7 @@ def ix_(*args): "matrix_transpose", "default", "tensor_copy", + "identity", "transfer", "alloc", "identity_like", diff --git a/pytensor/tensor/optimize.py b/pytensor/tensor/optimize.py index 99a3d8b444..67ca71a210 100644 --- a/pytensor/tensor/optimize.py +++ b/pytensor/tensor/optimize.py @@ -560,7 +560,10 @@ def L_op(self, inputs, outputs, output_grads): implicit_f = grad(inner_fx, inner_x) df_dx, *df_dtheta_columns = jacobian( - implicit_f, [inner_x, *inner_args], disconnected_inputs="ignore" + implicit_f, + [inner_x, *inner_args], + disconnected_inputs="ignore", + vectorize=True, ) grad_wrt_args = implict_optimization_grads( df_dx=df_dx, @@ -816,7 +819,9 @@ def __init__( self.fgraph = FunctionGraph([variables, *args], [equations]) if jac: - jac_wrt_x = jacobian(self.fgraph.outputs[0], self.fgraph.inputs[0]) + jac_wrt_x = jacobian( + self.fgraph.outputs[0], self.fgraph.inputs[0], vectorize=True + ) self.fgraph.add_output(atleast_2d(jac_wrt_x)) self.jac = jac @@ -896,8 +901,14 @@ def L_op( inner_x, *inner_args = self.fgraph.inputs inner_fx = self.fgraph.outputs[0] - df_dx = jacobian(inner_fx, inner_x) if not self.jac else self.fgraph.outputs[1] - df_dtheta_columns = jacobian(inner_fx, inner_args, disconnected_inputs="ignore") + df_dx = ( + jacobian(inner_fx, inner_x, vectorize=True) + if not self.jac + else self.fgraph.outputs[1] + ) + df_dtheta_columns = jacobian( + inner_fx, inner_args, disconnected_inputs="ignore", vectorize=True + ) grad_wrt_args = implict_optimization_grads( df_dx=df_dx,