Задача 06B. hmm_forward

Входной файл:test.py   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать на языке программирования Python функцию

from typing import TypeVar
from collections.abc import Generator, Hashable

S = TypeVar('S', bound=Hashable) # state type
O = TypeVar('O', bound=Hashable) # observation type
def hmm_forward(
    initial_probability: dict[S, float],
    transition_probability: dict[S, dict[S, float]],
    observation_probability: dict[S, dict[O, float]]
) -> Generator[S, O, dict[S, float]]:
    """Implements [forward alogirthm](https://en.wikipedia.org/wiki/Forward_algorithm) for a hidden markov model.
    Each iteration the generator output the most porbable state of the model, receiving new observations through `send` method.
    Iteration stops after `None` value has been received and the generator outputs a dictionary mapping each state to its propability.

    Arguments:
        initial_probability: initial state probabilitites
        transition_probability: probabilities of transition from one state to another
        observation_probability: probabilities to observe each of the observations at each of the states

    Yields:
        most probable state

    Returns
        a mapping from each state to its propability
    """
    pass

Функция выполняет Forward algorithm для заданной скрытой марковской модели с начальными вероятностями initial_probability, вероятностями перехода transition_probability и вероятностями наблюдений observation_probability. Функция возвращает объект типа генератор, производящий на каждой итерации наиболее вероятное состояние модели. Генератор получает новые наблюдения через метод send. При получении значения None генератор останавливается и возвращает словарь вероятностей каждого состояния.

Формат выходных данных

Код решения должен содержать только импортируемые модули, определение и реализацию функции.

Примеры тестов

Входной файл (test.py) Стандартный выход
1 observations = ['umbrella', 'umbrella', 'no umbrella', 'umbrella', 'umbrella'] initial_probability = { 'rain': 0.7, 'sun': 0.3 } transition_probability = { 'rain': { 'rain': 0.7, 'sun': 0.3 }, 'sun': { 'rain': 0.3, 'sun': 0.7 } } observation_probability = { 'rain': { 'umbrella': 0.9, 'no umbrella': 0.1 }, 'sun': { 'umbrella': 0.2, 'no umbrella': 0.8 } } it = iter(hmm_forward( initial_probability, transition_probability, observation_probability )) print(next(it)) for s in observations: print(it.send(s)) try: next(it) except StopIteration as e: for i in sorted(e.value.keys()): print(i, f'{e.value[i]:.3f}')
rain
rain
rain
sun
rain
rain
rain 0.867
sun 0.133
        

0.056s 0.014s 15