With the code cleanup finished I have started working on implementing DBNs. I have already gotten great comments and feedback from Duncan and James. Duncan had a suggestion that I have tied my graph classes to my tables too closely. I really think he has hit it on the nose. I am currently studying his table classes in order to see if I can glean some clever ways given his code as to how to adapt my implementation of tables in order to take this idea into account.
Basically, I am going to look to change all node and graph classes to maintain only sets of parents, neighbors, children, etc. The tables will maintain an ordered list of the nodes (essentially I will keep all of them in topological order). In my case, there will be one difference. I am planning on implementing many of the things that Duncan has, but I want to incorporate these changes into my Distributions module. It seems to me that to define a table along a set of variables inherently makes it more of a distribution than a plain table (though in Duncan's case he uses tables for other things so I suppose it makes sense for him).
On the DBN front, I am starting first with the JTree inference algorithm. Specifically, I am planning on using Kevin Murphy's Interface algorithm as presented in his thesis. After that I am going to move onto the jtree construction, which should be rather simple. According to Kevin Murphy's thesis, the structure of the jtree can be the exact same as in the static case, except that one needs to guarantee that the backward and forward interfaces are each in a clique. To do this one has only to make sure that all nodes within these interfaces are connected in moral graph. After that the goal will be to create the DBN structure itself. I have been thinking about what this last structure might look like and so far I have not come up with anything I really like. This is why I am putting it off until the end. I think that in the creation of the rest of the code, I will be using the DBN class a decent amount, which I am hoping gives me some clues as to the most advantageous design. As of now, I am imagining something along the lines of a list of nodes that specify what a single slice looks like (this class is going to have the requirement, for now, that all slices have to have the same structure) and then another list of the backward interface nodes and another for the forward. But what might work better, would be to really have the DBN class be just a list of nodes as in the static case. Then use a new type of temporal node which maintains a list of intra slice parents / children and a different set of lists of inter slice parents / children.
As I implement this, I will also try to be incorporating the changes to my Distributions module, so that that does not have to wait for the DBNs to be done.