def perform_ve_inference(self, query_variable, evidence_variables): """Calculates the probability distribution P(query_variable|evidence_variables) using variable elimination. Assumes that we have only one query variable. Keyword arguments: query_variable -- The name of the query variable (as called in the network). evidence_variables -- A dictionary containing variable names as keys and observed values as values. Returns: distribution -- A dictionary containing the values of the query variable as keys and the probabilities as values. """ known_variables = list(evidence_variables.keys()) known_variables.append(query_variable) hidden_variables = [] for _,var in enumerate(self.network.V): if var not in known_variables: hidden_variables.append(var) variables, dependency_levels = self.__find_dependency_levels(known_variables, hidden_variables) #we don't want the query variable to be considered as known #in the factor creation process known_variables.remove(query_variable) factors = self.__create_factors(evidence_variables, variables, dependency_levels) current_factor = Factor() for i in xrange(len(hidden_variables)-1, -1, -1): current_factor = self.__multiply_factors(factors, current_factor, dependency_levels, i) current_factor.sum_out(hidden_variables[i]) current_factor = self.__multiply_factors(factors, current_factor, dependency_levels, -1) alpha = sum(numpy.array(current_factor.probabilities)) distribution = dict() for i,value in enumerate(current_factor.values): distribution[value[0]] = current_factor.probabilities[i] / alpha return distribution