Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR adds base functionality to expand
marginalize
to handle closed form cases.It refactored the workflow so that when you call
pm.marginalize
we partition the graph into abstractMarginalRVs
that group the marginalized and dependent RVs together. This is a mere (hierarchical) graph partitioning. Rewrites are then needed to try to find suitable options for the marginalized subgraphs. The cases that were supported before with enumeration still are, and I added an example of a Normal(Normal) with the inner one being marginalized.I am not completly sure I want to proceed with the current approach. Delaying the rewrites until the logp is called doesn't give immediate feedback to the user. Perhaps better not to mix this with the logp derivation rewrites?
It's also cumbersome to work with nested marginalized RVs, because we don't have a great mechanism to trigger rewrites inside inner graphs, although we could implement such a graph rewriter.
I tried one another appproach that worked with tagging Ops that did the same task of partitioning the graph, but it became a mess when mixed with the other logprob rewrites. Maybe another hint that it's best to do these two things separately?