|
36 | 36 | walk, |
37 | 37 | ) |
38 | 38 | from pytensor.graph.fg import FunctionGraph, Output |
39 | | -from pytensor.graph.op import Op |
40 | 39 | from pytensor.scalar.basic import Cast |
41 | 40 | from pytensor.scan.op import Scan |
42 | 41 | from pytensor.tensor.basic import _as_tensor_variable |
|
63 | 62 | "compile_pymc", |
64 | 63 | "cont_inputs", |
65 | 64 | "convert_data", |
66 | | - "convert_generator_data", |
67 | 65 | "convert_observed_data", |
68 | 66 | "floatX", |
69 | | - "generator", |
70 | 67 | "gradient", |
71 | 68 | "hessian", |
72 | 69 | "hessian_diag", |
|
81 | 78 | def convert_observed_data(data) -> np.ndarray | Variable: |
82 | 79 | """Convert user provided dataset to accepted formats.""" |
83 | 80 | if isgenerator(data): |
84 | | - return convert_generator_data(data) |
| 81 | + raise TypeError("Data passed to `observed` cannot be a generator.") |
85 | 82 | return convert_data(data) |
86 | 83 |
|
87 | 84 |
|
88 | | -def convert_generator_data(data) -> TensorVariable: |
89 | | - warnings.warn( |
90 | | - "Generator data is deprecated and we intend to remove it." |
91 | | - " If you disagree and need this, please get in touch via https://github.com/pymc-devs/pymc/issues.", |
92 | | - DeprecationWarning, |
93 | | - stacklevel=2, |
94 | | - ) |
95 | | - return generator(data) |
96 | | - |
97 | | - |
98 | 85 | def convert_data(data) -> np.ndarray | Variable: |
99 | 86 | ret: np.ndarray | Variable |
100 | 87 | if hasattr(data, "to_numpy") and hasattr(data, "isnull"): |
@@ -625,98 +612,6 @@ def __call__(self, input): |
625 | 612 | return pytensor.clone_replace(self.tensor, {oldinput: input}, rebuild_strict=False) |
626 | 613 |
|
627 | 614 |
|
628 | | -class GeneratorOp(Op): |
629 | | - """ |
630 | | - Generator Op is designed for storing python generators inside pytensor graph. |
631 | | -
|
632 | | - __call__ creates TensorVariable |
633 | | - It has 2 new methods |
634 | | - - var.set_gen(gen): sets new generator |
635 | | - - var.set_default(value): sets new default value (None erases default value) |
636 | | -
|
637 | | - If generator is exhausted, variable will produce default value if it is not None, |
638 | | - else raises `StopIteration` exception that can be caught on runtime. |
639 | | -
|
640 | | - Parameters |
641 | | - ---------- |
642 | | - gen: generator that implements __next__ (py3) or next (py2) method |
643 | | - and yields np.arrays with same types |
644 | | - default: np.array with the same type as generator produces |
645 | | - """ |
646 | | - |
647 | | - __props__ = ("generator",) |
648 | | - |
649 | | - def __init__(self, gen, default=None): |
650 | | - warnings.warn( |
651 | | - "generator data is deprecated and will be removed in a future release", FutureWarning |
652 | | - ) |
653 | | - from pymc.data import GeneratorAdapter |
654 | | - |
655 | | - super().__init__() |
656 | | - if not isinstance(gen, GeneratorAdapter): |
657 | | - gen = GeneratorAdapter(gen) |
658 | | - self.generator = gen |
659 | | - self.set_default(default) |
660 | | - |
661 | | - def make_node(self, *inputs): |
662 | | - gen_var = self.generator.make_variable(self) |
663 | | - return Apply(self, [], [gen_var]) |
664 | | - |
665 | | - def perform(self, node, inputs, output_storage, params=None): |
666 | | - if self.default is not None: |
667 | | - output_storage[0][0] = next(self.generator, self.default) |
668 | | - else: |
669 | | - output_storage[0][0] = next(self.generator) |
670 | | - |
671 | | - def do_constant_folding(self, fgraph, node): |
672 | | - return False |
673 | | - |
674 | | - __call__ = pytensor.config.change_flags(compute_test_value="off")(Op.__call__) |
675 | | - |
676 | | - def set_gen(self, gen): |
677 | | - from pymc.data import GeneratorAdapter |
678 | | - |
679 | | - if not isinstance(gen, GeneratorAdapter): |
680 | | - gen = GeneratorAdapter(gen) |
681 | | - if not gen.tensortype == self.generator.tensortype: |
682 | | - raise ValueError("New generator should yield the same type") |
683 | | - self.generator = gen |
684 | | - |
685 | | - def set_default(self, value): |
686 | | - if value is None: |
687 | | - self.default = None |
688 | | - else: |
689 | | - value = np.asarray(value, self.generator.tensortype.dtype) |
690 | | - t1 = (False,) * value.ndim |
691 | | - t2 = self.generator.tensortype.broadcastable |
692 | | - if not t1 == t2: |
693 | | - raise ValueError("Default value should have the same type as generator") |
694 | | - self.default = value |
695 | | - |
696 | | - |
697 | | -def generator(gen, default=None): |
698 | | - """ |
699 | | - Create a generator variable with possibility to set default value and new generator. |
700 | | -
|
701 | | - If generator is exhausted variable will produce default value if it is not None, |
702 | | - else raises `StopIteration` exception that can be caught on runtime. |
703 | | -
|
704 | | - Parameters |
705 | | - ---------- |
706 | | - gen: generator that implements __next__ (py3) or next (py2) method |
707 | | - and yields np.arrays with same types |
708 | | - default: np.array with the same type as generator produces |
709 | | -
|
710 | | - Returns |
711 | | - ------- |
712 | | - TensorVariable |
713 | | - It has 2 new methods |
714 | | - - var.set_gen(gen): sets new generator |
715 | | - - var.set_default(value): sets new default value (None erases default value) |
716 | | - """ |
717 | | - return GeneratorOp(gen, default)() |
718 | | - |
719 | | - |
720 | 615 | def ix_(*args): |
721 | 616 | """ |
722 | 617 | PyTensor np.ix_ analog. |
|
0 commit comments