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


		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
		variance = expected_value_monte_carlo(func1, u, Sigma_x,self.n) \
				   + expected_value_monte_carlo(func2, u, Sigma_x,self.n) - mu**2



		return mu, variance
	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)


		func = lambda x: py(x, y) #* mvnorm(x, u, Sigma_x)
		return expected_value_monte_carlo(func, u, Sigma_x,self.n)
	def propagate_mean(self, u, Sigma_x):

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

		return expected_value_monte_carlo(func, u, Sigma_x,self.n)