def to_v(self, x): for k in x.keys(): x[k] = x[k] / self.message_to_x[k] p = tf.concat([xx.precision() for k, xx in x.items()], -1) mtp = tf.concat([xx.mean_times_precision() for k, xx in x.items()], -1) self.message_to_v = GaussianArray.from_array_natural(p, mtp) return self.message_to_v
def to_vector(self): parts = dict() for name in self._name: parts[name] = self.parts[name] / self.message_to_parts[name] p = tf.concat([part.precision() for k, part in parts.items()], -1) mtp = tf.concat([part.mean_times_precision() for k, part in parts.items()], -1) message_to_vector = GaussianArray.from_array_natural(p, mtp) self.vector.update(self.message_to_vector, message_to_vector) self.message_to_vector = message_to_vector
def to_x(self, v): v = v / self.message_to_v p, mtp = v.natural() for name, begin, size in zip(self._name, self._begin, self._size): self.message_to_x[name] = GaussianArray.from_array_natural( tf.slice(p, begin, size), tf.slice(mtp, begin, size) ) return self.message_to_x
def to_parts(self): v = self.vector / self.message_to_vector p, mtp = v.natural() for name, begin, size in zip(self._name, self._begin, self._size): message_to_part = GaussianArray.from_array_natural( tf.slice(p, begin, size), tf.slice(mtp, begin, size) ) self.parts[name].update(self.message_to_parts[name], message_to_part) self.message_to_parts[name] = message_to_part
def to_x(self, x, result, weight, bias): result = result / self.message_to_result x = x / self.message_to_x m = (tf.expand_dims(result.mean() - bias - tf.tensordot(x.mean(), weight, 1), 1) + tf.expand_dims(x.mean(), -1) * tf.expand_dims(weight, 0)) / tf.expand_dims(weight, 0) v = (tf.expand_dims(result.log_var() + tf.tensordot(x.log_var(), weight ** 2, 1), 1) - tf.expand_dims(x.log_var(), -1) * tf.expand_dims(weight ** 2, 0)) / tf.expand_dims(weight ** 2, 0) p = 1.0 / v mtp = m * p self.message_to_x = GaussianArray.from_array_natural( tf.reduce_sum(p, -1), tf.reduce_sum(mtp, -1) ) return self.message_to_x
def to_parent(self): result = self.child / self.message_to_child x = self.parent / self.message_to_parent weight = self.weight.value() bias = self.bias.value() m = (tf.expand_dims(result.mean() - bias - tf.tensordot(x.mean(), weight, 1), 1) + tf.expand_dims(x.mean(), -1) * tf.expand_dims(weight, 0)) / tf.expand_dims(weight, 0) v = (tf.expand_dims(result.log_var() + tf.tensordot(x.log_var(), weight ** 2, 1), 1) - tf.expand_dims(x.log_var(), -1) * tf.expand_dims(weight ** 2, 0)) / tf.expand_dims(weight ** 2, 0) p = 1.0 / v mtp = m * p message_to_parent = GaussianArray.from_array_natural( tf.reduce_sum(p, -1), tf.reduce_sum(mtp, -1) ) self.parent.update(self.message_to_parent, message_to_parent) self.message_to_parent = message_to_parent