'Gather useful debug information from a datapoint.
Args:
entry: the datapoint component
k (int): index of this compoennt in current datapoint
depth (int, optional): recursion depth
Todo:
* call this recursively and stop when depth>n for some n if an element is a list
Returns:
string: debug message'

def _analyze_input_data(self, entry, k, depth=1):

    el = entry
    if isinstance(el, list):
        return ('%s    is    list    of    %i    elements' % (('    ' * (depth * 2)), len(el)))
    else:
        el_type = el.__class__.__name__
        if isinstance(el, (int, float, bool)):
            el_max = el_min = el
            el_shape = '()'
            el_range = el
        else:
            el_shape = 'n.A.'
            if hasattr(el, 'shape'):
                el_shape = el.shape
            (el_max, el_min) = (None, None)
            if hasattr(el, 'max'):
                el_max = el.max()
            if hasattr(el, 'min'):
                el_min = el.min()
            el_range = 'None,    None'
            if ((el_max is not None) or (el_min is not None)):
                el_range = ('%.4f,    %.4f' % (el_min, el_max))
        return ('%s    dp    %i:    is    %s    of    shape    %s    with    range    [%s]' % (('    ' * (depth * 2)), k, el_type, el_shape, el_range))
