import torch


def indices_to_dense_vector(indices, size, indices_value=1., default_value=0):
    """
    Creates dense vector with indices set to specific value and rest to zeros. This function exists because
    it is unclear if it is safe to use tf.sparse_to_dense(indices, [size], 1, validate_indices=False) with
    indices which are not ordered. This function accepts a dynamic size (e.g. tf.shape(tensor)[0])
    :param indices: 1d Tensor with integer indices which are to be set to indices_values.
    :param size: scalar with size (integer) of output Tensor.
    :param indices_value: values of elements specified by indices in the output vector
    :param default_value: values of other elements in the output vector.
    :return: dense 1D Tensor of shape [size] with indices set to indices_values and the rest set to default_value.
    """
    dense = torch.zeros(size).fill_(default_value)
    dense[indices] = indices_value

    return dense