-
Notifications
You must be signed in to change notification settings - Fork 9
Provide symbol in VarName constructor as type parameter
#17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Codecov Report
@@ Coverage Diff @@
## main #17 +/- ##
=======================================
Coverage ? 82.45%
=======================================
Files ? 1
Lines ? 57
Branches ? 0
=======================================
Hits ? 47
Misses ? 10
Partials ? 0 Continue to review full report at Codecov.
|
|
I completely agree. This is basically the same effect as the recommendation to use |
This is a draft PR introducing a `Model` type that stores and makes use the model graph.
The main type introduced here is the `Model` struct which stores the `ModelState` and `DAG`, each of which are their own types. `ModelState` contains information about the node values, dependencies and eval functions and `DAG` contains the graph and topologically ordered vertex list.
A model can be constructed in the following way:
```julia
julia> nt = (
s2 = (0.0, (), () -> InverseGamma(2.0,3.0), :Stochastic),
μ = (1.0, (), () -> 1.0, :Logical),
y = (0.0, (:μ, :s2), (μ, s2) -> MvNormal(μ, sqrt(s2)), :Stochastic)
)
(s2 = (0.0, (), var"#33#36"(), :Stochastic), μ = (1.0, (), var"#34#37"(), :Logical), y = (0.0, (:μ, :s2), var"#35#38"(), :Stochastic))
julia> Model(nt)
Nodes:
μ = (value = 1.0, input = (), eval = var"#16#19"(), kind = :Logical)
s2 = (value = 0.0, input = (), eval = var"#15#18"(), kind = :Stochastic)
y = (value = 0.0, input = (:μ, :s2), eval = var"#17#20"(), kind = :Stochastic)
DAG:
3×3 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
⋅ ⋅ ⋅
⋅ ⋅ ⋅
1.0 1.0 ⋅
```
At present, only functions needed for the constructors are implemented, as well as indexing using `@varname`. I still need to complete the integration with the AbstractPPL api. TODO:
~~- [ ] `condition`/`decondition`,~~
~~- [ ] `sample`~~
~~- [ ] `logdensityof`~~
- [x] pure functions for ordered dictionary, as outlined in [AbstractPPL](https://github.com/TuringLang/AbstractPPL.jl#property-interface)
Feedback on `Model` structure welcome whilst I implement the remaining features!
|
Following this deprecation, is there any succinct way to do |
|
Nothing shorter than |
|
I'm not a fan of |
|
I mean, if this were a frequent practical problem, I can imagine a solution similar to @varnames x y z[1]expands (unhygienically) to x = VarName{:x}()
y = VarName{:y}()
var"z[1]" = @varname(z[1])But unless there's a pressing need, I'll leave it as an exercise for the interested reader. |
|
My use-case was within an inference library and I need to generate them programatically so the macro solution isn't what I want, but its an easy 1-line fix, I was just wondering if there did remain something builtin but its fine. |
Constant propagation in the
VarNamedoes not work reliably as we noticed in TuringLang/DynamicPPL.jl#221. Applying the changes in this PR improves performance noticeably.IMO there is no reason to keep the existing type-unstable constructor. I deprecated it, therefore it is a non-breaking change.