The only solution I’ve found so far is to implement a custom distribution encapsulating these steps:
latent = pm.Normal('latent', mu=mu, sd=sigma)
probs = pm.math.dot(omega, pm.math.exp(latent)) / pm.math.exp(latent).sum(1)
y = pm.Categorical('y', p=probs, observed=samples)
Is there an easier/cleaner way? Technically speaking, I only need latent = pm.Normal('latent', mu=mu, sd=sigma) to sample a Gaussian.