smc.smc Class Reference

Public Member Functions

def __init__ (self, sigma, ess, obsWeights, DPMFile='', DPMDataDir='', obsDataFile='', obsCtrl='', simDataKeys='', simName='sim', DPMVersion='yade-batch', scaleWithMax=True, loadSamples=True, skipDEM=True, standAlone=True, verbose=False)
 
def initialize (self, paramNames, paramRanges, numSamples, maxNumComponents, priorWeight, paramsFile='', proposalFile='', threads=4)
 
def loadProposalFromFile (self, proposalFile, iterNO)
 
def run (self, iterNO=-1, reverse=False, threads=1)
 
def getDPMData (self, DPMDataFiles)
 
def recursiveBayesian (self, caliStep, iterNO=-1)
 
def getLikelihood (self, caliStep)
 
def update (self, caliStep, likelihood)
 
def getCovMatrix (self, caliStep, weights)
 
def getInitParams (self, paramRanges, numSamples, threads)
 
def getParamsFromTable (self, paramsFile, names, paramRanges, iterNO=-1)
 
def getObsDataFromFile (self, obsDataFile, obsCtrl)
 
def resampleParams (self, caliStep, thread=4, iterNO=-1)
 
def getPosterior (self)
 
def getSmcSamples (self)
 
def getNumSteps (self)
 
def getEffectiveSampleSize (self)
 
def getNames (self)
 
def getObsData (self)
 
def trainGMMinTime (self, maxNumComponents, iterNO=-1)
 
def removeDegeneracy (self, caliStep=-1)
 
def writeBayeStatsToFile (self, reverse)
 

Public Attributes

 verbose
 
 DPMVersion
 
 DPMFile
 
 obsDataFile
 
 obsCtrl
 
 DPMDataDir
 
 numParams
 
 numSamples
 
 numSteps
 
 obsWeights
 
 simDataKeys
 
 simName
 
 paramsFiles
 
 paramNames
 
 paramRanges
 
 smcSamples
 
 standAlone
 
 DPMData
 
 ips
 
 covs
 
 posterior
 
 likelihood
 
 proposal
 
 scaleCovWithMax
 
 loadSamples
 
 skipDEM
 
 obsCtrlData
 
 obsData
 

Private Attributes

 __sigma
 
 __ess
 
 __obsMatrix
 
 __pool
 
 __scenes
 
 __maxNumComponents
 
 __priorWeight
 

Detailed Description

SMC base class: sequential Monte Carlo (SMC) filtering

Constructor & Destructor Documentation

◆ __init__()

def smc.smc.__init__ (   self,
  sigma,
  ess,
  obsWeights,
  DPMFile = '',
  DPMDataDir = '',
  obsDataFile = '',
  obsCtrl = '',
  simDataKeys = '',
  simName = 'sim',
  DPMVersion = 'yade-batch',
  scaleWithMax = True,
  loadSamples = True,
  skipDEM = True,
  standAlone = True,
  verbose = False 
)
26  standAlone=True, verbose=False):
27  if verbose:
28  print("Called smc.init(sigma=%s, ess=%s, obsWeights=%s, DPMFile=%s, DPMDataDir=%s, obsDataFile=%s, "
29  "obsCtrl=%s, simDataKeys=%s, simName=%s, DPMVersion=%s, scaleWithMax=%s, loadSamples=%s, "
30  "skipDEM=%s, standAlone=%s)"
31  % (sigma, ess, obsWeights, DPMFile, DPMDataDir, obsDataFile, obsCtrl, simDataKeys, simName,
32  DPMVersion, scaleWithMax, loadSamples, skipDEM, standAlone))
33  # whether additional debug information is printed
34  self.verbose = verbose
35  # ?
36  self.DPMVersion = DPMVersion
37  # ?
38  self.DPMFile = DPMFile
39 
40  # File in which experimental data is stored (\todo should not be class variable)
41  self.obsDataFile = obsDataFile
42  # used in getObsDataFromFile to determine how to interpret the data (we always use the default, '') (\todo should not be class variable)
43  self.obsCtrl = obsCtrl
44 
45  # Directory in which simulation data is stored
46  self.DPMDataDir = DPMDataDir
47  # ?
48  self.numParams = 0
49  # ?
50  self.numSamples = 0
51  # ?
52  self.numSteps = 0
53  # normalized variance
54  self.__sigma = sigma
55  # ?
56  self.__ess = ess
57  # ?
58  self.obsWeights = obsWeights
59  # ?
60  self.simDataKeys = simDataKeys
61  # ?
62  self.simName = simName
63 
64  # obsData: nparray of size [numObs, numSteps], containing the experimental data
65  # obsCtrlData: ? (only needed if obsCtrl != '')
66  # numObs: Number of observed variables in data file
67  # numSteps: Number of steps per variables in data file
68  self.obsData, self.obsCtrlData, self.numObs, self.numSteps = self.getObsDataFromFile(obsDataFile, obsCtrl)
69  if self.verbose:
70  print("Read in obsData=%s, obsCtrlData=%s, numObs=%s, numSteps=%s" % (self.obsData, self.obsCtrlData, self.numObs, self.numSteps))
71 
72  # assume all measurements are independent
73  self.__obsMatrix = np.identity(self.numObs)
74  if self.verbose:
75  print("Set obsMatrix=%s" % self.__obsMatrix)
76 
77  # File names of the smcTables \todo (why multiple?)
78  self.paramsFiles = []
79  # ??
80  self.paramNames = []
81  # ??
82  self.paramRanges = {}
83  # ??
84  self.smcSamples = []
85  # a flag that defines whether Yade is called within python
86  self.standAlone = standAlone
87  # if run Bayesian filtering on the fly
88  if not self.standAlone:
89  self.__pool = None
90  self.__scenes = None
91  # hyper-parameters of Bayesian Gaussian mixture
92  self.__maxNumComponents = 0
93  self.__priorWeight = 0
94 
95  # simulation data: nparray of size [numSteps, numSamples, numObs]
96  self.DPMData = None
97  # ensemble averages : nparray of size [numParams, numSteps]
98  self.ips = None
99  # coefficients of variance : nparray of size [numParams, numSteps]
100  self.covs = None
101  # posterior : nparray of size [numSamples, numSteps]
102  self.posterior = None
103  # likelihood : nparray of size [numSamples, numSteps]
104  self.likelihood = None
105  # proposal: nparray of size [numSamples]
106  self.proposal = None
107 
108  # whether change covariance matrix in time or set it constant (proportional to the maximum observation data)
109  self.scaleCovWithMax = scaleWithMax
110  # whether load existing parameter samples or create new ones
111  self.loadSamples = loadSamples
112  # whether run simulations DEM within GrainLearning
113  self.skipDEM = skipDEM
114 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet print(const Packet &a)
Definition: GenericPacketMath.h:1166

References Eigen::internal.print().

Member Function Documentation

◆ getCovMatrix()

def smc.smc.getCovMatrix (   self,
  caliStep,
  weights 
)
356  def getCovMatrix(self, caliStep, weights):
357  Sigma = np.zeros([self.numObs, self.numObs])
358  # scale observation data with normalized variance parameter to get covariance matrix
359  for i in range(self.numObs):
360  # give smaller weights for better agreement
361  if self.scaleCovWithMax:
362  Sigma[i, i] = self.__sigma * weights[i] * max(self.obsData[:, i]) ** 2
363  else:
364  Sigma[i, i] = self.__sigma * weights[i] * self.obsData[caliStep, i] ** 2
365  return Sigma
366 
#define max(a, b)
Definition: datatypes.h:23

References smc.smc.__sigma, max, smc.smc.obsData, and smc.smc.scaleCovWithMax.

Referenced by smc.smc.getLikelihood().

◆ getDPMData()

def smc.smc.getDPMData (   self,
  DPMDataFiles 
)
281  def getDPMData(self, DPMDataFiles):
282  if self.verbose:
283  print("Called getDPMData(DPMDataFiles=%s)" % DPMDataFiles)
284  if 0 in self.DPMData.shape:
285  raise RuntimeError ("number of Observations, samples or steps undefined!")
286  for i, f in enumerate(DPMDataFiles):
287  # if do not know the data to control simulation
288  if self.obsCtrl == '':
289  DPMData = np.genfromtxt(f)
290  if len(DPMData.shape) == 0:
291  DPMData = DPMData.reshape([1, 1])
292  elif len(DPMData.shape) == 1:
293  DPMData = DPMData.reshape([DPMData.shape[0], 1]).T
294  for j in range(self.numObs):
295  self.DPMData[:, i, j] = DPMData[:,j]
296  else:
297  DPMData = getKeysAndData(f)
298  for j, key in enumerate(self.obsData.keys()):
299  self.DPMData[:, i, j] = DPMData[key]
300  if self.verbose:
301  print("Set DPMData=%s" % self.DPMData)
302  # if need to remove the data that controls the simulations
303  if self.obsCtrl != '':
304  obsData = np.zeros([self.numSteps, self.numObs])
305  for j, key in enumerate(self.obsData.keys()):
306  obsData[:, j] = self.obsData[key]
307  self.obsData = obsData
308  if self.verbose:
309  print("Set obsData=%s" % self.obsData)
310 
def getKeysAndData(fileName)
Definition: tools.py:47

References smc.smc.DPMData, tools.getKeysAndData(), smc.smc.numSteps, smc.smc.obsCtrl, smc.smc.obsData, Eigen::internal.print(), smc.smc.verbose, StatisticsVector< XZ >.verbose(), StatisticsVector< O >.verbose(), StatisticsVector< T >.verbose(), and tetgenbehavior.verbose.

Referenced by smc.smc.run().

◆ getEffectiveSampleSize()

def smc.smc.getEffectiveSampleSize (   self)
475  def getEffectiveSampleSize(self):
476  nEff = 1. / sum(self.getPosterior() ** 2)
477  return nEff / self.numSamples
478 

References smc.smc.getPosterior(), and smc.smc.numSamples.

◆ getInitParams()

def smc.smc.getInitParams (   self,
  paramRanges,
  numSamples,
  threads 
)
367  def getInitParams(self, paramRanges, numSamples, threads):
368  if self.verbose:
369  print("Called smc.getInitParams(paramRanges=%s, numSamples=%s, threads=%s)" % (paramRanges, numSamples, threads))
370  if len(paramRanges.values()) == 0:
371  raise RuntimeError(
372  "Parameter range is not given. Define the dictionary-type variable paramRanges or loadSamples True")
373  self.paramRanges = paramRanges
374  self.numParams = len(self.getNames())
375  names = self.getNames()
376  minsAndMaxs = np.array([paramRanges[key] for key in self.getNames()])
377  mins = minsAndMaxs[:, 0]
378  maxs = minsAndMaxs[:, 1]
379  #print ('Parameters to be identified:', ", ".join(names), '\nMins:', mins, '\nMaxs:', maxs)
380  initSmcSamples, initparamsFile = initParamsTable(keys=names, maxs=maxs, mins=mins, num=numSamples,
381  threads=threads)
382  #print ('Written parameter table name:',initparamsFile )
383  self.smcSamples.append(np.array(initSmcSamples))
384  self.paramsFiles.append(initparamsFile)
385  return numSamples
386 
def initParamsTable(keys, maxs, mins, num=100, threads=4, tableName='smcTable.txt')
Definition: tools.py:17

References smc.smc.getNames(), tools.initParamsTable(), smc.smc.numParams, smc.smc.paramRanges, smc.smc.paramsFiles, Eigen::internal.print(), plotResults.Analysis.smcSamples, smc.smc.smcSamples, smc.smc.verbose, StatisticsVector< XZ >.verbose(), StatisticsVector< O >.verbose(), StatisticsVector< T >.verbose(), and tetgenbehavior.verbose.

Referenced by smc.smc.initialize().

◆ getLikelihood()

def smc.smc.getLikelihood (   self,
  caliStep 
)
327  def getLikelihood(self, caliStep):
328  # state vector y_t = H(x_t)+Sigma_t: the values outputted by DEM
329  stateVec = self.DPMData[caliStep, :, :].dot(self.__obsMatrix)
330  # obsVec: the values we aim for
331  obsVec = self.obsData[caliStep, :]
332  # row-wise substraction obsVec[numObs]-stateVec[numSamples,numObs], the error
333  vecDiff = obsVec - stateVec
334  Sigma = self.getCovMatrix(caliStep, self.obsWeights)
335  invSigma = np.linalg.inv(Sigma)
336  likelihood = np.zeros(self.numSamples)
337  # compute likelihood = exp(-0.5*(y_t-H(x_t))*Sigma_t^{-1}*(y_t-H(x_t)))
338  for i in range(self.numSamples):
339  power = (vecDiff[i, :]).dot(invSigma.dot(vecDiff[i, :].T))
340  likelihood[i] = np.exp(-0.5 * power)
341  # regularize likelihood
342  likelihood /= np.sum(likelihood)
343  return likelihood
344 
Scalar EIGEN_BLAS_FUNC_NAME() dot(int *n, Scalar *px, int *incx, Scalar *py, int *incy)
Definition: level1_real_impl.h:52

References smc.smc.__obsMatrix, dot(), smc.smc.DPMData, smc.smc.getCovMatrix(), smc.smc.numSamples, smc.smc.obsData, and smc.smc.obsWeights.

Referenced by smc.smc.recursiveBayesian().

◆ getNames()

def smc.smc.getNames (   self)
479  def getNames(self):
480  return self.paramNames
481 

References plotResults.Analysis.paramNames, and smc.smc.paramNames.

Referenced by smc.smc.getInitParams(), smc.smc.getParamsFromTable(), and smc.smc.resampleParams().

◆ getNumSteps()

def smc.smc.getNumSteps (   self)
472  def getNumSteps(self):
473  return self.numSteps
474 

References smc.smc.numSteps.

◆ getObsData()

def smc.smc.getObsData (   self)
482  def getObsData(self):
483  return np.hstack((self.obsCtrlData.reshape(self.numSteps, 1), self.obsData))
484 

References smc.smc.numSteps, smc.smc.obsCtrlData, and smc.smc.obsData.

◆ getObsDataFromFile()

def smc.smc.getObsDataFromFile (   self,
  obsDataFile,
  obsCtrl 
)
428  def getObsDataFromFile(self, obsDataFile, obsCtrl):
429  if self.verbose:
430  print("Called getObsDataFromFile(obsDataFile=%s, obsCtrl=%s)" % (obsDataFile, obsCtrl))
431  # if do not know the data to control simulation
432  if self.obsCtrl == '':
433  keysAndData = np.genfromtxt(obsDataFile)
434  # if only one observation data vector exist, reshape it with [numSteps,1]
435  if len(keysAndData.shape) == 0:
436  keysAndData = keysAndData.reshape(1, 1).T
437  elif len(keysAndData.shape) == 1:
438  keysAndData = keysAndData.reshape([keysAndData.shape[0], 1]).T
439  return keysAndData, None, keysAndData.shape[1], keysAndData.shape[0]
440  else:
441  keysAndData = getKeysAndData(obsDataFile)
442  # separate obsCtrl for controlling simulations from obsData
443  obsCtrlData = keysAndData.pop(obsCtrl)
444  numSteps = len(obsCtrlData)
445  numObs = len(keysAndData.keys())
446  return keysAndData, obsCtrlData, numObs, numSteps
447 

