Skip to content

get_covariance is loops twice over arguments #107

Open
@mikofski

Description

@mikofski

during the first loop, it is just getting the dimensions, mainly of nobs which seems like this should already be known, but even still, this could be popped from a sequence on the 2nd loop which would eliminate redundant code and try-except blocks.

    def get_covariance(datargs, outargs, vargs, datvar, outvar):
        """
        Get covariance matrix.

        :param datargs: data arguments
        :param outargs: output arguments
        :param vargs: variable arguments
        :param datvar: variance of data arguments
        :param outvar: variance of output arguments
        :return: covariance
        """
        # number of formula arguments that are not constant
        argn = len(vargs)
        # number of observations must be the same for all vargs
        nobs = 1
        c = []
        for m in xrange(argn):
            a = vargs[m]
            try:
                a = datargs[a]
            except (KeyError, TypeError):
                a = outargs[a]
                avar = outvar[a]
            else:
                avar = datvar[a]
            c.append([])  # add a list
            for n in xrange(argn):
                b = vargs[n]
                try:
                    b = datargs[b]
                except (KeyError, TypeError):
                    b = outargs[b]
                c.append(avar.get(b, 0.0))  # add covariance to sequence
                try:
                    nobs = max(nobs, len(c))
                except (TypeError, ValueError):
                    LOGGER.debug('c of %s vs %s = %g', a, b, c)
        # covariance matrix is initially zeros
        cov = np.zeros((nobs, argn, argn))
        # loop over arguments in both directions, fill in covariance
        for m in xrange(argn):
            d = c.pop()
            for n in xrange(argn):
                cov[:, argn-1-m, argn-1-n] = d.pop()
        if nobs == 1:
            cov = cov.squeeze()  # squeeze out any extra dimensions
        LOGGER.debug('covariance:\n%r', cov)
        return cov

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions