Source code for workspace.src.LikelihoodModel

# Copyright 2022 Battelle Energy Alliance, LLC
# ALL RIGHTS RESERVED
"""
  Author:  Congjian Wang
  Date  :  07/16/2020
"""

#External Modules---------------------------------------------------------------
import numpy as np
import math
import logging
#External Modules End-----------------------------------------------------------

#Internal Modules---------------------------------------------------------------
from . import LikelihoodModels
from ravenframework.utils import mathUtils as utils
from ravenframework.utils import InputData
from ravenframework.utils import InputTypes
from ravenframework.PluginBaseClasses.ExternalModelPluginBase import ExternalModelPluginBase
#Internal Modules End-----------------------------------------------------------

## option to use logging
# logging.basicConfig(format='%(asctime)s %(name)-20s %(levelname)-8s %(message)s', datefmt='%d-%b-%y %H:%M:%S', level=logging.DEBUG)
# logger = logging.getLogger()
# fh = logging.FileHandler(filename='logos.log', mode='w')
# fh.setLevel(logging.DEBUG)
# formatter = logging.Formatter('%(asctime)s %(name)-20s %(levelname)-8s %(message)s')
# fh.setFormatter(formatter)
# logger.addHandler(fh)

[docs]class LikelihoodModel(ExternalModelPluginBase): """ RAVEN ExternalModel of Likelihood Function that can be combine with MCMC Sampler for Bayesian calibration """ def __init__(self): """ Constructor :returns: None """ ExternalModelPluginBase.__init__(self)
[docs] self.type = self.__class__.__name__
[docs] self.name = self.__class__.__name__
[docs] self._model = None
[docs] self._modelType = None
[docs] self._modelXMLInput = None
[docs] def _readMoreXML(self, container, xmlNode): """ Method to read the portion of the XML that belongs to this plugin :param container: object, self-like object where all the variables can be stored :param xmlNode: xml.etree.ElementTree.Element, XML node that needs to be read :returns: None """ variables = xmlNode.find('variables') inputVars = xmlNode.find('inputs') outputVars = xmlNode.find('outputs') if variables is not None and (inputVars is not None or outputVars is not None): raise IOError("Botht 'variables' node and 'inputs/outputs' are provided! This is not allowed, please consider just use one of them.") if variables is not None: delimiter = ',' if ',' in variables.text else None container.variables = [var.strip() for var in variables.text.split(delimiter)] elif inputVars is not None and outputVars is not None: delimiter = ',' if ',' in inputVars.text else None container.variables = [var.strip() for var in inputVars.text.split(delimiter)] delimiter = ',' if ',' in outputVars.text else None container.variables.extend([var.strip() for var in outputVars.text.split(delimiter)]) self._modelXMLInput = xmlNode.find('LikelihoodModel') self._modelType = self._modelXMLInput.get('type') if self._modelType is None: raise IOError("Required attribute 'type' for node '{}' is not provided!".format(self.name)) self._model = LikelihoodModels.returnInstance(self._modelType)
[docs] def initialize(self, container,runInfoDict,inputFiles): """ Method to initialize this plugin :param container: object, self-like object where all the variables can be stored :param runInfoDict: dict, dictionary containing all the RunInfo parameters (XML node <RunInfo>) :param inputFiles: list, list of input files (if any) :returns: None """ pass
[docs] def run(self, container, inputDict): """ This is a simple example of the run method in a plugin. :param container: object, self-like object where all the variables can be stored :param inputDict: dict, dictionary of inputs from RAVEN :returns: None """ self._model.handleInput(self._modelXMLInput) self._model.initialize(inputDict) self._model.run() outputDict = self._model.getOutputs() for key, val in outputDict.items(): setattr(container, key, val)