References tools.getKeysAndData(), smc.smc.obsCtrl, Eigen::internal.print(), smc.smc.verbose, StatisticsVector< XZ >.verbose(), StatisticsVector< O >.verbose(), StatisticsVector< T >.verbose(), and tetgenbehavior.verbose.

Referenced by smc.smc.run().

◆ getParamsFromTable()

def smc.smc.getParamsFromTable (   self,
  paramsFile,
  names,
  paramRanges,
  iterNO = -1 
)
387  def getParamsFromTable(self, paramsFile, names, paramRanges, iterNO=-1):
388  self.paramRanges = paramRanges
389  self.numParams = len(self.getNames())
390  if self.verbose:
391  print("Called smc.getParamsFromTable(paramsFile=%s, names=%s, paramRanges=%s, iterNO=%s)"
392  % (paramsFile, names, paramRanges, iterNO))
393  # if paramsFile exist, read in parameters and append data to self.smcSamples
394  if os.path.exists(paramsFile):
395  self.paramsFiles.append(paramsFile)
396  if self.verbose:
397  print("Set paramsFiles=%s" % self.paramsFiles)
398  smcSamples = np.genfromtxt(paramsFile, comments='!')[:, -self.numParams:]
399  self.smcSamples.append(smcSamples)
400  return self.smcSamples[iterNO].shape
401  # if cannot find paramsFile, get parameter values from the names of simulation files
402  else:
403  if self.verbose:
404  print ('Cannot find paramsFile... Now get it from the names of simulation files')
405  DPMDataFiles = glob.glob(os.getcwd() + '/' + self.DPMDataDir + '/' + self.simName + '*')
406  DPMDataFiles.sort()
407  while len(DPMDataFiles) == 0:
408  self.simName = raw_input("No DEM filename can be found, tell me the simulation name...\n ")
409  DPMDataFiles = glob.glob(os.getcwd() + '/' + self.DPMDataDir + '/' + self.simName + '*')
410  DPMDataFiles.sort()
411  smcSamples = np.zeros([len(DPMDataFiles), len(self.getNames())])
412  for i, f in enumerate(DPMDataFiles):
413  # get the suffix of the data file name
414  suffix = '.' + f.split('.')[-1]
415  # get the file name fore the suffix
416  f = f.split(suffix)[0]
417  # get parameters from the remaining string
418  paramsString = f.split('_')[-self.numParams:]
419  # if the number of parameters in the string is different from self.numParams, throw a warning
420  if len(f.split('_')[2:]) != self.numParams:
421  RuntimeError(
422  "Number of parameters found from the simulation fileName is different from self.numParams\n\
423  Make sure your simulation file is named as 'simName_key_param0_param1_..paramN")
424  smcSamples[i, :] = np.float64(paramsString)
425  self.smcSamples.append(smcSamples)
426  return self.smcSamples[iterNO].shape
427 

References smc.smc.DPMDataDir, smc.smc.getNames(), smc.smc.numParams, smc.smc.paramRanges, smc.smc.paramsFiles, Eigen::internal.print(), smc.smc.simName, plotResults.Analysis.smcSamples, smc.smc.smcSamples, smc.smc.verbose, StatisticsVector< T >.verbose(), StatisticsVector< O >.verbose(), StatisticsVector< XZ >.verbose(), and tetgenbehavior.verbose.

Referenced by smc.smc.initialize().

◆ getPosterior()

def smc.smc.getPosterior (   self)
466  def getPosterior(self):
467  return self.posterior
468 

References plotResults.Analysis.posterior, and smc.smc.posterior.

Referenced by smc.smc.getEffectiveSampleSize(), and smc.smc.writeBayeStatsToFile().

◆ getSmcSamples()

def smc.smc.getSmcSamples (   self)
469  def getSmcSamples(self):
470  return self.smcSamples
471 

References plotResults.Analysis.smcSamples, and smc.smc.smcSamples.

Referenced by smc.smc.loadProposalFromFile(), smc.smc.run(), and smc.smc.writeBayeStatsToFile().

◆ initialize()

