Exemplo n.º 1
0
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)
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
    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