pymc4のソースコード読んでみた - “RandomVariable”, Add model tests, fix travis pytest problem [4357d39]
TL;DR
treedict
クラスの依存性を以前のコミットで削除した代わりに、RandomVariable
クラス内でModel
のcontexts.stack
全てに値を設定することで、ほぼ同等の動きをしている。
コミット
2018/06/03のコミットです。
RandomVariable - random_variable.py
どちらにしろ挙動が変わらないことがわかる
- 【before】treedictクラスに依存している場合、ModelがネストするとparentにもRandomVariableが伝搬する
with WithTreeModel(name="model1") as model1: rv1 = WithTreeRandomVariable(name="rv1") with WithTreeModel(name="model2") as model2: rv2 = WithTreeRandomVariable(name="rv2") rv3 = WithTreeRandomVariable(name="rv3") print("model1: {}".format([v for v in model1.named_vars])) print("model2: {}".format([v for v in model2.named_vars])) # 出力: # => model1: ['rv1', 'rv2', 'rv3'] # => model2: ['rv2', 'rv3']
- 【after】treedictクラスに依存せず、RandomVarible内でModel.get_contextsを辿っている場合、ModelがネストするとparentにもRandomVariableが伝搬する
with Model(name="model1") as model1: rv1 = RandomVariable(name="rv1") with Model(name="model2") as model2: rv2 = RandomVariable(name="rv2") rv3 = RandomVariable(name="rv3") print("model1: {}".format([v for v in model1.named_vars])) print("model2: {}".format([v for v in model2.named_vars])) # 出力: # => model1: ['rv1', 'rv2', 'rv3'] # => model2: ['rv2', 'rv3']
TODO
- [ ] ほぼ同じ挙動がに見えるが、設計を少し変更した理由がわからない