def smc.smc.initialize (   self,
  paramNames,
  paramRanges,
  numSamples,
  maxNumComponents,
  priorWeight,
  paramsFile = '',
  proposalFile = '',
  threads = 4 
)
116  proposalFile='', threads=4):
117  if self.verbose:
118  print("Called smc.initialize(paramNames=%s, paramRanges=%s, numSamples=%s, maxNumComponents=%s, priorWeight=%s, paramsFile=%s, proposalFile=%s, threads=%s)"
119  % (paramNames, paramRanges, numSamples, maxNumComponents, priorWeight, paramsFile, proposalFile, threads))
120  # assign parameter names
121  self.paramNames = paramNames
122  # initialize parameters for Gaussian mixture model
123  self.__maxNumComponents = maxNumComponents
124  self.__priorWeight = priorWeight
125  # initialize sample uniformly if no parameter table available
126  if len(self.smcSamples) == 0:
127  if self.loadSamples:
128  self.numSamples, _ = self.getParamsFromTable(paramsFile, paramNames, paramRanges)
129  else:
130  self.numSamples = self.getInitParams(paramRanges, numSamples, threads)
131  if self.verbose:
132  print("Set numParams=%s, paramsFiles=%s, numSamples=%s, smcSamples=%s"
133  % (self.numParams, self.paramsFiles, self.numSamples, self.smcSamples))
134  #/todo where is the smcTable.txt file written?
135  # initialise simulation data
136  self.DPMData = np.zeros([self.numSteps, self.numSamples, self.numObs])
137  # identified optimal parameters
138  self.ips = np.zeros([self.numParams, self.numSteps])
139  self.covs = np.zeros([self.numParams, self.numSteps])
140  self.posterior = np.zeros([self.numSamples, self.numSteps])
141  self.likelihood = np.zeros([self.numSamples, self.numSteps])
142  self.proposal = np.ones([self.numSamples]) / self.numSamples
143  if proposalFile != '':
144  # load proposal density from file
145  self.proposal = self.loadProposalFromFile(proposalFile, -1)
146  if self.verbose:
147  print("Set proposal=%s" % self.proposal)
148  # if run Bayesian filtering on the fly
149  if not self.standAlone:
150  self.__pool = get_pool(mpi=False, threads=self.numSamples)
151  self.__scenes = self.__pool.map(createScene, range(self.numSamples))
152 
def get_pool(mpi=False, threads=1)
Definition: tools.py:93

References smc.smc.__maxNumComponents, smc.smc.__pool, smc.smc.__priorWeight, smc.smc.__scenes, smc.smc.covs, smc.smc.DPMData, tools.get_pool(), smc.smc.getInitParams(), smc.smc.getParamsFromTable(), smc.smc.ips, smc.smc.likelihood, smc.smc.loadProposalFromFile(), smc.smc.loadSamples, smc.smc.numParams, smc.smc.numSamples, smc.smc.numSteps, plotResults.Analysis.paramNames, smc.smc.paramNames, smc.smc.paramsFiles, plotResults.Analysis.posterior, smc.smc.posterior, Eigen::internal.print(), smc.smc.proposal, plotResults.Analysis.smcSamples, smc.smc.smcSamples, smc.smc.standAlone, smc.smc.verbose, StatisticsVector< T >.verbose(), StatisticsVector< O >.verbose(), StatisticsVector< XZ >.verbose(), and tetgenbehavior.verbose.

◆ loadProposalFromFile()

def smc.smc.loadProposalFromFile (   self,
  proposalFile,
  iterNO 
)
165  def loadProposalFromFile(self, proposalFile, iterNO):
166  if len(self.getSmcSamples()) == 0:
167  RuntimeError("SMC samples not yet loaded...")
168  else:
169  proposalModel = pickle.load(open(proposalFile, 'rb'))
170  proposal = np.exp(proposalModel.score_samples(self.getSmcSamples()[iterNO]))
171  return proposal / sum(proposal)
172 

References smc.smc.getSmcSamples().

Referenced by smc.smc.initialize().

◆ recursiveBayesian()

def smc.smc.recursiveBayesian (   self,
  caliStep,
  iterNO = -1 
)
311  def recursiveBayesian(self, caliStep, iterNO=-1):
312  likelihood = self.getLikelihood(caliStep)
313  posterior = self.update(caliStep, likelihood)
314  # get ensemble averages and coefficients of variance
315  ips = np.zeros(self.numParams)
316  covs = np.zeros(self.numParams)
317  for i in range(self.numParams):
318  # ensemble average
319  ips[i] = self.smcSamples[iterNO][:, i].dot(posterior)
320  # diagonal variance
321  covs[i] = ((self.smcSamples[iterNO][:, i] - ips[i]) ** 2).dot(posterior)
322  # get coefficient of variance cov
323  covs[i] = np.sqrt(covs[i]) / ips[i]
324  return likelihood, posterior, ips, covs
325 

References dot(), smc.smc.getLikelihood(), smc.smc.numParams, plotResults.Analysis.smcSamples, smc.smc.smcSamples, oomph::GMRESBlockPreconditioner.update(), oomph::GMRES< MATRIX >.update(), oomph::AugmentedProblemGMRES.update(), oomph::ComplexGMRES< MATRIX >.update(), oomph::HelmholtzGMRESMG< MATRIX >.update(), oomph::HelmholtzFGMRESMG< MATRIX >.update(), Eigen::internal::ldlt_inplace< Lower >.update(), Eigen::internal::ldlt_inplace< Upper >.update(), eigenlldb.EigenSparseMatrixChildProvider.update(), smc.smc.update(), and GpuHelper.update().

Referenced by smc.smc.removeDegeneracy().

