Evaluate multi-dimensional polynomials through tensor multiplication.

    :param list uvec: vector value of the uncertain parameters at which to evaluate the
        polynomial

    :param list nvec: order in each dimension at which to evaluate the polynomial

    :param list Jvec: Jacobi matrix of each dimension's 1D polynomial

    :return: poly_value - value of the polynomial evaluated at uvec

    :rtype: float

def eval_poly(uvec, nvec, Jvec):
    '''Evaluate multi-dimensional polynomials through tensor multiplication.

    :param list uvec: vector value of the uncertain parameters at which to evaluate the
        polynomial

    :param list nvec: order in each dimension at which to evaluate the polynomial

    :param list Jvec: Jacobi matrix of each dimension's 1D polynomial

    :return: poly_value - value of the polynomial evaluated at uvec

    :rtype: float

    '''
    us = _makeIter(uvec)
    ns = _makeIter(nvec)
    Js = _makeIter(Jvec)
    return np.prod([_eval_poly_1D(u, n, J) for u, n, J in zip(us, ns, Js)])