# Path: cam/sgnmt/utils.py
# GO_ID = 1
# EOS_ID = 2
# UNK_ID = 0
# NOTAPPLICABLE_ID = 3
# NEG_INF = float("-inf")
# INF = float("inf")
# EPS_P = 0.00001
#     GO_ID = 0
#     EOS_ID = 2
#     UNK_ID = 3
#     GO_ID = 2 # Usually not used
#     EOS_ID = 1
#     UNK_ID = 3 # Don't rely on this: UNK not standardized in T2T
# TMP_FILENAME = '/tmp/sgnmt.%s.fst' % os.getpid()
# MESSAGE_TYPE_DEFAULT = 1
# MESSAGE_TYPE_POSTERIOR = 2
# MESSAGE_TYPE_FULL_HYPO = 3
# def switch_to_fairseq_indexing():
# def switch_to_t2t_indexing():
# def log_sum_tropical_semiring(vals):
# def log_sum_log_semiring(vals):
# def oov_to_unk(seq, vocab_size, unk_idx=None):
# def argmax_n(arr, n):
# def argmax(arr):
# def common_viewkeys(obj):
# def common_iterable(obj):
# def common_get(obj, key, default):
# def common_contains(obj, key):
# def w2f(fstweight):
# def load_fst(path):
# def get_path(tmpl, sub = 1):
# def split_comma(s, func=None):
#     def notify(self, message, message_type = MESSAGE_TYPE_DEFAULT):
#     def __init__(self):
#     def add_observer(self, observer):
#     def notify_observers(self, message, message_type = MESSAGE_TYPE_DEFAULT):
# class Observer(object):
# class Observable(object):
# 
# Path: cam/sgnmt/utils.py
# class Observer(object):
#     """Super class for classes which observe (GoF design patten) other
#     classes.
#     """
#     
#     @abstractmethod
#     def notify(self, message, message_type = MESSAGE_TYPE_DEFAULT):
#         """Get a notification from an observed object.
#         
#         Args:
#             message (object): the message sent by observed object
#             message_type (int): The type of the message. One of the
#                                 ``MESSAGE_TYPE_*`` variables
#         """
#         raise NotImplementedError
# 
# NEG_INF = float("-inf")
# 
# MESSAGE_TYPE_DEFAULT = 1


from abc import abstractmethod
from cam.sgnmt import utils
from cam.sgnmt.utils import Observer, NEG_INF, MESSAGE_TYPE_DEFAULT
        They are used in A* if the --heuristics parameter is set to 
        predictor. This function should return the future log *cost* 
        (i.e. the lower the better) given the current predictor state, 
        assuming that the last word in the partial hypothesis 'hypo' is
        consumed next. This function must not change the internal 
        predictor state.
        
        Args:
            hypo (PartialHypothesis): Hypothesis for which to estimate
                                      the future cost given the current
                                      predictor state
        
        Returns
            float. Future cost
        """
        return 0.0
    
    def get_unk_probability(self, posterior):
        """This function defines the probability of all words which are
        not in ``posterior``. This is usually used to combine open and
        closed vocabulary predictors. The argument ``posterior`` should 
        have been produced with ``predict_next()``
        
        Args:
            posterior (list,array,dict): Return value of the last call
                                         of ``predict_next``
        
        Returns:
            float: Score to use for words outside ``posterior``
        """

# Path: cam/sgnmt/utils.py
# GO_ID = 1
# EOS_ID = 2
# UNK_ID = 0
# NOTAPPLICABLE_ID = 3
# NEG_INF = float("-inf")
# INF = float("inf")
# EPS_P = 0.00001
#     GO_ID = 0
#     EOS_ID = 2
#     UNK_ID = 3
#     GO_ID = 2 # Usually not used
#     EOS_ID = 1
#     UNK_ID = 3 # Don't rely on this: UNK not standardized in T2T
# TMP_FILENAME = '/tmp/sgnmt.%s.fst' % os.getpid()
# MESSAGE_TYPE_DEFAULT = 1
# MESSAGE_TYPE_POSTERIOR = 2
# MESSAGE_TYPE_FULL_HYPO = 3
# def switch_to_fairseq_indexing():
# def switch_to_t2t_indexing():
# def log_sum_tropical_semiring(vals):
# def log_sum_log_semiring(vals):
# def oov_to_unk(seq, vocab_size, unk_idx=None):
# def argmax_n(arr, n):
# def argmax(arr):
# def common_viewkeys(obj):
# def common_iterable(obj):
# def common_get(obj, key, default):
# def common_contains(obj, key):
# def w2f(fstweight):
# def load_fst(path):
# def get_path(tmpl, sub = 1):
# def split_comma(s, func=None):
#     def notify(self, message, message_type = MESSAGE_TYPE_DEFAULT):
#     def __init__(self):
#     def add_observer(self, observer):
#     def notify_observers(self, message, message_type = MESSAGE_TYPE_DEFAULT):
# class Observer(object):
# class Observable(object):
# 
# Path: cam/sgnmt/utils.py
# class Observer(object):
#     """Super class for classes which observe (GoF design patten) other
#     classes.
#     """
#     
#     @abstractmethod
#     def notify(self, message, message_type = MESSAGE_TYPE_DEFAULT):
#         """Get a notification from an observed object.
#         
#         Args:
#             message (object): the message sent by observed object
#             message_type (int): The type of the message. One of the
#                                 ``MESSAGE_TYPE_*`` variables
#         """
#         raise NotImplementedError
# 
# NEG_INF = float("-inf")
# 
# MESSAGE_TYPE_DEFAULT = 1


# Path: cam/sgnmt/predictors/core.py
from abc import abstractmethod
from cam.sgnmt import utils
from cam.sgnmt.utils import Observer, NEG_INF, MESSAGE_TYPE_DEFAULT

        They are used in A* if the --heuristics parameter is set to 
        predictor. This function should return the future log *cost* 
        (i.e. the lower the better) given the current predictor state, 
        assuming that the last word in the partial hypothesis 'hypo' is
        consumed next. This function must not change the internal 
        predictor state.
        
        Args:
            hypo (PartialHypothesis): Hypothesis for which to estimate
                                      the future cost given the current
                                      predictor state
        
        Returns
            float. Future cost
        """
        return 0.0
    
    def get_unk_probability(self, posterior):
        """This function defines the probability of all words which are
        not in ``posterior``. This is usually used to combine open and
        closed vocabulary predictors. The argument ``posterior`` should 
        have been produced with ``predict_next()``
        
        Args:
            posterior (list,array,dict): Return value of the last call
                                         of ``predict_next``
        
        Returns:
            float: Score to use for words outside ``posterior``
        """

        return NEG_INF