def allowed_transitions(constraint_type: str, labels: Dict[int, str]) -> List[Tuple[int, int]]:
    """
    Given labels and a constraint type, returns the allowed transitions. It will
    additionally include transitions for the start and end states, which are used
    by the conditional random field.

    Parameters
    ----------
    constraint_type : ``str``, required
        Indicates which constraint to apply. Current choices are
        "BIO", "IOB1", "BIOUL", and "BMES".
    labels : ``Dict[int, str]``, required
        A mapping {label_id -> label}. Most commonly this would be the value from
        Vocabulary.get_index_to_token_vocabulary()

    Returns
    -------
    ``List[Tuple[int, int]]``
        The allowed transitions (from_label_id, to_label_id).
    """
    num_labels = len(labels)
    start_tag = num_labels
    end_tag = num_labels + 1
    labels_with_boundaries = list(labels.items()) + [(start_tag, "START"), (end_tag, "END")]

    allowed = []
    for from_label_index, from_label in labels_with_boundaries:
        if from_label in ("START", "END"):
            from_tag = from_label
            from_entity = ""
        else:
            from_tag = from_label[0]
            from_entity = from_label[1:]
        for to_label_index, to_label in labels_with_boundaries:
            if to_label in ("START", "END"):
                to_tag = to_label
                to_entity = ""
            else:
                to_tag = to_label[0]
                to_entity = to_label[1:]
            if is_transition_allowed(constraint_type, from_tag, from_entity,
                                     to_tag, to_entity):
                allowed.append((from_label_index, to_label_index))
    return allowed
def allowed_transitions ( constraint_type : str , labels : Dict [ int , str ] ) -> List [ Tuple [ int , int ] ] : num_labels = len ( labels ) start_tag = num_labels end_tag = num_labels + 1 labels_with_boundaries = list ( labels . items ( ) ) + [ ( start_tag , "START" ) , ( end_tag , "END" ) ] allowed = [ ] for from_label_index , from_label in labels_with_boundaries : if from_label in ( "START" , "END" ) : from_tag = from_label from_entity = "" else : from_tag = from_label [ 0 ] from_entity = from_label [ 1 : ] for to_label_index , to_label in labels_with_boundaries : if to_label in ( "START" , "END" ) : to_tag = to_label to_entity = "" else : to_tag = to_label [ 0 ] to_entity = to_label [ 1 : ] if is_transition_allowed ( constraint_type , from_tag , from_entity , to_tag , to_entity ) : allowed . append ( ( from_label_index , to_label_index ) ) return allowed
Given labels and a constraint type, returns the allowed transitions. It will
    additionally include transitions for the start and end states, which are used
    by the conditional random field.

    Parameters
    ----------
    constraint_type : ``str``, required
        Indicates which constraint to apply. Current choices are
        "BIO", "IOB1", "BIOUL", and "BMES".
    labels : ``Dict[int, str]``, required
        A mapping {label_id -> label}. Most commonly this would be the value from
        Vocabulary.get_index_to_token_vocabulary()

    Returns
    -------
    ``List[Tuple[int, int]]``
        The allowed transitions (from_label_id, to_label_id).