Пример #1
0
def ensemble_seed_test():
    import os
    import numpy as np
    import pyemu
    pst = pyemu.Pst(os.path.join("pst","pest.pst"))
    cov = pyemu.Cov.from_parameter_data(pst)
    pe1 = pyemu.ParameterEnsemble(pyemu.Pst(os.path.join("pst","pest.pst")))
    pe2 = pyemu.ParameterEnsemble(pyemu.Pst(os.path.join("pst","pest.pst")))

    pe1.reseed()
    pe1.draw(cov,num_reals=10)
    #np.random.seed(1111)
    pe2.reseed()
    pe2.draw(cov,num_reals=10)
    assert (pe1-pe2).apply(np.abs).as_matrix().max() == 0.0
    print(pe1.head())
    print(pe2.head())
    pe2.draw(cov,num_reals=10)
    print(pe2.head())
    assert (pe1-pe2).apply(np.abs).as_matrix().max() != 0.0

    pe1.reseed()
    pe1.draw(cov,num_reals=10,how="uniform")
    pe2.reseed()
    pe2.draw(cov,num_reals=10,how="uniform")
    assert (pe1-pe2).apply(np.abs).as_matrix().max() == 0.0
Пример #2
0
def scale_offset_test():
    import os
    import pyemu
    pst = pyemu.Pst(os.path.join("pst","scale_offest_test.pst"))
    par = pst.parameter_data
    print(par)
    en1 = pyemu.ParameterEnsemble(pst)
    en1.draw(pyemu.Cov.from_parameter_data(pst),num_reals=1000)
    en2 = pyemu.ParameterEnsemble(pst)
    en2.draw(cov=None,num_reals=1000,how="uniform")
    print(en1)
    print(en2)
Пример #3
0
def parrep_test():
    import pyemu
    import pandas as pd
    import numpy as np
    # make some fake parnames and values
    parnames = ['p_{0:03}'.format(i) for i in range(20)]
    np.random.seed(42)
    parvals = np.random.random(20) + 5
    parvals[0] = 0.001

    # make a fake parfile
    with open('fake.par','w') as ofp:
        ofp.write('single point\n')
        [ofp.write('{0:10s} {1:12.6f} 1.00 0.0\n'.format(i,j)) for i,j in zip(parnames,parvals)]
    
    # make a fake ensemble parameter file
    np.random.seed(99)
    parens = pd.DataFrame(np.tile(parvals,(5,1))+np.random.randn(5,20)*.5, columns=parnames)
    parens.index = list(range(4)) + ['base']
    parens.index.name = 'real_name'
    parens.loc['base'] = parvals[::-1]
    # get cheeky and reverse the column names to test updating
    parens.columns = parens.columns.sort_values(ascending = False)
    parens.to_csv('fake.par.0.csv')
    
    parens.drop('base').to_csv('fake.par.0.nobase.csv')
    # and make a fake pst file
    pst = pyemu.pst_utils.generic_pst(par_names=parnames)
    pst.parameter_data['parval1'] = [float(i+1) for i in range(len(parvals))]
    pst.parameter_data['parlbnd'] = 0.01
    pst.parameter_data['parubnd'] = 100.01
    
    pyemu.ParameterEnsemble(pst=pst,df=parens).to_binary('fake_parens.jcb')
    # test the parfile style
    pst.parrep('fake.par')
    assert pst.parameter_data.parval1[0] == pst.parameter_data.parlbnd[0]
    assert np.allclose(pst.parameter_data.iloc[1:].parval1.values,parvals[1:],atol=0.0001)
    assert pst.control_data.noptmax == 0
    pst.parrep('fake.par', noptmax=99, enforce_bounds=False)
    assert np.allclose(pst.parameter_data.parval1.values,parvals,atol=0.0001)
    assert pst.control_data.noptmax == 99
    
    # now test the ensemble style
    pst.parrep('fake.par.0.csv')
    assert pst.parameter_data.parval1[0] == pst.parameter_data.parlbnd[0]
    assert np.allclose(pst.parameter_data.iloc[1:].parval1.values,parvals[1:],atol=0.0001)

    pst.parrep('fake.par.0.nobase.csv')
    # flip the parameter ensemble back around
    parens = parens[parens.columns.sort_values()]
    assert np.allclose(pst.parameter_data.parval1.values[:-1],parens.T[0].values[:-1],atol=0.0001)

    pst.parrep('fake.par.0.csv', real_name=3)
    # flip the parameter ensemble back around
    parens = parens[parens.columns.sort_values()]
    assert np.allclose(pst.parameter_data.parval1.values[:-1],parens.T[3].values[:-1],atol=0.0001)

    pst.parrep('fake_parens.jcb', real_name=2)
    # confirm binary format works as csv did
    assert np.allclose(pst.parameter_data.parval1.values[:-1],parens.T[2].values[:-1],atol=0.0001)
