# L-3 MCS 275 Fri 13 Jan 2017 : saddle.py
"""
Tests the location of saddle points on an integer
matrix with values sampled from a surface.
"""

def saddle(matrix):
    """
    Returns the coordinates of saddles:
    maximum in rows, minimum in columns.
    """
    result = []
    for i in range(0, len(matrix)):
        (maxval, maxcol) = (matrix[i][0], 0)
        nbcols = matrix[i].buffer_info()[1]
        for j in range(1, nbcols):
            if matrix[i][j] > maxval:
                (maxval, maxcol) = (matrix[i][j], j)
        prt = 'max %.1f in row %d, column %d' \
            % (maxval, i, maxcol)
        is_saddle = True
        for k in range(0, len(matrix)):
            if k != i:
                if matrix[k][maxcol] < maxval:
                    prt = prt + ' smaller value in row %d' % k
                    is_saddle = False
                    break
        if is_saddle:
            prt = prt + ' saddle at (%d,%d)' % (i, maxcol)
            result.append((i, maxcol))
        print(prt)
    return result

def test():
    """
    Testing the location of saddle points.
    """
    from array import array
    surface = lambda x, y: - (x-5)**2 + (y-5)**2
    data = [array('b', [surface(i, j) \
        for i in range(10)]) \
        for j in range(10)]
    print('looking for a saddle in ')
    for row in data:
        print(row)
    print('Saddle points:', saddle(data))

if __name__ == "__main__":
    test()
