def propagate_GA(self, u, Sigma_x):
		mu = self.propagate_mean(u, Sigma_x)

		bounds = []
		for i in range(len(u)):
			bounds.append((u[i] - 6 * Sigma_x[i][i], u[i] + 6 * Sigma_x[i][i]))

		func1 = lambda x: (self.gp(x))[1] * mvnorm(x, u, Sigma_x)
		func2 = lambda x: (self.gp(x))[0] ** 2 * mvnorm(x, u, Sigma_x)
		variance = integrate(func1, bounds) + integrate(func2, bounds) - mu ** 2


		return mu, variance
	def propagate_mean(self, u, Sigma_x):

		bounds = []
		for i in range(len(u)):
			bounds.append((u[i] - 6 * Sigma_x[i][i], u[i] + 6 * Sigma_x[i][i]))

		func = lambda x: (self.gp(x))[0] * mvnorm(x, u, Sigma_x)

		return integrate(func, bounds)
	def propagate(self, y, u, Sigma_x):
		def py(x, y):
			mux, varx = self.gp(x)
			return 1 / (np.sqrt(2 * np.pi * varx)) * np.exp(-0.5 * (y - mux) ** 2 / varx)

		bounds = []
		for i in range(len(u)):
			bounds.append((u[i] - 6 * Sigma_x[i][i], u[i] + 6 * Sigma_x[i][i]))

		func = lambda x: py(x, y) * mvnorm(x, u, Sigma_x)
		return integrate(func, bounds)