Пример #4
0
def binary_test():
    from datetime import datetime
    import numpy as np
    import pandas as pd
    import pyemu
    npar = 100000
    nobs = 500
    par_names = ["p{0}".format(i) for i in range(npar)]
    obs_names = ["o{0}".format(i) for i in range(nobs)]
    arr = np.random.random((nobs,npar))
    pst = pyemu.Pst.from_par_obs_names(par_names,obs_names)
    df = pd.DataFrame(data=arr,columns=par_names,index=obs_names)
    pe = pyemu.ParameterEnsemble(pst=pst,df=df)
    s1 = datetime.now()
    pe.to_dense("par.bin")
    pe1 = pyemu.ParameterEnsemble.from_binary(pst=pst,filename="par.bin")
    e1 = datetime.now()
    d = (pe - pe1).apply(np.abs)
    print(d.max().max())
    assert d.max().max() < 1.0e-10
    s2 = datetime.now()
    pe.to_binary("par.bin")
    pe1 = pyemu.ParameterEnsemble.from_binary(pst=pst,filename="par.bin")
    e2 = datetime.now()
    print((e1 - s1).total_seconds())
    print((e2 - s2).total_seconds())
Пример #5
0
def pnulpar_test():
    import os
    import pyemu
    dir = "mc"
    mc = pyemu.MonteCarlo(jco=os.path.join("mc","freyberg_ord.jco"))
    par_dir = os.path.join("mc","prior_par_draws")
    par_files = [os.path.join(par_dir,f) for f in os.listdir(par_dir) if f.endswith('.par')]
    mc.parensemble.read_parfiles(par_files)
    real_num = [int(os.path.split(f)[-1].split('.')[0].split('_')[1]) for f in par_files]
    mc.parensemble.index = real_num
    #print(mc.parensemble)
    print(mc.parensemble.istransformed)
    en = mc.project_parensemble(nsing=1,inplace=False, enforce_bounds='reset')
    #en.index = [i+1 for i in en.index]
    print(mc.parensemble.istransformed)

    par_dir = os.path.join("mc", "proj_par_draws")
    par_files = [os.path.join(par_dir, f) for f in os.listdir(par_dir) if f.endswith('.par')]
    real_num = [int(os.path.split(f)[-1].split('.')[0].split('_')[1]) for f in par_files]

    en_pnul = pyemu.ParameterEnsemble(mc.pst)
    en_pnul.read_parfiles(par_files)
    en_pnul.index = real_num
    en.sort_index(axis=1, inplace=True)
    en.sort_index(axis=0, inplace=True)
    en_pnul.sort_index(axis=1, inplace=True)
    en_pnul.sort_index(axis=0, inplace=True)
    diff = 100.0 * ((en - en_pnul) / en)
    assert max(diff.max()) < 1.0e-4
Пример #6
0
def pnulpar_test():
    pst = pyemu.Pst(ord_base+".pst")
    # load the pnulpar projected ensemble
    pnul_en = pyemu.ParameterEnsemble(pst)
    pnul_en.read_parfiles_prefix(os.path.join(verf_dir,"proj_par_draws","draw_"))
    pnul_en.loc[:,"fname"] = pnul_en.index
    pnul_en.index = pnul_en.fname.apply(lambda x:str(int(x.split('.')[0].split('_')[-1])))
    f = pnul_en.pop("fname")

    mc = pyemu.MonteCarlo(jco=ord_base+".jco")
    mc.parensemble.read_parfiles_prefix(os.path.join(verf_dir,"prior_par_draws","draw_"))
    mc.parensemble.loc[:,"fname"] = mc.parensemble.index
    mc.parensemble.index = mc.parensemble.fname.apply(lambda x:str(int(x.split('.')[0].split('_')[-1])))
    f = mc.parensemble.pop("fname")

    en = mc.project_parensemble(nsing=1,inplace=False)

    diff = 100 * (np.abs(pnul_en - en) / en)
    assert max(diff.max()) < 1.0e-3
Пример #7
0
# In[4]:

exe = os.path.join("exe", "pnulpar.exe")
args = [
    ord_base + ".pst", "y", "5", "y", "pnulpar_qhalfx.mat", parfile_base,
    projparfile_base
]
in_file = os.path.join("misc", "pnulpar.in")
with open(in_file, 'w') as f:
    f.write('\n'.join(args) + '\n')
os.system(exe + ' <' + in_file)

# In[5]:

pnul_en = pyemu.ParameterEnsemble(mc.pst)
parfiles = [
    os.path.join(proj_dir, f) for f in os.listdir(proj_dir)
    if f.endswith(".par")
]
pnul_en.read_parfiles(parfiles)

# In[6]:

pnul_en.loc[:, "fname"] = pnul_en.index
pnul_en.index = pnul_en.fname.apply(
    lambda x: str(int(x.split('.')[0].split('_')[-1])))
f = pnul_en.pop("fname")

# In[7]:
Пример #8
0
import os
import pyemu

pst = pyemu.Pst(os.path.join("freyberg.pst"))

par_dir = "proj_par_draws"
par_files = [
    os.path.join(par_dir, f) for f in os.listdir(par_dir) if f.endswith(".par")
]

en = pyemu.ParameterEnsemble(pst)
en.read_parfiles(par_files)

sys.exit()