def METHOD_NAME(sprint_opts, tags):
    """
    :param dict[str] sprint_opts:
    :param tf.Tensor tags: shape (batch,), of dtype string
    :return: (edges, weights, start_end_states). all together in one automaton.
      edges are of shape (4, num_edges), each (from, to, emission-idx, seq-idx), of dtype int32.
      weights are of shape (num_edges,), of dtype float32.
      start_end_states are of shape (2, batch), each (start,stop) state idx, batch = len(tags), of dtype int32.
    :rtype: (tf.Tensor, tf.Tensor, tf.Tensor)
    """
    def py_wrap_get_sprint_automata_for_batch(py_tags):
        """
        :param list[str] py_tags: len batch
        :return: (edges, weights, start_end_states)
        :rtype: (numpy.ndarray, numpy.ndarray, numpy.ndarray)
        """
        try:
            return py_get_sprint_automata_for_batch(sprint_opts=sprint_opts, tags=py_tags)
        except Exception:
            print("Exception in py_wrap_get_sprint_automata_for_batch:")
            import sys
            sys.excepthook(*sys.exc_info())
            raise
    tags.set_shape((None,))  # (batch,)
    edges, weights, start_end_states = tf_compat.v1.py_func(
        py_wrap_get_sprint_automata_for_batch,
        [tags],
        [tf.int32, tf.float32, tf.int32],
        name="get_sprint_automata_for_batch",
    )
    assert isinstance(edges, tf.Tensor)
    assert isinstance(weights, tf.Tensor)
    assert isinstance(start_end_states, tf.Tensor)
    edges.set_shape((4, None))  # (4, num_edges)
    weights.set_shape((None,))  # (num_edges,)
    start_end_states.set_shape((2, tags.get_shape().dims[0]))  # (2, batch)
    return edges, weights, start_end_states