Source code for csle_tolerance.util.pomdp_solve_parser

from typing import List, Tuple
import numpy as np


[docs]class PomdpSolveParser: """ Parser of the results of the pomdp-solver by Cassandra et. al. (See http://www.pomdp.org/) """
[docs] @staticmethod def parse_alpha_vectors(file_path: str) -> List[Tuple[int, List[float]]]: """ Parses alpha vectors from a given file location :param file_path: path to the file where the alpha vectors are solved :return: a list with (action, alphavector) """ with open(file_path, 'r') as f: file_contents_str = f.read() lines = file_contents_str.split("\n") non_empty_lines = list(filter(lambda x: x != "", lines)) num_vectors = int(len(non_empty_lines) / 2) alpha_vectors = [] for i in range(num_vectors): line_index = i * 2 action = int(non_empty_lines[line_index]) alpha_vector = list(map(lambda x: round(float(x), 5), list(filter(lambda x: x != '', non_empty_lines[line_index + 1].split(" "))))) alpha_vectors.append((action, alpha_vector)) return alpha_vectors
[docs] @staticmethod def optimal_avg_value(file_path_to_alpha_vectors: str, initial_belief: float, btr: int) -> float: """ Computes the optimal average value given a set of alpha vectors :param file_path_to_alpha_vectors: :param initial_belief: the belief to compute the value for :param btr: the BTR constraint/horizon :return: the optimal average value """ alpha_vectors = PomdpSolveParser.parse_alpha_vectors(file_path=file_path_to_alpha_vectors) b_vec: List[float] = [1.0 - initial_belief, initial_belief] dot_vals: List[float] = [] for i in range(len(alpha_vectors)): dot_vals.append(-np.dot(b_vec, alpha_vectors[i][1][0:2])) min_index: int = int(np.argmin(dot_vals)) value: float = dot_vals[min_index] return float(value / btr)