In [ ]:
from __future__ import print_function
import os
import numpy as np
import pyemu
from pyemu import Pst
We need to pass the name of a pest control file to instantiate:
In [ ]:
pst_name = os.path.join("henry","pest.pst")
p = Pst(pst_name)
All of the relevant parts of the pest control file are attributes of the pst
class with the same name:
In [ ]:
p.parameter_data.head()
In [ ]:
p.observation_data.head()
In [ ]:
p.prior_information.head()
A residual file (.rei
or res
) can also be passed to the resfile
argument at instantiation to enable some simple residual analysis and weight adjustments. If the residual file is in the same directory as the pest control file and has the same base name, it will be accessed automatically:
In [ ]:
p.res
The pst
class has some @decorated
convience methods related to the residuals:
In [ ]:
print(p.phi,p.phi_components)
Some additional @decorated
convience methods:
In [ ]:
print(p.npar,p.nobs,p.nprior)
In [ ]:
print(p.par_groups,p.obs_groups)
In [ ]:
print(type(p.par_names)) # all parameter names
print(type(p.adj_par_names)) # adjustable parameter names
print(type(p.obs_names)) # all observation names
print(type(p.nnz_obs_names)) # non-zero weight observations
The "control_data" section of the pest control file is accessible in the Pst.control_data
attribute:
In [ ]:
print('jacupdate = {0}'.format(p.control_data.jacupdate))
print('numlam = {0}'.format(p.control_data.numlam))
p.control_data.numlam = 100
print('numlam has been changed to --> {0}'.format(p.control_data.numlam))
The Pst
class also exposes a method to get a new Pst
instance with a subset of parameters and or obseravtions. Note this method does not propogate prior information to the new instance:
In [ ]:
pnew = p.get(p.par_names[:10],p.obs_names[-10:])
print(pnew.prior_information)
You can also write a pest control file with altered parameters, observations, and/or prior information:
In [ ]:
pnew.write("test.pst")
Some other methods in Pst
include:
In [ ]:
# add preferred value regularization with weights proportional to parameter bounds
pyemu.utils.helpers.zero_order_tikhonov(pnew)
pnew.prior_information
In [ ]:
# add preferred value regularization with unity weights
pyemu.utils.helpers.zero_order_tikhonov(pnew,parbounds=False)
pnew.prior_information
Some more res
functionality
In [ ]:
# adjust observation weights to account for residual phi components
#pnew = p.get()
print(p.phi, p.nnz_obs, p.phi_components)
p.adjust_weights_discrepancy()
print(p.phi, p.nnz_obs, p.phi_components)
adjust observation weights by an arbitrary amount by groups:
In [ ]:
print(p.phi, p.nnz_obs, p.phi_components)
grp_dict = {"head":100}
p.adjust_weights(obsgrp_dict=grp_dict)
print(p.phi, p.nnz_obs, p.phi_components)
adjust observation weights by an arbitrary amount by individual observations:
In [ ]:
print(p.phi, p.nnz_obs, p.phi_components)
obs_dict = {"h_obs01_1":25}
p.adjust_weights(obs_dict=obs_dict)
print(p.phi, p.nnz_obs, p.phi_components)
setup weights inversely proportional to the observation values
In [ ]:
p.adjust_weights_discrepancy()
print(p.phi, p.nnz_obs, p.phi_components)
p.proportional_weights(fraction_stdev=0.1,wmax=20.0)
print(p.phi, p.nnz_obs, p.phi_components)
In [ ]: