def mixture_of_real_and_int():
   loc = ed.Normal(loc=0., scale=1., name="loc")
   flip = ed.Bernoulli(probs=0.5, name="flip")
   if tf.equal(flip, 1):
     x = ed.Normal(loc=loc, scale=0.5, sample_shape=5, name="x")
   else:
     x = ed.Poisson(rate=tf.nn.softplus(loc), sample_shape=3, name="x")
   return x
def model(home_id, away_id, score1_obs=None, score2_obs=None):
    # priors
    alpha = ed.Normal(loc=0.0, scale=1.0, name="alpha")
    sd_att = ed.StudenT(df=3.0, loc=0.0, scale=2.5, name="sd_att")
    sd_def = ed.StudenT(df=3.0, loc=0.0, scale=2.5, name="sd_def")

    home = ed.Normal(loc=0.0, scale=1.0, name="home")  # home advantage

    nt = len(np.unique(home_id))
    # team-specific model parameters
    attack = ed.Normal(loc=0, scale=sd_att, sample_shape=nt, name="attack")
    defend = ed.Normal(loc=0, scale=sd_def, sample_shape=nt, name="defend")

    # likelihood
    theta1 = tf.exp(alpha + home + attack[home_id] - defend[away_id])
    theta2 = tf.exp(alpha + attack[away_id] - defend[home_id])

    s1 = ed.Poisson(theta1, name="s1")
    s2 = ed.Poisson(theta2, name="s2")
    return s1, s2