Test out a funciton from the interwebs

https://gist.github.com/dfm/5699c69a708a5f9cacb96771b69287ec


In [2]:
import numpy as np
import theano
import pymc3 as pm


def eval_in_model(var, point=None, return_func=False, model=None, **kwargs):
    """Evaluate a Theano tensor or PyMC3 variable in a PyMC3 model
    
    This method builds a Theano function for evaluating a node in the graph
    given the required parameters.
    
    Args:
        var: The variable or tensor to evaluate.
        point (Optional): A ``dict`` of input parameter values. This can be
            ``model.test_point`` (default), the result of ``pymc3.find_MAP``,
            a point in a ``pymc3.MultiTrace`` or any other representation of
            the input parameters.
            
    """
    model = pm.modelcontext(model)
    if point is None:
        point = model.test_point

    kwargs["on_unused_input"] = kwargs.get("on_unused_input", "ignore")
    func = theano.function(model.vars, var, **kwargs)
    args = [point[k.name] for k in model.vars]
    
# return func(*args)

In [16]:
with pm.Model() as model:
    x = pm.Uniform('x', 0, 1)
    y = pm.Uniform('y', 0, 1)
    inside = pm.math.sum(x**2 + y**2 < 1)
    total  = x.shape.eval()
    pi     = pm.Deterministic('pi', 4*inside/total)
    sample = pm.sample(1000)


---------------------------------------------------------------------------
MissingInputError                         Traceback (most recent call last)
<ipython-input-16-218400214092> in <module>
      3     y = pm.Uniform('y', 0, 1)
      4     inside = pm.math.sum(x**2 + y**2 < 1)
----> 5     total  = x.shape.eval()
      6     pi     = pm.Deterministic('pi', 4*inside/total)
      7     sample = pm.sample(1000)

~/miniconda3/lib/python3.7/site-packages/theano/gof/graph.py in eval(self, inputs_to_values)
    520         inputs = tuple(sorted(inputs_to_values.keys(), key=id))
    521         if inputs not in self._fn_cache:
--> 522             self._fn_cache[inputs] = theano.function(inputs, self)
    523         args = [inputs_to_values[param] for param in inputs]
    524 

~/miniconda3/lib/python3.7/site-packages/theano/compile/function.py in function(inputs, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input)
    315                    on_unused_input=on_unused_input,
    316                    profile=profile,
--> 317                    output_keys=output_keys)
    318     return fn

~/miniconda3/lib/python3.7/site-packages/theano/compile/pfunc.py in pfunc(params, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input, output_keys)
    484                          accept_inplace=accept_inplace, name=name,
    485                          profile=profile, on_unused_input=on_unused_input,
--> 486                          output_keys=output_keys)
    487 
    488 

~/miniconda3/lib/python3.7/site-packages/theano/compile/function_module.py in orig_function(inputs, outputs, mode, accept_inplace, name, profile, on_unused_input, output_keys)
   1837                   on_unused_input=on_unused_input,
   1838                   output_keys=output_keys,
-> 1839                   name=name)
   1840         with theano.change_flags(compute_test_value="off"):
   1841             fn = m.create(defaults)

~/miniconda3/lib/python3.7/site-packages/theano/compile/function_module.py in __init__(self, inputs, outputs, mode, accept_inplace, function_builder, profile, on_unused_input, fgraph, output_keys, name)
   1485             # OUTPUT VARIABLES)
   1486             fgraph, additional_outputs = std_fgraph(inputs, outputs,
-> 1487                                                     accept_inplace)
   1488             fgraph.profile = profile
   1489         else:

~/miniconda3/lib/python3.7/site-packages/theano/compile/function_module.py in std_fgraph(input_specs, output_specs, accept_inplace)
    179 
    180     fgraph = gof.fg.FunctionGraph(orig_inputs, orig_outputs,
--> 181                                   update_mapping=update_mapping)
    182 
    183     for node in fgraph.apply_nodes:

~/miniconda3/lib/python3.7/site-packages/theano/gof/fg.py in __init__(self, inputs, outputs, features, clone, update_mapping)
    173 
    174         for output in outputs:
--> 175             self.__import_r__(output, reason="init")
    176         for i, output in enumerate(outputs):
    177             output.clients.append(('output', i))

~/miniconda3/lib/python3.7/site-packages/theano/gof/fg.py in __import_r__(self, variable, reason)
    344         # Imports the owners of the variables
    345         if variable.owner and variable.owner not in self.apply_nodes:
--> 346                 self.__import__(variable.owner, reason=reason)
    347         elif (variable.owner is None and
    348                 not isinstance(variable, graph.Constant) and

~/miniconda3/lib/python3.7/site-packages/theano/gof/fg.py in __import__(self, apply_node, check, reason)
    389                                      "for more information on this error."
    390                                      % (node.inputs.index(r), str(node)))
--> 391                         raise MissingInputError(error_msg, variable=r)
    392 
    393         for node in new_nodes:

MissingInputError: Input 0 of the graph (indices start from 0), used to compute sigmoid(x_interval__), was not provided and not given a value. Use the Theano flag exception_verbosity='high', for more information on this error.

In [17]:
pm.traceplot(sample)


---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-17-ec0b332ef19e> in <module>
----> 1 pm.traceplot(sample)

~/miniconda3/lib/python3.7/site-packages/pymc3/plots/traceplot.py in traceplot(trace, varnames, transform, figsize, lines, combined, plot_transformed, grid, alpha, priors, prior_alpha, prior_style, bw, ax, live_plot, skip_first, refresh_every, roll_over)
    117             ax[i, 0].grid(grid)
    118             ax[i, 1].set_title(str(v))
--> 119             ax[i, 1].plot(range(x0, x0 + width), d_stream, alpha=alpha)
    120 
    121             ax[i, 0].set_ylabel("Frequency")

~/miniconda3/lib/python3.7/site-packages/matplotlib/__init__.py in inner(ax, data, *args, **kwargs)
   1808                         "the Matplotlib list!)" % (label_namer, func.__name__),
   1809                         RuntimeWarning, stacklevel=2)
-> 1810             return func(ax, *args, **kwargs)
   1811 
   1812         inner.__doc__ = _add_data_doc(inner.__doc__,

~/miniconda3/lib/python3.7/site-packages/matplotlib/axes/_axes.py in plot(self, scalex, scaley, *args, **kwargs)
   1609         kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D._alias_map)
   1610 
-> 1611         for line in self._get_lines(*args, **kwargs):
   1612             self.add_line(line)
   1613             lines.append(line)

~/miniconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py in _grab_next_args(self, *args, **kwargs)
    391                 this += args[0],
    392                 args = args[1:]
--> 393             yield from self._plot_args(this, kwargs)
    394 
    395 

~/miniconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py in _plot_args(self, tup, kwargs)
    381                                   "with non-matching shapes is deprecated.")
    382         for j in range(max(ncx, ncy)):
--> 383             seg = func(x[:, j % ncx], y[:, j % ncy], kw, kwargs)
    384             ret.append(seg)
    385         return ret

ZeroDivisionError: integer division or modulo by zero

In [ ]: