def process()

in scripts/compute_upperbound.py [0:0]


def process(configs, feature_loaders, num_steps, step_fn=step_agnostic, action_space=['UP', 'LEFT', 'RIGHT', 'DOWN'], condition_on_action=False):
    correct, cnt = 0, 0

    all_possible_actions = [[]]
    if num_steps > 1:
        action_set = [action_space] * (num_steps - 1)
        all_possible_actions = list(itertools.product(*action_set))

    for config in configs:
        for a in all_possible_actions:
            neighborhood = config['neighborhood']
            target_loc = config['target_location']
            boundaries = config['boundaries']

            obs = {k: list() for k in feature_loaders.keys()}
            actions = list()
            loc = copy.deepcopy(config['target_location'])
            loc[2] = random.randint(0, 3)
            for p in range(num_steps):
                for k, feature_loader in feature_loaders.items():
                    obs[k].append(feature_loader.get(neighborhood, loc))

                if p != num_steps - 1:
                    sampled_act = a[p]
                    actions.append(sampled_act)
                    loc = step_fn(sampled_act, loc, boundaries)
            act_seq = None
            if condition_on_action:
                act_seq = a
            correct += prediction_upperbound(obs['goldstandard'], feature_loaders['goldstandard'],
                                             neighborhood, boundaries, loc,
                                             step_fn=step_fn, actions=act_seq, action_space=action_space)
            cnt += 1

    return correct/cnt