Exemplo n.º 1
0
    def covariance_matrix(self, x, y, names=None, cov=None):
        """build a pyemu.Cov instance from Vario2d
        Parameters
        ----------
            x : iterable of floats
                x locations
            y : iterable of floats
                y locations
            names : iterable of str (optional)
                names of location. If None, generic names will be used
            cov : pyemu.Cov instance (optional)
                an existing Cov instance to add contribution to
        Returns
        -------
            pyemu.Cov
        """
        if not isinstance(x, np.ndarray):
            x = np.array(x)
        if not isinstance(y, np.ndarray):
            y = np.array(y)
        assert x.shape[0] == y.shape[0]

        if names is not None:
            assert x.shape[0] == len(names)
            c = np.zeros((len(names), len(names)))
            np.fill_diagonal(c, self.contribution)
            cov = Cov(x=c, names=names)
        elif cov is not None:
            assert cov.shape[0] == x.shape[0]
            names = cov.row_names
            c = np.zeros((len(names), 1)) + self.contribution
            cont = Cov(x=c, names=names, isdiagonal=True)
            cov += cont

        else:
            raise Exception("Vario2d.covariance_matrix() requires either" +
                            "names or cov arg")

        for i1, (n1, x1, y1) in enumerate(zip(names, x, y)):
            dx = x1 - x[i1 + 1:]
            dy = y1 - y[i1 + 1:]
            dxx = (dx * self.rotation_coefs[0]) +\
                 (dy * self.rotation_coefs[1])
            dyy = ((dx * self.rotation_coefs[2]) +\
                 (dy * self.rotation_coefs[3])) *\
                 self.anisotropy
            h = np.sqrt(dxx * dxx + dyy * dyy)

            h[h < 0.0] = 0.0
            h = self.h_function(h)
            if np.any(np.isnan(h)):
                raise Exception("nans in h for i1 {0}".format(i1))
            cov.x[i1, i1 + 1:] += h
        for i in range(len(names)):
            cov.x[i + 1:, i] = cov.x[i, i + 1:]
        return cov
Exemplo n.º 2
0
def schur_test_nonpest():
    import numpy as np
    from pyemu import Matrix, Cov, Schur, Jco
    #non-pest
    pnames = ["p1", "p2", "p3"]
    onames = ["o1", "o2", "o3", "o4"]
    npar = len(pnames)
    nobs = len(onames)
    j_arr = np.random.random((nobs, npar))
    jco = Jco(x=j_arr, row_names=onames, col_names=pnames)
    parcov = Cov(x=np.eye(npar), names=pnames)
    obscov = Cov(x=np.eye(nobs), names=onames)
    forecasts = "o2"

    s = Schur(jco=jco, parcov=parcov, obscov=obscov, forecasts=forecasts)
    print(s.get_parameter_summary())
    print(s.get_forecast_summary())

    #this should fail
    passed = False
    try:
        print(s.get_par_group_contribution())
        passed = True
    except Exception as e:
        print(str(e))
    if passed:
        raise Exception("should have failed")

    #this should fail
    passed = False
    try:
        print(s.get_removed_obs_group_importance())
        passed = True
    except Exception as e:
        print(str(e))
    if passed:
        raise Exception("should have failed")

    print(s.get_par_contribution({"group1": ["p1", "p3"]}))

    print(s.get_removed_obs_importance({"group1": ["o1", "o3"]}))

    print(s.pandas)

    forecasts = Matrix(x=np.random.random((1, npar)),
                       row_names=[forecasts],
                       col_names=pnames)

    sc = Schur(jco=jco, forecasts=forecasts.T, parcov=parcov, obscov=obscov)
    ffile = os.path.join("temp", "forecasts.jcb")
    forecasts.to_binary(ffile)

    sc = Schur(jco=jco, forecasts=ffile, parcov=parcov, obscov=obscov)
Exemplo n.º 3
0
def errvar_test_nonpest():
    import numpy as np
    from pyemu import ErrVar, Matrix, Cov
    #non-pest
    pnames = ["p1","p2","p3"]
    onames = ["o1","o2","o3","o4"]
    npar = len(pnames)
    nobs = len(onames)
    j_arr = np.random.random((nobs,npar))
    jco = Matrix(x=j_arr,row_names=onames,col_names=pnames)
    parcov = Cov(x=np.eye(npar),names=pnames)
    obscov = Cov(x=np.eye(nobs),names=onames)
    forecasts = "o2"

    omitted = "p3"

    e = ErrVar(jco=jco,parcov=parcov,obscov=obscov,forecasts=forecasts,
               omitted_parameters=omitted)
    svs = [0,1,2,3,4,5]
    print(e.get_errvar_dataframe(svs))
Exemplo n.º 4
0
    def covariance_matrix(self, x, y, names=None, cov=None):
        """build a pyemu.Cov instance from GeoStruct
        Parameters
        ----------
            x : iterable of floats
                x locations
            y : iterable of floats
                y locations
            names : iterable of str (optional)
                names of location. If None, generic names will be used
            cov : pyemu.Cov instance (optional)
                an existing Cov instance to add contribution to
        Returns
        -------
            pyemu.Cov
        """
        if not isinstance(x, np.ndarray):
            x = np.array(x)
        if not isinstance(y, np.ndarray):
            y = np.array(y)
        assert x.shape[0] == y.shape[0]

        if names is not None:
            assert x.shape[0] == len(names)
            c = np.zeros((len(names), len(names)))
            np.fill_diagonal(c, self.nugget)
            cov = Cov(x=c, names=names)
        elif cov is not None:
            assert cov.shape[0] == x.shape[0]
            names = cov.row_names
            c = np.zeros((len(names), 1))
            c += self.nugget
            cont = Cov(x=c, names=names, isdiagonal=True)
            cov += cont

        else:
            raise Exception("GeoStruct.covariance_matrix() requires either " +
                            "names or cov arg")
        for v in self.variograms:
            v.covariance_matrix(x, y, cov=cov)
        return cov
Exemplo n.º 5
0
    def covariance_matrix(self, x, y, names=None, cov=None):
        if not isinstance(x, np.ndarray):
            x = np.array(x)
        if not isinstance(y, np.ndarray):
            y = np.array(y)
        assert x.shape[0] == y.shape[0]

        if names is not None:
            assert x.shape[0] == len(names)
            c = np.zeros((len(names), len(names)))
            np.fill_diagonal(c, self.contribution)
            cov = Cov(x=c, names=names)
        elif cov is not None:
            assert cov.shape[0] == x.shape[0]
            names = cov.row_names
            c = np.zeros((len(names), 1)) + self.contribution
            cont = Cov(x=c, names=names, isdiagonal=True)
            cov += cont

        else:
            raise Exception("Vario2d.covariance_matrix() requires either" +
                            "names or cov arg")

        for i1, (n1, x1, y1) in enumerate(zip(names, x, y)):
            dx = x1 - x[i1 + 1:]
            dy = y1 - y[i1 + 1:]
            dxx = (dx * self.rotation_coefs[0]) +\
                 (dy * self.rotation_coefs[1])
            dyy = ((dx * self.rotation_coefs[2]) +\
                 (dy * self.rotation_coefs[3])) *\
                 self.anisotropy
            h = np.sqrt(dxx * dxx + dyy * dyy)
            h[h < 0.0] = 0.0
            cov.x[i1, i1 + 1:] += self.h_function(h)
        for i in range(len(names)):
            cov.x[i + 1:, i] = cov.x[i, i + 1:]
        return cov
Exemplo n.º 6
0
    def covariance_matrix(self, x, y, names=None, cov=None):
        if not isinstance(x, np.ndarray):
            x = np.array(x)
        if not isinstance(y, np.ndarray):
            y = np.array(y)
        assert x.shape[0] == y.shape[0]
        if names is not None:
            assert x.shape[0] == len(names)
            c = np.zeros((len(names), len(names)))
            np.fill_diagonal(c, self.nugget)
            cov = Cov(x=c, names=names)
        elif cov is not None:
            assert cov.shape[0] == x.shape[0]
            names = cov.row_names
            c = np.zeros((len(names), 1)) + self.nugget
            cont = Cov(x=c, names=names, isdiagonal=True)
            cov += cont

        else:
            raise Exception("GeoStruct.covariance_matrix() requires either" +
                            "names or cov arg")
        for v in self.variograms:
            v.covariance_matrix(x, y, cov=cov)
        return cov
Exemplo n.º 7
0
def diagonal_cov_draw_test():
    import os
    import numpy as np
    from pyemu import MonteCarlo, Cov, Pst
    jco = os.path.join("pst", "pest.jcb")
    pst = Pst(jco.replace(".jcb", ".pst"))

    mc = MonteCarlo(jco=jco, pst=pst)
    num_reals = 10
    mc.draw(num_reals, obs=True)
    print(mc.obsensemble)
    pe1 = mc.parensemble.copy()

    cov = Cov(x=mc.parcov.as_2d, names=mc.parcov.row_names)
    #print(type(cov))
    mc = MonteCarlo(jco=jco, pst=pst)
    mc.parensemble.reseed()
    mc.draw(num_reals, cov=cov)
    pe2 = mc.parensemble