def query(self, **kwds): # Ensure the evidence variables are actually # present invalid_vars = [v for v in kwds.keys() if v not in self.nodes] if invalid_vars: raise VariableNotInGraphError(invalid_vars) mu, sigma = self.get_joint_parameters() # Iteratively apply the evidence... result = dict() result['evidence'] = kwds for k, v in kwds.items(): x = MeansVector([[v]], names=[k]) sigma_yy, sigma_yx, sigma_xy, sigma_xx = (sigma.split(k)) mu_y, mu_x = mu.split(k) # See equations (6) and (7) of CK mu_y_given_x = MeansVector( (mu_y + sigma_yx * sigma_xx.I * (x - mu_x)).rows, names=mu_y.name_ordering) sigma_y_given_x = CovarianceMatrix( (sigma_yy - sigma_yx * sigma_xx.I * sigma_xy).rows, names=sigma_yy.name_ordering) sigma = sigma_y_given_x mu = mu_y_given_x result['joint'] = dict(mu=mu, sigma=sigma) return result
def test_get_joint_parameters(self, river_graph): mu, sigma = river_graph.get_joint_parameters() assert mu == MeansVector([[3], [4], [9], [14]], names=['a', 'b', 'c', 'd']) assert sigma == CovarianceMatrix( [[4, 4, 8, 12], [4, 5, 8, 13], [8, 8, 20, 28], [12, 13, 28, 42]], names=['a', 'b', 'c', 'd'])
def test_query(self, river_graph): result = river_graph.query(a=7) mu = result['joint']['mu'] sigma = result['joint']['sigma'] assert mu == MeansVector([[8], [17], [26]], names=['b', 'c', 'd']) assert sigma == CovarianceMatrix([[1, 0, 1], [0, 4, 4], [1, 4, 6]], names=['b', 'c', 'd']) result = river_graph.query(a=7, c=17) mu = result['joint']['mu'] sigma = result['joint']['sigma'] assert mu == MeansVector([[8], [26]], names=['b', 'd']) assert sigma == CovarianceMatrix([[1, 1], [1, 2]], names=['b', 'd']) result = river_graph.query(a=7, c=17, b=8) mu = result['joint']['mu'] sigma = result['joint']['sigma'] assert mu == MeansVector([[26]], names=['d']) assert sigma == CovarianceMatrix([[1]], names=['d'])
def test_assignment_of_joint_parameters(self, river_graph): assert river_graph.nodes['b'].func.joint_mu == MeansVector( [[3], [4]], names=['a', 'b']) assert river_graph.nodes[ 'b'].func.covariance_matrix == CovarianceMatrix([[4, 4], [4, 5]], names=['a', 'b'])