def evalSamples(self, x):
        '''Evalautes the samples of quantity of interest and its gradient
        (if supplied) at the given values of the design variables

        :param iterable x: values of the design variables, this is passed as
            the first argument to the function fqoi

        :return: (values of the quantity of interest, values of the gradient)
        :rtype: Tuple
        '''

        # Make sure dimensions are correct
#        u_sample_dimensions = self._processDimensions()

        self._N_dv = len(_makeIter(x))

        if self.verbose:
            print('Evaluating surrogate')
        if self.surrogate is None:
            def fqoi(u):
                return self.fqoi(x, u)
            def fgrad(u):
                return self.jac(x, u)
            jac = self.jac
        else:
            fqoi, fgrad, surr_jac = self._makeSurrogates(x)
            jac = surr_jac

        u_samples = self._getParameterSamples()

        if self.verbose:
            print('Evaluating quantity of interest at samples')
        q_samples, grad_samples = self._evalSamples(u_samples, fqoi, fgrad, jac)

        return q_samples, grad_samples