import logging
import math
from typing import Dict, List

import numpy
from allennlp.common.util import pad_sequence_to_length
from allennlp.data.fields.field import Field
from overrides import overrides

logger = logging.getLogger(__name__)


class FeaturesField(Field[numpy.ndarray]):
    """An AllenNLP field for fixed-length feature vectors"""
    def __init__(self, features: List[float]) -> None:
        self.features = features

    @overrides
    def get_padding_lengths(self) -> Dict[str, int]:
        return {'num_features': len(self.features)}

    @overrides
    def as_array(self, padding_lengths: Dict[str, int]) -> numpy.array:
        padded_features = pad_sequence_to_length(self.features,
                                                 padding_lengths['num_features'],
                                                 (lambda: math.nan))
        return numpy.asarray(padded_features, dtype=numpy.float32)

    @overrides
    def empty_field(self):
        return FeaturesField([math.nan] * len(self.features))