◆ removeDegeneracy()

def smc.smc.removeDegeneracy (   self,
  caliStep = -1 
)
494  def removeDegeneracy(self, caliStep=-1):
495  effIDs = np.where(self.posterior[:, caliStep] < 0.5)[0]
496  self.proposal = self.proposal[effIDs, :]
497  self.likelihood = self.likelihood[effIDs, :]
498  self.posterior = self.posterior[effIDs, :]
499  self.smcSamples[0] = self.smcSamples[0][effIDs, :]
500  self.DPMData = self.DPMData[:, effIDs, :]
501  self.numSamples = len(effIDs)
502  for i in range(self.numSteps):
503  self.likelihood[:, i], self.posterior[:, i], \
504  self.ips[:, i], self.covs[:, i] = self.recursiveBayesian(i, self.proposal[:, i])
505 

References smc.smc.covs, smc.smc.DPMData, smc.smc.ips, smc.smc.likelihood, smc.smc.numSamples, smc.smc.numSteps, plotResults.Analysis.posterior, smc.smc.posterior, smc.smc.proposal, smc.smc.recursiveBayesian(), plotResults.Analysis.smcSamples, and smc.smc.smcSamples.

◆ resampleParams()

def smc.smc.resampleParams (   self,
  caliStep,
  thread = 4,
  iterNO = -1 
)
448  def resampleParams(self, caliStep, thread=4, iterNO=-1):
449  if self.verbose:
450  print("Called resampleParams(caliStep=%s, thread=%s, iterNO=%s)" % (caliStep, thread, iterNO))
451  names = self.getNames()
452  smcSamples = self.smcSamples[iterNO]
453  numSamples = self.numSamples
454  # posterior at caliStep is used as the proposal distribution
455  proposal = self.posterior[:, caliStep]
456  newSmcSamples, newparamsFile, gmm, maxNumComponents = \
457  resampledParamsTable(keys=names, smcSamples=smcSamples, proposal=proposal, num=numSamples, thread=thread,
458  maxNumComponents=self.__maxNumComponents, priorWeight=self.__priorWeight,verbose=self.verbose)
459  #print('Parameter table name',newparamsFile)
460  self.smcSamples.append(newSmcSamples)
461  self.paramsFiles.append(newparamsFile)
462  if self.verbose:
463  print("Set smcSamples=%s, self.paramsFiles=%s, gmm=%s, maxNumComponents=%s" % (self.smcSamples, self.paramsFiles, gmm, maxNumComponents))
464  return gmm, maxNumComponents
465 
def resampledParamsTable(keys, smcSamples, proposal, num=100, thread=4, maxNumComponents=10, priorWeight=1e3, tableName='smcTableNew.txt', verbose=False)
Definition: tools.py:56

References smc.smc.__maxNumComponents, smc.smc.__priorWeight, smc.smc.getNames(), smc.smc.numSamples, smc.smc.paramsFiles, plotResults.Analysis.posterior, smc.smc.posterior, Eigen::internal.print(), tools.resampledParamsTable(), plotResults.Analysis.smcSamples, smc.smc.smcSamples, smc.smc.verbose, StatisticsVector< T >.verbose(), StatisticsVector< O >.verbose(), StatisticsVector< XZ >.verbose(), and tetgenbehavior.verbose.

◆ run()

