question: private List < UnaryRule > [ ] matrixMultiply ( List < UnaryRule > [ ] parentRules , List < UnaryRule > [ ] childRules ) { throw new Error ( "I'm broken by parent first" ) ; }
target:  'parentRules', 'childRules' and the return value all have the same format as 'unaryRulesWithParent', but can be thought of as square matrices. All this function does is a matrix multiplication, but operating directly on this non-standard matrix representation. 'parentRules' gives the probability of going from A to B, 'childRules' from B to C, and the return value from A to C (summing out B). This function is intended primarily to compute unaryRulesWithParent^n.