Sample_prior_predictive failing with shape argument

Hi, I have a simple inference described below. The sample_prior_predictive fails as soon as I specify shape=1 in the priors. Could anyone help me figure out why this is happening?

with pm.Model() as model:
    a = pm.Normal("a",shape=1)
    b = pm.HalfNormal("b",shape=1)
    obs = [1,2,.5]
    likelihood = pm.Normal("n",mu=a,sd=b,observed=obs)
    trace =pm.sample()
    
    prior_pc = pm.sample_prior_predictive() # fails with ValueError

Can you post the complete error trace?

hi! thank you for getting back to me.

full error trace below:

Traceback (most recent call last):
  File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/distribution.py", line 801, in _draw_value
    return dist_tmp.random(point=point, size=size)
  File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/continuous.py", line 494, in random
    mu, t    au, _ = draw_values([self.mu, self.tau, self.sigma],
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/distribution.py", line 661, in draw_values
        value = _draw_value(param,
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/distribution.py", line 842, in _draw_value
        output = func(*input_vals)
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/numpy/lib/function_base.py", line 2108, in __call__
        return self._vectorize_call(func=func, args=vargs)
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/numpy/lib/function_base.py", line 2182, in _vectorize_call
        res = self._vectorize_call_with_signature(func, args)
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/numpy/lib/function_base.py", line 2223, in _vectorize_call_with_signature
        results = func(*(arg[index] for arg in args))
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/theano/compile/function_module.py", line 811, in __call__
        s.storage[0] = s.type.filter(
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/theano/tensor/type.py", line 194, in filter
        raise TypeError("Non-unit value on shape on a broadcastable"
    TypeError: ('Bad input argument to theano function with name "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/distribution.py:692" at index 0 (0-based). ', 'Non-unit value on shape on a broadcastable dimension.', (500,), (True,))

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/sampling.py", line 1495, in sample_prior_predictive
        values = draw_values([model[name] for name in names], size=samples)
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/distribution.py", line 617, in draw_values
        value = _draw_value(next_,
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/distribution.py", line 809, in _draw_value
        val = np.atleast_1d(dist_tmp.random(point=point,
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/continuous.py", line 494, in random
        mu, tau, _ = draw_values([self.mu, self.tau, self.sigma],
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/distribution.py", line 661, in draw_values
        value = _draw_value(param,
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/pymc3/distributions/distribution.py", line 842, in _draw_value
        output = func(*input_vals)
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/numpy/lib/function_base.py", line 2108, in __call__
        return self._vectorize_call(func=func, args=vargs)
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/numpy/lib/function_base.py", line 2182, in _vectorize_call
        res = self._vectorize_call_with_signature(func, args)
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/numpy/lib/function_base.py", line 2211, in _vectorize_call_with_signature
        broadcast_shape, dim_sizes = _parse_input_dimensions(
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/numpy/lib/function_base.py", line 1873, in _parse_input_dimensions
        _update_dim_sizes(dim_sizes, arg, core_dims)
      File "/home/bjorhart/miniconda3/envs/m_s_5/lib/python3.9/site-packages/numpy/lib/function_base.py", line 1836, in _update_dim_sizes
        raise ValueError(
    ValueError: 0-dimensional argument does not have enough dimensions for all core dimensions ('i_0_0',)

I should add that sample_posterior_predictive works just fine.

Is there a solution to this?

This feels like a bug to me, is there a workaround or is this something i need to make a working hack for?

Which pymc3 version and operating system are you using? On Linux, V3.11.2, I don’t get any error.

Thanks for getting back to me! I am running a linux subsystem for windows, with ubntu 18.04. I am running with pymc3==3.8, python==3.9.1

I confirmed on Google colab this error happens with pymc3==3.8. I would suggest you remove the explicit shape=1 or update pymc3 to the latest version if you can.

2 Likes