def smc.smc.run (   self,
  iterNO = -1,
  reverse = False,
  threads = 1 
)
173  def run(self, iterNO=-1, reverse=False, threads=1):
174  if self.verbose:
175  print("Called run(iterNO=%s, reverse=%s, threads=%s)" % (iterNO, reverse, threads))
176  # if iterating, reload observation data
177  if iterNO > 0:
178  self.obsData, self.obsCtrlData, self.numObs, self.numSteps = \
179  self.getObsDataFromFile(self.obsDataFile, self.obsCtrl)
180  if self.verbose:
181  print("Read in obsData=%s, obsCtrlData=%s, numObs=%s, numSteps=%s" % (
182  self.obsData, self.obsCtrlData, self.numObs, self.numSteps))
183 
184  # if use Bayesian filtering as a stand alone tool (data already exist before hand)
185  if self.standAlone:
186  # if run DEM simulations now, with the new parameter table
187  if not self.skipDEM and not self.loadSamples:
188  # run DEM simulations in batch.
189  raw_input("*** Press confirm if the DPm file name is correct... ***\n" + self.DPMFile
190  + "\nAbout to run DPM in batch mode with " +
191  ' '.join([self.DPMVersion, self.paramsFiles[iterNO], self.DPMFile]))
192  os.system(' '.join([self.DPMVersion, self.paramsFiles[iterNO], self.DPMFile]))
193  print('All simulations finished')
194  # if run DEM simulations outside, with the new parameter table
195  elif self.skipDEM and not self.loadSamples:
196  print('Leaving GrainLearning... only the parameter table is generated')
197  sys.exit()
198  # if process the simulation data obtained with the existing parameter table
199  else:
200  print('Skipping DEM simulations from GrainLearning side, reading in existing simulation data now')
201  # get simulation data from DPMDataDir
202  DPMDataFiles = glob.glob(os.getcwd() + '/' + self.DPMDataDir + '/' + self.simName + '*')
203  DPMDataFiles.sort()
204  # if glob.glob(self.DPMDataDir + '/*_*txt*') does not return the list of DPM data file
205  while len(DPMDataFiles) == 0:
206  self.simName = raw_input("No DEM filename can be found, tell me the simulation name...\n ")
207  DPMDataFiles = glob.glob(os.getcwd() + '/' + self.DPMDataDir + '/' + self.simName + '*')
208  DPMDataFiles.sort()
209  # check if parameter combinations match with the simulation filename.
210  for i, f in enumerate(DPMDataFiles):
211  # get the file name fore the suffix
212  f = f.split('.' + f.split('.')[-1])[0]
213  # get parameters from the remaining string
214  paramsString = f.split('_')[-self.numParams:]
215  # element wise comparison of the parameter vector
216  if not (np.equal(np.float64(paramsString), self.getSmcSamples()[-1][i]).all()):
217  raise RuntimeError(
218  "Parameters " + ", ".join(
219  ["%s" % v for v in self.getSmcSamples()[-1][i]]) + " do not match with data file " + f)
220  # read simulation data into DPMData and drop keys in obsData
221  self.getDPMData(DPMDataFiles)
222  # if iteration number is an odd number, reverse the data sequences to ensure continuity
223  if reverse:
224  self.obsCtrlData = self.obsCtrlData[::-1]
225  self.obsData = self.obsData[::-1, :]
226  self.DPMData = self.DPMData[::-1, :, :]
227  if self.verbose:
228  print("Reversing data sequence")
229  # loop over data assimilation steps
230  for i in range(self.numSteps):
231  self.likelihood[:, i], self.posterior[:, i], \
232  self.ips[:, i], self.covs[:, i] = self.recursiveBayesian(i)
233  # iterate if effective sample size is too big
234  while self.getEffectiveSampleSize()[-1] > self.__ess:
235  self.__sigma *= 0.9
236  for i in range(self.numSteps):
237  self.likelihood[:, i], self.posterior[:, i], \
238  self.ips[:, i], self.covs[:, i] = self.recursiveBayesian(i)
239  # if perform Bayesian filtering while DEM simulations are running
240  else:
241  exit()
242  # parameter list
243  paramsList = []
244  for i in range(self.numSamples):
245  paramsForEach = {}
246  for j, name in enumerate(self.paramNames):
247  paramsForEach[name] = self.smcSamples[iterNO][i][j]
248  paramsList.append(paramsForEach)
249  # pass parameter list to simulation instances FIXME: runCollision is the user-defined DPM script
250  simData = self.__pool.map(runCollision, zip(self.__scenes, paramsList, repeat(self.obsCtrlData)))
251  self.__pool.close()
252  # ~ data = runCollision([self.smc__scenes,paramsList[0]])
253  # get observation and simulation data ready for Bayesian filtering
254  self.obsData = np.array([self.obsData[name] for name in self.simDataKeys]).transpose()
255  for i, data in enumerate(simData):
256  for j, name in enumerate(self.simDataKeys):
257  # ~ print len(data[name]),i
258  self.DPMData[:, i, j] = data[name]
259  # ~ print np.linalg.norm(data[self.obsCtrl]-self.obsCtrlData)
260  # loop over data assimilation steps
261  if reverse:
262  self.obsCtrlData = self.obsCtrlData[::-1]
263  self.obsData = self.obsData[::-1, :]
264  self.DPMData = self.DPMData[::-1, :, :]
265  for i in range(self.numSteps):
266  self.likelihood[:, i], self.posterior[:, i], \
267  self.ips[:, i], self.covs[:, i] = self.recursiveBayesian(i)
268  # iterate if effective sample size is too big
269  while self.getEffectiveSampleSize()[-1] > self.__ess:
270  self.__sigma *= 0.9
271  for i in range(self.numSteps):
272  self.likelihood[:, i], self.posterior[:, i], \
273  self.ips[:, i], self.covs[:, i] = self.recursiveBayesian(i)
274  if self.verbose:
275  print("Called recursiveBayesian to set "
276  "effectiveSampleSize=%s, sigma=%s, likelihood=%s, posterior=%s, ips=%s, covs=%s"
277  % (self.getEffectiveSampleSize(), self.__sigma, self.likelihood, self.posterior, self.ips,
278  self.covs))
279  return self.ips, self.covs
280 
static constexpr Eigen::internal::all_t all
Definition: IndexedViewHelper.h:86
constexpr array< t, n > repeat(t v)
Definition: MoreMeta.h:583
bool close(double a, double b, double eps)
Definition: NurbsUtils.cc:17
void transpose()
Definition: skew_symmetric_matrix3.cpp:135
void run(const string &dir_name, LinearSolver *linear_solver_pt, const unsigned nel_1d, bool mess_up_order)
Definition: two_d_poisson_compare_solvers.cc:317

