From 9849909132d1d56cb0e57583d96d39416a8da0e4 Mon Sep 17 00:00:00 2001 From: Congjian Wang Date: Fri, 10 May 2019 17:05:53 -0600 Subject: [PATCH] Dump HistorySet MetaData into the correct output csv files (#987) * enable historyset to handle both scalar and vector meta data, and add check for NAN from code collections * fix * fix HistorySet * fix reading vector meta data * update tests * add unit test for meta data load, print, reload * fix * modify test to test only the mechanics --- framework/DataObjects/DataSet.py | 13 +- framework/DataObjects/HistorySet.py | 28 ++- framework/Models/Code.py | 2 + framework/PostProcessors/BasicStatistics.py | 22 ++- .../gold/timeDepMeta/Back_to_MASTER.xml | 66 +++++++ .../BasicStatistics/test_time_dep_meta.xml | 157 ++++++++++++++++ .../PostProcessors/BasicStatistics/tests | 172 +++++++++--------- .../BasicStatistics/timeDepMeta/RawData.csv | 3 + .../BasicStatistics/timeDepMeta/RawData_0.csv | 5 + .../BasicStatistics/timeDepMeta/RawData_1.csv | 5 + .../ARMA/gold/Clustered/romMeta.xml | 7 + .../unit_tests/DataObjects/TestHistorySet.py | 118 +++++++++++- 12 files changed, 498 insertions(+), 100 deletions(-) create mode 100644 tests/framework/PostProcessors/BasicStatistics/gold/timeDepMeta/Back_to_MASTER.xml create mode 100644 tests/framework/PostProcessors/BasicStatistics/test_time_dep_meta.xml create mode 100755 tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData.csv create mode 100755 tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData_0.csv create mode 100755 tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData_1.csv diff --git a/framework/DataObjects/DataSet.py b/framework/DataObjects/DataSet.py index 3928d7f108..6ed5ecc5e2 100644 --- a/framework/DataObjects/DataSet.py +++ b/framework/DataObjects/DataSet.py @@ -112,20 +112,21 @@ def addExpectedMeta(self,keys, params={}): @ In, keys, set(str), keys to register @ In, params, dict, optional, {key:[indexes]}, keys of the dictionary are the variable names, values of the dictionary are lists of the corresponding indexes/coordinates of given variable - @ Out, None + @ Out, keys, list(str), extra keys that has been registered """ # TODO add option to skip parts of meta if user wants to # remove already existing keys keys = list(key for key in keys if key not in self.getVars()+self.indexes) # if no new meta, move along if len(keys) == 0: - return + return keys # CANNOT add expected meta after samples are started assert(self._data is None) assert(self._collector is None or len(self._collector) == 0) self._metavars.extend(keys) self._orderedVars.extend(keys) self.setPivotParams(params) + return keys def addMeta(self, tag, xmlDict = None, node = None): """ @@ -972,7 +973,7 @@ def _convertArrayListToDataset(self,array,action='return'): # determine dimensions for each variable dimsMeta = {} for name, var in new.variables.items(): - if name not in self._inputs + self._outputs: + if name not in self._inputs + self._outputs + self._metavars: continue dims = list(var.dims) # don't list if only entry is sampleTag @@ -1554,8 +1555,12 @@ def _loadCsvMeta(self,fileName): dims = meta.get('pivotParams',{}) if len(dims)>0: self.setPivotParams(dims) + # vector metavars is also stored in 'DataSet/dims' node + metavars = meta.get('metavars',[]) + # get dict of vector metavars + params = {key:val for key, val in dims.items() if key in metavars} # add metadata, so we get probability weights and etc - self.addExpectedMeta(meta.get('metavars',[])) + self.addExpectedMeta(metavars,params) # check all variables desired are available provided = set(meta.get('inputs',[])+meta.get('outputs',[])+meta.get('metavars',[])) # otherwise, if we have no meta XML to load from, infer what we can from the CSV, which is only the available variables. diff --git a/framework/DataObjects/HistorySet.py b/framework/DataObjects/HistorySet.py index d1d8008986..7cfe8ef3d7 100644 --- a/framework/DataObjects/HistorySet.py +++ b/framework/DataObjects/HistorySet.py @@ -81,6 +81,8 @@ def __init__(self): self.printTag = self.name self._tempPivotParam = None self._neededForReload = [] # HistorySet doesn't need anything special to load, since it's written in cluster-by-sample CSV format + self._inputMetaVars = [] # meta vars belong to the input of HistorySet, i.e. scalar + self._outputMetaVars = [] # meta vara belong to the output of HistorySet, i.e. vector def _readMoreXML(self,xmlNode): """ @@ -126,7 +128,7 @@ def _fromCSV(self,fileName,**kwargs): main = self._readPandasCSV(fileName+'.csv') nSamples = len(main.index) ## collect input space data - for inp in self._inputs + self._metavars: + for inp in self._inputs + self._inputMetaVars: data[inp] = main[inp].values ## get the sampleTag values if they're present, in case it's not just range if self.sampleTag in main: @@ -136,7 +138,7 @@ def _fromCSV(self,fileName,**kwargs): # load subfiles for output spaces subFiles = main['filename'].values # pre-build realization spots - for out in self._outputs + self.indexes: + for out in self._outputs + self.indexes + self._outputMetaVars: data[out] = np.zeros(nSamples,dtype=object) # read in secondary CSVs for i,sub in enumerate(subFiles): @@ -150,7 +152,7 @@ def _fromCSV(self,fileName,**kwargs): if len(set(subDat.keys()).intersection(self.indexes)) != len(self.indexes): self.raiseAnError(IOError,'Importing HistorySet from .csv: the pivot parameters "'+', '.join(self.indexes)+'" have not been found in the .csv file. Check that the ' 'correct has been specified in the dataObject or make sure the is included in the .csv files') - for out in self._outputs+self.indexes: + for out in self._outputs + self.indexes + self._outputMetaVars: data[out][i] = subDat[out].values # construct final data object self.load(data,style='dict',dims=self.getDimensions()) @@ -190,7 +192,7 @@ def _selectiveRealization(self,rlz): if not utils.isSingleValued(val): # treat inputs, outputs differently TODO this should extend to per-variable someday ## inputs - if var in self._inputs: + if var in self._inputs + self._inputMetaVars: method,indic = self._selectInput # pivot variables are included here in "else"; remove them after they're used in operators else: @@ -256,7 +258,7 @@ def _toCSV(self,fileName,start=0,**kwargs): # specific implementation ## write input space CSV with pointers to history CSVs ### get list of input variables to keep - ordered = list(i for i in itertools.chain(self._inputs,self._metavars) if i in keep) + ordered = list(i for i in itertools.chain(self._inputs,self._inputMetaVars) if i in keep) ### select input part of dataset inpData = data[ordered] ### add column for realization information, pointing to the appropriate CSV @@ -271,7 +273,7 @@ def _toCSV(self,fileName,start=0,**kwargs): ### write CSV self._usePandasWriteCSV(fileName,inpData,ordered,keepSampleTag = self.sampleTag in keep,mode=mode) ## obtain slices to write subset CSVs - ordered = list(o for o in self.getVars('output') if o in keep) + ordered = list(o for o in itertools.chain(self._outputs,self._outputMetaVars) if o in keep) if len(ordered): # hierarchical flag controls the printing/plotting of the dataobject in case it is an hierarchical one. @@ -300,3 +302,17 @@ def _toCSV(self,fileName,start=0,**kwargs): self._usePandasWriteCSV(filename,rlz,ordered,keepIndex=True) else: self.raiseAWarning('No output space variables have been requested for DataObject "{}"! No history files will be printed!'.format(self.name)) + + def addExpectedMeta(self,keys, params={}): + """ + Registers meta to look for in realizations. + @ In, keys, set(str), keys to register + @ In, params, dict, optional, {key:[indexes]}, keys of the dictionary are the variable names, + values of the dictionary are lists of the corresponding indexes/coordinates of given variable + @ Out, None + """ + extraKeys = DataSet.addExpectedMeta(self, keys, params) + self._inputMetaVars.extend(list(key for key in extraKeys if key not in params)) + if params: + self._outputMetaVars.extend(list(key for key in extraKeys if key in params)) + return extraKeys diff --git a/framework/Models/Code.py b/framework/Models/Code.py index b231ebca5f..390fa7c7b6 100644 --- a/framework/Models/Code.py +++ b/framework/Models/Code.py @@ -615,6 +615,8 @@ def evaluateSample(self, myInput, samplerType, kwargs): csvLoader = CsvLoader.CsvLoader(self.messageHandler) csvData = csvLoader.loadCsvFile(outFile) + if np.isnan(csvData).all(): + self.raiseAnError(IOError, 'The data collected from', outputFile+'.csv', 'only contain "NAN"') headers = csvLoader.getAllFieldNames() ## Numpy by default iterates over rows, thus we transpose the data and diff --git a/framework/PostProcessors/BasicStatistics.py b/framework/PostProcessors/BasicStatistics.py index 3aab538193..88394a7f09 100644 --- a/framework/PostProcessors/BasicStatistics.py +++ b/framework/PostProcessors/BasicStatistics.py @@ -254,7 +254,8 @@ def initialize(self, runInfo, inputs, initDict): inputObj = inputs[-1] if type(inputs) == list else inputs if inputObj.type == 'HistorySet': self.dynamic = True - metaKeys = [] + inputMetaKeys = [] + outputMetaKeys = [] for metric, infos in self.toDo.items(): steMetric = metric + '_ste' if steMetric in self.steVals: @@ -262,12 +263,23 @@ def initialize(self, runInfo, inputs, initDict): prefix = info['prefix'] for target in info['targets']: metaVar = prefix + '_ste_' + target if not self.outputDataset else metric + '_ste' - metaKeys.append(metaVar) + metaDim = inputObj.getDimensions(target) + if len(metaDim[target]) == 0: + inputMetaKeys.append(metaVar) + else: + outputMetaKeys.append(metaVar) + metaParams = {} if not self.outputDataset: - metaParams = {key:[self.pivotParameter] for key in metaKeys} if self.dynamic else {} + if len(outputMetaKeys) > 0: + metaParams = {key:[self.pivotParameter] for key in outputMetaKeys} else: - metaParams = {key:[self.pivotParameter,self.steMetaIndex] for key in metaKeys} if self.dynamic else {key:[self.steMetaIndex]} - + if len(outputMetaKeys) > 0: + params = {key:[self.pivotParameter,self.steMetaIndex] for key in outputMetaKeys + inputMetaKeys} + metaParams.update(params) + elif len(inputMetaKeys) > 0: + params = {key:[self.steMetaIndex] for key in inputMetaKeys} + metaParams.update(params) + metaKeys = inputMetaKeys + outputMetaKeys self.addMetaKeys(metaKeys,metaParams) def _localReadMoreXML(self, xmlNode): diff --git a/tests/framework/PostProcessors/BasicStatistics/gold/timeDepMeta/Back_to_MASTER.xml b/tests/framework/PostProcessors/BasicStatistics/gold/timeDepMeta/Back_to_MASTER.xml new file mode 100644 index 0000000000..0fba64089a --- /dev/null +++ b/tests/framework/PostProcessors/BasicStatistics/gold/timeDepMeta/Back_to_MASTER.xml @@ -0,0 +1,66 @@ + + + + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + Time_aligned + + + avg_VCool,avg_TCool,avg_LinPow,avg_HTcoeff,avg_RodPitch,var_VCool,var_TCool,var_LinPow,var_HTcoeff,var_RodPitch + sen_EXP_PCT_a_VCool,sen_EXP_MaxCtoF_a_VCool,sen_EXP_P_a_VCool,sen_EXP_PCT_a_TCool,sen_EXP_MaxCtoF_a_TCool,sen_EXP_P_a_TCool,sen_EXP_PCT_a_LinPow,sen_EXP_MaxCtoF_a_LinPow,sen_EXP_P_a_LinPow,sen_EXP_PCT_a_HTcoeff,sen_EXP_MaxCtoF_a_HTcoeff,sen_EXP_P_a_HTcoeff,sen_EXP_PCT_a_RodPitch,sen_EXP_MaxCtoF_a_RodPitch,sen_EXP_P_a_RodPitch,sen_REP_PCT_a_VCool,sen_REP_MaxCtoF_a_VCool,sen_REP_P_a_VCool,sen_REP_PCT_a_TCool,sen_REP_MaxCtoF_a_TCool,sen_REP_P_a_TCool,sen_REP_PCT_a_LinPow,sen_REP_MaxCtoF_a_LinPow,sen_REP_P_a_LinPow,sen_REP_PCT_a_HTcoeff,sen_REP_MaxCtoF_a_HTcoeff,sen_REP_P_a_HTcoeff,sen_REP_PCT_a_RodPitch,sen_REP_MaxCtoF_a_RodPitch,avg_EXP_PCT_a,avg_EXP_MaxCtoF_a,avg_EXP_P_a,avg_REP_PCT_a,avg_REP_MaxCtoF_a,avg_REP_P_a,var_EXP_PCT_a,var_EXP_MaxCtoF_a,var_EXP_P_a,var_REP_PCT_a,var_REP_MaxCtoF_a,var_REP_P_a + avg_ste_EXP_MaxCtoF_a,avg_ste_EXP_PCT_a,avg_ste_EXP_P_a,avg_ste_HTcoeff,avg_ste_LinPow,avg_ste_REP_MaxCtoF_a,avg_ste_REP_PCT_a,avg_ste_REP_P_a,avg_ste_RodPitch,avg_ste_TCool,avg_ste_VCool,var_ste_EXP_MaxCtoF_a,var_ste_EXP_PCT_a,var_ste_EXP_P_a,var_ste_HTcoeff,var_ste_LinPow,var_ste_REP_MaxCtoF_a,var_ste_REP_PCT_a,var_ste_REP_P_a,var_ste_RodPitch,var_ste_TCool,var_ste_VCool + RAVEN_sample_ID + + + + diff --git a/tests/framework/PostProcessors/BasicStatistics/test_time_dep_meta.xml b/tests/framework/PostProcessors/BasicStatistics/test_time_dep_meta.xml new file mode 100644 index 0000000000..967a14b762 --- /dev/null +++ b/tests/framework/PostProcessors/BasicStatistics/test_time_dep_meta.xml @@ -0,0 +1,157 @@ + + + + + framework/PostProcessors/BasicStatistics.timeDepMeta + wangc + 2019-05-10 + PostProcessors.BasicStatistics, DataObjects.HistorySet + + This test checks the metadata printing of history set, the scalar meta data should be printed with + the input of HistorySet, while vector meta data should be printed with output of HistorySet. See issue #986. + With the fix of #986, The HistorySet will handle scalar and vector meta data separately. + + + + + timeDepMeta + Read_raw, SensPost_1, Back_to_MASTER + True + o,plt,rst,csv,i + + + + RawData + + + + + VCool, + TCool, + LinPow, + HTcoeff, + RodPitch + + + EXP_PCT_a, + EXP_MaxCtoF_a, + EXP_P_a, + REP_PCT_a, + REP_MaxCtoF_a, + REP_P_a + + + avg_VCool, + avg_TCool, + avg_LinPow, + avg_HTcoeff, + avg_RodPitch, + var_VCool, + var_TCool, + var_LinPow, + var_HTcoeff, + var_RodPitch + + + sen_EXP_PCT_a_VCool, + sen_EXP_MaxCtoF_a_VCool, + sen_EXP_P_a_VCool, + sen_EXP_PCT_a_TCool, + sen_EXP_MaxCtoF_a_TCool, + sen_EXP_P_a_TCool, + sen_EXP_PCT_a_LinPow, + sen_EXP_MaxCtoF_a_LinPow, + sen_EXP_P_a_LinPow, + sen_EXP_PCT_a_HTcoeff, + sen_EXP_MaxCtoF_a_HTcoeff, + sen_EXP_P_a_HTcoeff, + sen_EXP_PCT_a_RodPitch, + sen_EXP_MaxCtoF_a_RodPitch, + sen_EXP_P_a_RodPitch, + sen_REP_PCT_a_VCool, + sen_REP_MaxCtoF_a_VCool, + sen_REP_P_a_VCool, + sen_REP_PCT_a_TCool, + sen_REP_MaxCtoF_a_TCool, + sen_REP_P_a_TCool, + sen_REP_PCT_a_LinPow, + sen_REP_MaxCtoF_a_LinPow, + sen_REP_P_a_LinPow, + sen_REP_PCT_a_HTcoeff, + sen_REP_MaxCtoF_a_HTcoeff, + sen_REP_P_a_HTcoeff, + sen_REP_PCT_a_RodPitch, + sen_REP_MaxCtoF_a_RodPitch, + sen_REP_P_a_HTcoeff, + avg_EXP_PCT_a, + avg_EXP_MaxCtoF_a, + avg_EXP_P_a, + avg_REP_PCT_a, + avg_REP_MaxCtoF_a, + avg_REP_P_a, + var_EXP_PCT_a, + var_EXP_MaxCtoF_a, + var_EXP_P_a, + var_REP_PCT_a, + var_REP_MaxCtoF_a, + var_REP_P_a + + + + + Time_aligned + + GRO_SensPost_in_targets_Timealigned + GRO_SensPost_in_features_scalar + + + GRO_SensPost_in_targets_Timealigned, GRO_SensPost_in_features_scalar + + + GRO_SensPost_in_targets_Timealigned, GRO_SensPost_in_features_scalar + + + + + + + GRO_SensPost_in_features_scalar + GRO_SensPost_in_targets_Timealigned + + Time_aligned + + + + GRO_SensPost_out_scalar + GRO_SensPost_out_Timealigned + + Time_aligned + + + + + + + myinputfile + SET_SensPost_aligned + + + + SET_SensPost_aligned + SensPost_1 + SET_Back_to_MASTER + + + + SET_Back_to_MASTER + Back_to_MASTER + + + + + + csv + SET_Back_to_MASTER + + + diff --git a/tests/framework/PostProcessors/BasicStatistics/tests b/tests/framework/PostProcessors/BasicStatistics/tests index 5f3e2bca50..00aad43689 100644 --- a/tests/framework/PostProcessors/BasicStatistics/tests +++ b/tests/framework/PostProcessors/BasicStatistics/tests @@ -55,63 +55,63 @@ rel_err = 0.00001 zero_threshold = 1e-14 [../] - [./general] - #REQUIREMENT_TEST R-RA-5 - type = 'RavenFramework' - input = 'test_BasicStatistics.xml' - output = 'basicStatisticsGeneral/PointSetPostProcTest_dump.xml basicStatisticsGeneral/CreateInfinity_basicStatPP_dump.xml basicStatisticsGeneral/InputOutput_basicStatPP_dump.xml basicStatisticsGeneral/InverseCorrelatedTest_basicStatPP_dump.xml basicStatisticsGeneral/NotCorrellatedTest_basicStatPP_dump.xml basicStatisticsGeneral/autoCorrelationTest_basicStatPP_dump.xml basicStatisticsGeneral/checkIfMatrixCanBeComputed_basicStatPP_dump.xml' - UnorderedCsv = 'basicStatisticsGeneral/CreateInfinity_basicStatPP_dump.csv basicStatisticsGeneral/InputOutput_basicStatPP_dump.csv basicStatisticsGeneral/InverseCorrelatedTest_basicStatPP_dump.csv basicStatisticsGeneral/NotCorrellatedTest_basicStatPP_dump.csv basicStatisticsGeneral/autoCorrelationTest_basicStatPP_dump.csv basicStatisticsGeneral/PointSetPostProcTest_dump.csv basicStatisticsGeneral/checkIfMatrixCanBeComputed_basicStatPP_dump.csv' - max_time = 500 - rel_err = 0.00001 - zero_threshold = 1e-14 - [../] - [./printXml] - type = 'RavenFramework' - input = 'print_xml.xml' - UnorderedXml = 'basicStatisticsXml/InputOutput_basicStatPP_dump.xml' - UnorderedCsv = 'basicStatisticsXml/InputOutput_basicStatPP_dump.csv' - rel_err = 1e-6 - zero_threshold = 1e-14 - [../] - [./sensitivity] - type = 'RavenFramework' - input = 'sensitivity.xml' - csv = 'basicStatsSensitivity/InputOutput_basicStatPP_dump.csv' - UnorderedXml = 'basicStatsSensitivity/InputOutput_basicStatPP_dump.xml' - rel_err = 0.0000001 - [../] - [./sensitivityOnly] - type = 'RavenFramework' - input = 'sensitivity_only.xml' - csv = 'basicStatsSensitivityOnly/csv_database.csv' - UnorderedXml = 'basicStatsSensitivityOnly/csv_database.xml' - rel_err = 0.0000001 - [../] - [./timeDependent] - type = 'RavenFramework' - input = 'time_dep.xml' - output = 'basicStatisticsTimeDependent/HistorySetPostProcTest_dump.csv' - UnorderedCsv = 'basicStatisticsTimeDependent/HistorySetPostProcTest_dump_0.csv' - UnorderedXml = 'basicStatisticsTimeDependent/HistorySetPostProcTest_dump.xml' - rel_err = 1e-5 - zero_threshold = 1e-14 - [../] - [./timeDependentAsyncHistories] - type = 'RavenFramework' - input = 'time_dep_asyncHists.xml' - output = 'basicStatisticsTimeDependentAsynchronousHistories/timeDepBasicStat_basicStatPP_dump.csv' - UnorderedCsv = 'basicStatisticsTimeDependentAsynchronousHistories/HistorySetPostProcTest_dump_3.csv basicStatisticsTimeDependentAsynchronousHistories/HistorySetPostProcTestSyncronized_dump_3.csv basicStatisticsTimeDependentAsynchronousHistories/timeDepBasicStat_basicStatPP_dump_0.csv basicStatisticsTimeDependentAsynchronousHistories/timeDepBasicStat_basicStatPP_dump_1.csv' - rel_err = 1e-5 - zero_threshold = 1e-14 - [../] - [./variationCoefficient] - type = 'RavenFramework' - input = 'variationCoefficient.xml' - output = 'basicStatisticsGeneral/variationCoefficient_basicStatPP_dump.xml' - UnorderedCsv = 'basicStatisticsGeneral/variationCoefficient_basicStatPP_dump.csv' - max_time = 500 - rel_err = 0.00001 - [../] + [./general] + #REQUIREMENT_TEST R-RA-5 + type = 'RavenFramework' + input = 'test_BasicStatistics.xml' + output = 'basicStatisticsGeneral/PointSetPostProcTest_dump.xml basicStatisticsGeneral/CreateInfinity_basicStatPP_dump.xml basicStatisticsGeneral/InputOutput_basicStatPP_dump.xml basicStatisticsGeneral/InverseCorrelatedTest_basicStatPP_dump.xml basicStatisticsGeneral/NotCorrellatedTest_basicStatPP_dump.xml basicStatisticsGeneral/autoCorrelationTest_basicStatPP_dump.xml basicStatisticsGeneral/checkIfMatrixCanBeComputed_basicStatPP_dump.xml' + UnorderedCsv = 'basicStatisticsGeneral/CreateInfinity_basicStatPP_dump.csv basicStatisticsGeneral/InputOutput_basicStatPP_dump.csv basicStatisticsGeneral/InverseCorrelatedTest_basicStatPP_dump.csv basicStatisticsGeneral/NotCorrellatedTest_basicStatPP_dump.csv basicStatisticsGeneral/autoCorrelationTest_basicStatPP_dump.csv basicStatisticsGeneral/PointSetPostProcTest_dump.csv basicStatisticsGeneral/checkIfMatrixCanBeComputed_basicStatPP_dump.csv' + max_time = 500 + rel_err = 0.00001 + zero_threshold = 1e-14 + [../] + [./printXml] + type = 'RavenFramework' + input = 'print_xml.xml' + UnorderedXml = 'basicStatisticsXml/InputOutput_basicStatPP_dump.xml' + UnorderedCsv = 'basicStatisticsXml/InputOutput_basicStatPP_dump.csv' + rel_err = 1e-6 + zero_threshold = 1e-14 + [../] + [./sensitivity] + type = 'RavenFramework' + input = 'sensitivity.xml' + csv = 'basicStatsSensitivity/InputOutput_basicStatPP_dump.csv' + UnorderedXml = 'basicStatsSensitivity/InputOutput_basicStatPP_dump.xml' + rel_err = 0.0000001 + [../] + [./sensitivityOnly] + type = 'RavenFramework' + input = 'sensitivity_only.xml' + csv = 'basicStatsSensitivityOnly/csv_database.csv' + UnorderedXml = 'basicStatsSensitivityOnly/csv_database.xml' + rel_err = 0.0000001 + [../] + [./timeDependent] + type = 'RavenFramework' + input = 'time_dep.xml' + output = 'basicStatisticsTimeDependent/HistorySetPostProcTest_dump.csv' + UnorderedCsv = 'basicStatisticsTimeDependent/HistorySetPostProcTest_dump_0.csv' + UnorderedXml = 'basicStatisticsTimeDependent/HistorySetPostProcTest_dump.xml' + rel_err = 1e-5 + zero_threshold = 1e-14 + [../] + [./timeDependentAsyncHistories] + type = 'RavenFramework' + input = 'time_dep_asyncHists.xml' + output = 'basicStatisticsTimeDependentAsynchronousHistories/timeDepBasicStat_basicStatPP_dump.csv' + UnorderedCsv = 'basicStatisticsTimeDependentAsynchronousHistories/HistorySetPostProcTest_dump_3.csv basicStatisticsTimeDependentAsynchronousHistories/HistorySetPostProcTestSyncronized_dump_3.csv basicStatisticsTimeDependentAsynchronousHistories/timeDepBasicStat_basicStatPP_dump_0.csv basicStatisticsTimeDependentAsynchronousHistories/timeDepBasicStat_basicStatPP_dump_1.csv' + rel_err = 1e-5 + zero_threshold = 1e-14 + [../] + [./variationCoefficient] + type = 'RavenFramework' + input = 'variationCoefficient.xml' + output = 'basicStatisticsGeneral/variationCoefficient_basicStatPP_dump.xml' + UnorderedCsv = 'basicStatisticsGeneral/variationCoefficient_basicStatPP_dump.csv' + max_time = 500 + rel_err = 0.00001 + [../] [./mc_uniform] type = 'RavenFramework' input = 'mcUnif.xml' @@ -134,31 +134,35 @@ output = 'timeDepOutCsv/fileOut.csv timeDepOutCsv/1-PlotStatsT2_scatter-scatter-scatter.png' max_time = 200 [../] - - [./timeDepDataset] - type = 'RavenFramework' - input = 'time_dep_dataset.xml' - UnorderedCsv = 'basicStatisticsTimeDependent/datasetPrint.csv' - rel_err = 1e-5 - zero_threshold = 1e-14 - [../] - - [./nml] - type = 'RavenFramework' - input = 'test_not_multiple_linear.xml' - UnorderedCsv = 'notMultipleLinear/basicStatPP_dump.csv' - rel_err = 1e-6 - [../] - [./ste] - type = 'RavenFramework' - input = 'ste_mc.xml' - UnorderedCsv = 'ste/basicStatPP_dump.csv' - rel_err = 1e-6 - [../] - [./steGrid] - type = 'RavenFramework' - input = 'ste_grid.xml' - UnorderedCsv = 'steGrid/basicStatPP_dump.csv' - rel_err = 1e-6 - [../] + [./timeDepDataset] + type = 'RavenFramework' + input = 'time_dep_dataset.xml' + UnorderedCsv = 'basicStatisticsTimeDependent/datasetPrint.csv' + rel_err = 1e-5 + zero_threshold = 1e-14 + [../] + [./nml] + type = 'RavenFramework' + input = 'test_not_multiple_linear.xml' + UnorderedCsv = 'notMultipleLinear/basicStatPP_dump.csv' + rel_err = 1e-6 + [../] + [./ste] + type = 'RavenFramework' + input = 'ste_mc.xml' + UnorderedCsv = 'ste/basicStatPP_dump.csv' + rel_err = 1e-6 + [../] + [./steGrid] + type = 'RavenFramework' + input = 'ste_grid.xml' + UnorderedCsv = 'steGrid/basicStatPP_dump.csv' + rel_err = 1e-6 + [../] + [./timeDepMeta] + type = 'RavenFramework' + input = 'test_time_dep_meta.xml' + UnorderedXml = 'timeDepMeta/Back_to_MASTER.xml' + output = 'timeDepMeta/Back_to_MASTER.csv timeDepMeta/Back_to_MASTER_0.csv' + [../] [] diff --git a/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData.csv b/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData.csv new file mode 100755 index 0000000000..e303602ab7 --- /dev/null +++ b/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData.csv @@ -0,0 +1,3 @@ +VCool,TCool,LinPow,HTcoeff,RodPitch,filename +4.7194382476,564.186312929,11.4568131492,0.949715714387,1.20350283439,RawData_0.csv +4.86477194504,557.058743153,10.9145789177,0.727527572186,1.21861496921,RawData_1.csv diff --git a/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData_0.csv b/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData_0.csv new file mode 100755 index 0000000000..fa16e05a10 --- /dev/null +++ b/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData_0.csv @@ -0,0 +1,5 @@ +Time_aligned,EXP_PCT_a,EXP_MaxCtoF_a,EXP_P_a,REP_PCT_a,REP_MaxCtoF_a,REP_P_a +1.0,561.35,1.0,15502400.0,622.71,0.36716,15631000.0 +2.0,561.35,1.0,15502400.0,623.03,0.36422,15425000.0 +3.0,561.35,1.0,15502400.0,623.73,0.36207,15581200.0 +4.0,561.35,1.0,15502400.0,623.94,0.36041,15624600.0 diff --git a/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData_1.csv b/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData_1.csv new file mode 100755 index 0000000000..580e70a342 --- /dev/null +++ b/tests/framework/PostProcessors/BasicStatistics/timeDepMeta/RawData_1.csv @@ -0,0 +1,5 @@ +Time_aligned,EXP_PCT_a,EXP_MaxCtoF_a,EXP_P_a,REP_PCT_a,REP_MaxCtoF_a,REP_P_a +1.0,561.35,1.0,15502400.0,626.15,0.38158,15658400.0 +2.0,561.35,1.0,15502400.0,626.71,0.37677,15463700.0 +3.0,561.35,1.0,15502400.0,627.62,0.37316,15639900.0 +4.0,561.35,1.0,15502400.0,627.82,0.37038,15668900.0 diff --git a/tests/framework/ROM/TimeSeries/ARMA/gold/Clustered/romMeta.xml b/tests/framework/ROM/TimeSeries/ARMA/gold/Clustered/romMeta.xml index f17b3d6cad..6cd38957de 100644 --- a/tests/framework/ROM/TimeSeries/ARMA/gold/Clustered/romMeta.xml +++ b/tests/framework/ROM/TimeSeries/ARMA/gold/Clustered/romMeta.xml @@ -1,5 +1,12 @@ + + segment_number + segment_number + segment_number + segment_number + segment_number + ClusterFeature|Signal|Fourier|3.0_amp|scaled,ClusterFeature|Signal|Fourier|3.0_amp|unscaled,ClusterFeature|Signal|Fourier|3.0_phase|scaled,ClusterFeature|Signal|Fourier|3.0_phase|unscaled,ClusterFeature|Signal|Fourier|5.0_amp|scaled,ClusterFeature|Signal|Fourier|5.0_amp|unscaled,ClusterFeature|Signal|Fourier|5.0_phase|scaled,ClusterFeature|Signal|Fourier|5.0_phase|unscaled,ClusterFeature|Signal|arma|std|scaled,ClusterFeature|Signal|arma|std|unscaled,ClusterFeature|Signal|global|mean|scaled,ClusterFeature|Signal|global|mean|unscaled,ClusterLabels,seg_Time_end,seg_Time_start,seg_index_end,seg_index_start RAVEN_sample_ID diff --git a/tests/framework/unit_tests/DataObjects/TestHistorySet.py b/tests/framework/unit_tests/DataObjects/TestHistorySet.py index 7093de7709..c47b242a13 100644 --- a/tests/framework/unit_tests/DataObjects/TestHistorySet.py +++ b/tests/framework/unit_tests/DataObjects/TestHistorySet.py @@ -698,6 +698,123 @@ def formatRealization(rlz): #data._readMoreXML(xml) #checkFails('Expected error foulty realization (index/variable no matching shape), rlzFoulty', "SyntaxError: Realization was not formatted correctly", data.addRealization, args=(rlzFoulty,)) +###################################### +# scalar and vector meta data # +###################################### +xml = createElement('HistorySet',attrib={'name':'test'}) +xml.append(createElement('Input',text='a,b')) +xml.append(createElement('Output',text='y')) +options = createElement('options') +options.append(createElement('pivotParameter',text='Timelike')) +xml.append(options) +data = DataObjects.HistorySet() +data.messageHandler = mh +data._readMoreXML(xml) +metavars = ['prefix', 'vectorMeta'] +params = {'vectorMeta':['Timelike']} +data.addExpectedMeta(metavars, params) +rlz1 = {'a': 1.0, + 'b': 2.0, + 'y': [5.0, 5.1, 5.2], + 'prefix': 'first', + 'vectorMeta':[1.1,1.2,1.3], + 'Timelike':[3.1e-6,3.2e-6,3.3e-6], + } +rlz2 = {'a' :11.0, + 'b': 12.0, + 'y': [15.0, 15.1, 15.2], + 'prefix': 'second', + 'vectorMeta':[2.1,2.2,2.3], + 'Timelike':[13.1e-6,13.2e-6,13.3e-6], + } +formatRealization(rlz1) +formatRealization(rlz2) +data.addRealization(rlz1) +data.addRealization(rlz2) +csvname = 'HSVectorMetaUnitTest' +data.write(csvname,style='CSV',**{'what':'a,b,c,y,RAVEN_sample_ID,prefix,vectorMeta'}) +## test metadata written +correct = ['', + ' ', + ' ', + ' Timelike', + ' Timelike', + ' ', + ' ', + ' a,b', + ' y', + ' prefix,vectorMeta', + ' RAVEN_sample_ID', + ' ', + ' ', + ' ', + ''] +# read in XML +lines = open(csvname+'.xml','r').readlines() +# remove line endings +for l,line in enumerate(lines): + lines[l] = line.rstrip(os.linesep).rstrip('\n') +# check +checkArray('CSV XML',lines,correct,str) +## read from CSV/XML +### create the data object +xml = createElement('HistorySet',attrib={'name':'test'}) +xml.append(createElement('Input',text='a,b')) +xml.append(createElement('Output',text='y')) +options = createElement('options') +options.append(createElement('pivotParameter',text='Timelike')) +xml.append(options) +dataCSV = DataObjects.HistorySet() +dataCSV.messageHandler = mh +dataCSV._readMoreXML(xml) +### load the data (with both CSV, XML) +dataCSV.load(csvname,style='CSV') +for var in data.getVars(): + if isinstance(data.getVarValues(var).item(0),(float,int)): + checkTrue('CSV var {}'.format(var),(dataCSV._data[var] - data._data[var]).sum()<1e-20) #necessary due to roundoff + else: + checkTrue('CSV var {}'.format(var),bool((dataCSV._data[var] == data._data[var]).prod())) +os.remove(csvname+'.csv') +os.remove(csvname+'_0.csv') +os.remove(csvname+'_1.csv') + +csvname = 'HSVectorMetaUnitTest' +dataCSV.write(csvname,style='CSV',**{'what':'a,b,c,y,RAVEN_sample_ID,prefix,vectorMeta'}) +# read in XML +lines = open(csvname+'.xml','r').readlines() +# remove line endings +for l,line in enumerate(lines): + lines[l] = line.rstrip(os.linesep).rstrip('\n') +# check +checkArray('CSV XML',lines,correct,str) +### also try without the XML metadata file, just the CSVs +# get rid of the xml file +os.remove(csvname+'.xml') +dataCSV.reset() +dataCSV.load(csvname,style='CSV') +for var in data.getVars(): + if isinstance(data.getVarValues(var).item(0),(float,int)): + checkTrue('CSV var {}'.format(var),(dataCSV._data[var] - data._data[var]).sum()<1e-20) #necessary due to roundoff + else: + checkTrue('CSV var {}'.format(var),bool((dataCSV._data[var] == data._data[var]).prod())) +# clean up remaining temp files +os.remove(csvname+'.csv') +os.remove(csvname+'_0.csv') +os.remove(csvname+'_1.csv') +csvname = 'HSVectorMetaUnitTest' +dataCSV.write(csvname,style='CSV',**{'what':'a,b,c,y,RAVEN_sample_ID,prefix,vectorMeta'}) +# read in XML +lines = open(csvname+'.xml','r').readlines() +# remove line endings +for l,line in enumerate(lines): + lines[l] = line.rstrip(os.linesep).rstrip('\n') +# check +checkArray('CSV XML',lines,correct,str) +os.remove(csvname+'.csv') +os.remove(csvname+'_0.csv') +os.remove(csvname+'_1.csv') +os.remove(csvname+'.xml') + print(results) sys.exit(results["fail"]) @@ -712,4 +829,3 @@ def formatRealization(rlz): """ -