
# Utility functions
import numpy as N
def numpy_inner_product(snap1,snap2):
    """ A default inner product for n-dimensional numpy arrays """
    return N.sum(snap1*snap2.conj())

def my_inner_product(a,b):
    ip = 0
    for r in range(a.shape[0]):
        for c in range(a.shape[1]):
            ip += a[r,c]*b[r,c]
    return ip
    
def my_random(args):
    return N.random.random(args)


def eval_func_tuple(f_args):
    """Takes a tuple of a function and args, evaluates and returns result"""
    return f_args[0](*f_args[1:])