funsor
funsor copied to clipboard
Delta integrate pattern
(Separating this from #593 PR)
This proposes the following logic for the Delta Integrate pattern:
- If
reduced_varis inintegrand.inputsthen apply substitution todeltaandintegrand:
delta = Delta("x", point, log_density)
integrand = Variable("x")
Integrate(delta, integrand, reduced_vars="x")
=> delta(x=point).exp() * integrand(x=point)
=> log_density.exp() * point
where log_density can be a Dice factor or an importance weight in general.
- If
reduced_varis not inintegrand.inputsthen just reducedelta:
delta = Delta("x", point, log_density)
integrand = Number(3.0)
Integrate(delta, integrand, reduced_vars="x")
=> delta.reduce(logaddexp, "x").exp() * integrand
=> 1 * 3.0
=> 3.0
where delta is normalized.