def get_probabilities_from_accessor(node, states: Dict[str, str], table_accessor) -> List[float]: variable_order = get_node_order(node) JavaIntArray = jp.JArray(jp.JInt) indexes = JavaIntArray([[ state.getName() for state in bayesianpy.network.get_variable_from_node(n).getStates() ].index(states[n.getName()]) for n in variable_order]) return table_accessor.get(indexes)
def set_soft(self, variable_name, states: Dict[str, float]): v = self._variables.get(variable_name) v_states = v.getStates() evidence = np.zeros(len(v_states)) for i, state in enumerate(v_states): if state.getName() in states: evidence[i] = states[state.getName()] javaDblArray = jp.JArray(jp.JDouble) j_evidence = javaDblArray(evidence.astype(float).tolist()) self._evidence.setStates(v, j_evidence) return self._evidence
def get_state_indexes_from_iterator(node, table_iterator) -> List[int]: JavaIntArray = jp.JArray(jp.JInt) state_order = JavaIntArray([0] * len(get_node_order(node))) table_iterator.getStates(state_order) return list(state_order)
def results(self, inference_engine, query_output): results = {} def state_generator(variables): for v in variables: tv = bayesianpy.network.get_variable(self._network, v) yield [state for state in tv.getStates()] if self._is_discrete_head: rows = [] query_variables = self._head_variables + self._tail_variables # creates dataframe of combinations + probability. for state_combinations in itertools.product( *state_generator(query_variables)): row = {} state_array = jp.JArray(state_combinations[0].getClass())( len(state_combinations)) for i, state in enumerate(state_combinations): state_array[i] = state for i, v in enumerate(state_combinations): row.update({query_variables[i]: state_array[i].getName()}) row.update( {'probability': self._distribution.get(state_array)}) rows.append(row) return rows else: if len(self._head_variables) == 2 and len( self._tail_variables) == 0: h0 = bayesianpy.network.get_variable(self._network, self._head_variables[0]) h1 = bayesianpy.network.get_variable(self._network, self._head_variables[1]) results.update({ "{}_{}_covariance".format(h0.getName(), h1.getName()): self._distribution.getCovariance(h0, h1), "{}_mean".format(h0.getName()): self._distribution.getMean(h0), "{}_mean".format(h1.getName()): self._distribution.getMean(h1) }) else: for state_combinations in itertools.product( *state_generator(self._discrete_variables)): state_array = jp.JArray(state_combinations[0].getClass())( len(state_combinations)) for i, state in enumerate(state_combinations): state_array[i] = state dist = Distribution( self._head_variables, self._tail_variables, [state.getName() for state in state_combinations]) for i, h in enumerate(self._head_variables): v = bayesianpy.network.get_variable( self._network, h) mean = self._distribution.getMean(v, state_array) if dist.is_covariant(): dist.append_mean(mean) for j, h1 in enumerate(self._head_variables): v1 = bayesianpy.network.get_variable( self._network, h1) cov = self._distribution.getCovariance( v, v1, state_array) dist.set_covariance_value(i, j, cov) else: dist.set_mean_variance( mean, self._distribution.getVariance( v, state_array)) results.update({dist.key(): dist}) return results