# Source code for pomdp_py.representations.belief.histogram

```
from pomdp_py.representations.distribution.histogram import Histogram
[docs]
def abstraction_over_histogram(current_histogram, state_mapper):
state_mappings = {s: state_mapper(s) for s in current_histogram}
hist = {}
for s in current_histogram:
a_s = state_mapper(s)
if a_s not in hist[a_s]:
hist[a_s] = 0
hist[a_s] += current_histogram[s]
return hist
[docs]
def update_histogram_belief(
current_histogram,
real_action,
real_observation,
observation_model,
transition_model,
oargs={},
targs={},
normalize=True,
static_transition=False,
next_state_space=None,
):
"""
update_histogram_belief(current_histogram, real_action, real_observation,
observation_model, transition_model, oargs={},
targs={}, normalize=True, deterministic=False)
This update is based on the equation:
:math:`B_{new}(s') = n O(z|s',a) \sum_s T(s'|s,a)B(s)`.
Args:
current_histogram (~pomdp_py.representations.distribution.Histogram)
is the Histogram that represents current belief.
real_action (~pomdp_py.framework.basics.Action)
real_observation (~pomdp_py.framework.basics.Observation)
observation_model (~pomdp_py.framework.basics.ObservationModel)
transition_model (~pomdp_py.framework.basics.TransitionModel)
oargs (dict) Additional parameters for observation_model (default {})
targs (dict) Additional parameters for transition_model (default {})
normalize (bool) True if the updated belief should be normalized
static_transition (bool) True if the transition_model is treated as static;
This basically means Pr(s'|s,a) = Indicator(s' == s). This then means
that sum_s Pr(s'|s,a)*B(s) = B(s'), since s' and s have the same state space.
This thus helps reduce the computation cost by avoiding the nested iteration
over the state space; But still, updating histogram belief requires
iteration of the state space, which may already be prohibitive.
next_state_space (set) the state space of the updated belief. By default,
this parameter is None and the state space given by current_histogram
will be directly considered as the state space of the updated belief.
This is useful for space and time efficiency in problems where the state
space contains parts that the agent knows will deterministically update,
and thus not keeping track of the belief over these states.
Returns:
Histogram: the histogram distribution as a result of the update
"""
new_histogram = {} # state space still the same.
total_prob = 0
if next_state_space is None:
next_state_space = current_histogram
for next_state in next_state_space:
observation_prob = observation_model.probability(
real_observation, next_state, real_action, **oargs
)
if not static_transition:
transition_prob = 0
for state in current_histogram:
transition_prob += (
transition_model.probability(
next_state, state, real_action, **targs
)
* current_histogram[state]
)
else:
transition_prob = current_histogram[next_state]
new_histogram[next_state] = observation_prob * transition_prob
total_prob += new_histogram[next_state]
# Normalize
if normalize:
for state in new_histogram:
if total_prob > 0:
new_histogram[state] /= total_prob
return Histogram(new_histogram)
```