def marginals(self, *args): self.do_inference() n = self.n proj = Gauss.Map(np.zeros((0, n))) # n -> 0 for t in args: proj = Gauss.copy(n).then(Gauss.tensor(proj, self.eval_term(t))) return self.state.then(proj)
def do_inference(self): n_eqs = len(self.equations) if n_eqs > 0: n = self.n joint = Gauss.Map(np.zeros((0, n))) # n -> 0 for (s, t) in self.equations: diff = self.eval_term(s + (-1.0) * t) joint = Gauss.copy(n).then(Gauss.tensor(joint, diff)) zz = np.zeros((n_eqs, 1)) zeros = Gauss.Map(np.zeros((n_eqs, 0)), zz) # 0 -> n_eqs if not Gauss.in_support(self.state.then(joint), zz): raise InferenceError("conditions cannot be satisfied") else: dis = self.state.disintegrate(joint) self.state = dis.dot(zeros) self.equations = []
def eval_term(self, term): (A, b) = self.eval_term_rec(term) return Gauss.Map(A, np.array([[b]]))