# code based on https://introcs.cs.princeton.edu/python/code/stdlib-python.zip as downloaded in dec 2017

"""
stdstats.py

The stdstats module defines functions related to statistical analysis
and graphical data display.
"""

#-----------------------------------------------------------------------

import math

from itu.algs4.stdlib import stddraw

#-----------------------------------------------------------------------

#def min(a):
#    """
#    Return the minimum value in array a.  Could call the built-in
#    min() function instead.
#    """
#    minumum = float('inf')
#    for x in a:
#        if x < minumum:
#            minumum = x
#    return minumum

#-----------------------------------------------------------------------

#def max(a):
#    """
#    Return the maximum value in array a.  Could call the built-in
#    max() function instead.
#    """
#    maximum = float('-inf')
#    for x in a:
#        if x > maximum:
#            maximum = x
#    return maximum

#-----------------------------------------------------------------------

def mean(a):
    """
    Return the average of the elements of array a.
    """
    return sum(a) / float(len(a))

#-----------------------------------------------------------------------

def var(a):
    """
    Return the sample variance of the elements of array a.
    """
    mu = mean(a)
    total = 0.0
    for x in a:
        total += (x - mu) * (x - mu)
    return total / (float(len(a)) - 1.0)

#-----------------------------------------------------------------------

def stddev(a):
    """
    Return the standard deviation of the elements of array a.
    """
    return math.sqrt(var(a))

#-----------------------------------------------------------------------

def median(a):
    """
    Return the median of the elements of array a.
    """
    b = list(a)  # Make a copy of a.
    b.sort()
    length = len(b)
    if length % 2 == 1:
        return b[length//2]
    else:
        return float(b[length//2 - 1] + b[length//2]) / 2.0

#-----------------------------------------------------------------------

def plotPoints(a):
    """
    Plot the elements of array a as points.
    """
    n = len(a)
    stddraw.setXscale(-1, n)
    stddraw.setPenRadius(1.0 / (3.0 * n))
    for i in range(n):
        stddraw.point(i, a[i])

#-----------------------------------------------------------------------

def plotLines(a):
    """
    Plot the elements of array a as line end-points.
    """
    n = len(a)
    stddraw.setXscale(-1, n)
    stddraw.setPenRadius(0.0)
    for i in range(1, n):
        stddraw.line(i-1, a[i-1], i, a[i])

#-----------------------------------------------------------------------

def plotBars(a):
    """
    Plot the elements of array a as bars.
    """
    n = len(a)
    stddraw.setXscale(-1, n)
    for i in range(n):
        stddraw.filledRectangle(i-0.25, 0.0, 0.5, a[i])

#-----------------------------------------------------------------------

def _main():
    """
    For testing:
    """
    import stdarray
    import stdio

    a = stdarray.readFloat1D()
    #stdio.writef('       min %7.3f\n', min(a))
    #stdio.writef('       max %7.3f\n', max(a))
    stdio.writef('      mean %7.3f\n', mean(a))
    stdio.writef('   std dev %7.3f\n', stddev(a))
    stdio.writef('    median %7.3f\n', median(a))

if __name__ == '__main__':
    _main()