References Eigen::placeholders.all, smc.smc.DPMDataDir, smc.smc.DPMFile, smc.smc.DPMVersion, smc.smc.getDPMData(), smc.smc.getObsDataFromFile(), smc.smc.getSmcSamples(), smc.smc.loadSamples, smc.smc.numParams, smc.smc.numSteps, smc.smc.obsCtrl, smc.smc.obsCtrlData, smc.smc.obsData, smc.smc.obsDataFile, smc.smc.paramsFiles, Eigen::internal.print(), smc.smc.simName, smc.smc.skipDEM, smc.smc.standAlone, smc.smc.verbose, StatisticsVector< T >.verbose(), StatisticsVector< O >.verbose(), StatisticsVector< XZ >.verbose(), and tetgenbehavior.verbose.

◆ trainGMMinTime()

def smc.smc.trainGMMinTime (   self,
  maxNumComponents,
  iterNO = -1 
)
485  def trainGMMinTime(self, maxNumComponents, iterNO=-1):
486  gmmList = []
487  smcSamples = self.smcSamples[iterNO]
488  for i in range(self.numSteps):
489  print ('Train DP mixture at time %i...' % i)
490  posterior = self.posterior[:, i]
491  gmmList.append(getGMMFromPosterior(smcSamples, posterior, maxNumComponents))
492  return gmmList
493 
def getGMMFromPosterior(smcSamples, posterior, priorWeight)
Definition: tools.py:84

References tools.getGMMFromPosterior(), smc.smc.numSteps, plotResults.Analysis.posterior, smc.smc.posterior, plotResults.Analysis.smcSamples, and smc.smc.smcSamples.

◆ update()

def smc.smc.update (   self,
  caliStep,
  likelihood 
)
345  def update(self, caliStep, likelihood):
346  # update posterior probability according to Bayes' rule
347  posterior = np.zeros(self.numSamples)
348  if caliStep == 0:
349  posterior = likelihood / self.proposal
350  else:
351  posterior = self.posterior[:, caliStep - 1] * likelihood
352  # regularize likelihood
353  posterior /= np.sum(posterior)
354  return posterior
355 

References smc.smc.numSamples, plotResults.Analysis.posterior, smc.smc.posterior, and smc.smc.proposal.

Referenced by smc.smc.recursiveBayesian().

◆ writeBayeStatsToFile()

def smc.smc.writeBayeStatsToFile (   self,
  reverse 
)
506  def writeBayeStatsToFile(self, reverse):
507  np.savetxt(self.DPMDataDir + '/particle.txt', self.getSmcSamples()[0])
508  np.savetxt(self.DPMDataDir + '/IP.txt', self.ips[:, ::(-1) ** reverse].T)
509  np.savetxt(self.DPMDataDir + '/weight.txt', self.getPosterior()[:, ::(-1) ** reverse])

References smc.smc.DPMDataDir, smc.smc.getPosterior(), smc.smc.getSmcSamples(), and smc.smc.ips.

Member Data Documentation

◆ __ess

smc.smc.__ess
private

◆ __maxNumComponents

smc.smc.__maxNumComponents
private

◆ __obsMatrix

smc.smc.__obsMatrix
private

Referenced by smc.smc.getLikelihood().

◆ __pool

smc.smc.__pool
private

Referenced by smc.smc.initialize().

◆ __priorWeight

smc.smc.__priorWeight
private

◆ __scenes

smc.smc.__scenes
private

Referenced by smc.smc.initialize().

◆ __sigma

smc.smc.__sigma
private

Referenced by smc.smc.getCovMatrix().

◆ covs

smc.smc.covs

◆ DPMData

◆ DPMDataDir

◆ DPMFile

smc.smc.DPMFile

Referenced by smc.smc.run().

◆ DPMVersion

smc.smc.DPMVersion

Referenced by smc.smc.run().

◆ ips

◆ likelihood

smc.smc.likelihood

◆ loadSamples

smc.smc.loadSamples

Referenced by smc.smc.initialize(), and smc.smc.run().

◆ numParams

◆ numSamples

◆ numSteps

◆ obsCtrl

smc.smc.obsCtrl

◆ obsCtrlData

smc.smc.obsCtrlData

Referenced by smc.smc.getObsData(), and smc.smc.run().

◆ obsData

◆ obsDataFile

smc.smc.obsDataFile

Referenced by smc.smc.run().

◆ obsWeights

smc.smc.obsWeights

Referenced by smc.smc.getLikelihood().

◆ paramNames

smc.smc.paramNames

◆ paramRanges

smc.smc.paramRanges

◆ paramsFiles

◆ posterior

◆ proposal

smc.smc.proposal

◆ scaleCovWithMax

smc.smc.scaleCovWithMax

Referenced by smc.smc.getCovMatrix().

◆ simDataKeys

smc.smc.simDataKeys

◆ simName

smc.smc.simName

◆ skipDEM

smc.smc.skipDEM

Referenced by smc.smc.run().

◆ smcSamples

◆ standAlone

smc.smc.standAlone

Referenced by smc.smc.initialize(), and smc.smc.run().

◆ verbose


The documentation for this class was generated from the following file: