25 #include <queso/MonteCarloSG.h>
26 #include <queso/GslVector.h>
27 #include <queso/GslMatrix.h>
32 template <
class P_V,
class P_M,
class Q_V,
class Q_M>
39 m_env (paramRv.env()),
41 m_qoiFunction (qoiFunction),
42 m_paramSpace (m_paramRv.imageSet().vectorSpace()),
43 m_qoiSpace (m_qoiFunction.imageSet().vectorSpace()),
45 m_numPsNotSubWritten (0),
46 m_numQsNotSubWritten (0),
47 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
48 m_alternativeOptionsValues(NULL,NULL),
50 m_alternativeOptionsValues(),
54 if (m_env.subDisplayFile()) {
55 *m_env.subDisplayFile() <<
"Entering MonteCarloSG<P_V,P_M,Q_V,Q_M>::constructor()"
56 <<
": prefix = " << prefix
57 <<
", alternativeOptionsValues = " << alternativeOptionsValues
58 <<
", m_env.optionsInputFileName() = " << m_env.optionsInputFileName()
62 if (alternativeOptionsValues) m_alternativeOptionsValues = *alternativeOptionsValues;
63 if (m_env.optionsInputFileName() ==
"") {
68 m_optionsObj->scanOptionsValues();
71 UQ_FATAL_TEST_MACRO(paramRv.imageSet().vectorSpace().dimLocal() != qoiFunction.domainSet().vectorSpace().dimLocal(),
73 "MonteCarloSG<P_V,P_M,Q_V,Q_M>::constructor()",
74 "'paramRv' and 'qoiFunction' are related to vector spaces of different dimensions");
76 if (m_env.subDisplayFile()) {
77 *m_env.subDisplayFile() <<
"Leaving MonteCarloSG<P_V,P_M,Q_V,Q_M>::constructor()"
82 template <
class P_V,
class P_M,
class Q_V,
class Q_M>
85 if (m_optionsObj )
delete m_optionsObj;
86 if (m_qoiFunctionSynchronizer)
delete m_qoiFunctionSynchronizer;
89 template <
class P_V,
class P_M,
class Q_V,
class Q_M>
97 "MonteCarloSG<P_V,P_M,Q_V,Q_M>::generateSequence()",
98 "'m_qoiFunction.domainSet' and 'workingPSeq' are related to vector spaces of different dimensions");
102 "MonteCarloSG<P_V,P_M,Q_V,Q_M>::generateSequence()",
103 "'m_qoiFunction.imageSet' and 'workingQSeq' are related to vector spaces of different dimensions");
105 MiscCheckTheParallelEnvironment<P_V,Q_V>(m_paramRv.imageSet().vectorSpace().zeroVector(),
106 m_qoiFunction.imageSet().vectorSpace().zeroVector());
107 internGenerateSequence(m_paramRv,workingPSeq,workingQSeq);
112 template <
class P_V,
class P_M,
class Q_V,
class Q_M>
119 template <
class P_V,
class P_M,
class Q_V,
class Q_M>
126 workingPSeq.
setName(m_optionsObj->m_prefix+
"ParamSeq");
127 workingQSeq.
setName(m_optionsObj->m_prefix+
"QoiSeq");
132 unsigned int subActualSizeBeforeGeneration = std::min(m_optionsObj->m_ov.m_qseqSize,paramRv.
realizer().
subPeriod());
133 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
134 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
135 <<
": m_optionsObj->m_ov.m_qseqSize = " << m_optionsObj->m_ov.m_qseqSize
137 <<
", about to call actualGenerateSequence() with subActualSize = " << subActualSizeBeforeGeneration
141 actualGenerateSequence(paramRv,
144 subActualSizeBeforeGeneration);
147 actualReadSequence(paramRv,
148 m_optionsObj->m_ov.m_qseqDataInputFileName,
149 m_optionsObj->m_ov.m_qseqDataInputFileType,
152 subActualSizeBeforeGeneration);
154 unsigned int subActualSizeAfterGeneration = workingPSeq.
subSequenceSize();
157 "MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()",
158 "P and Q sequences should have the same size!");
160 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
161 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
162 <<
": returned from call to actualGenerateSequence() with subActualSize = " << subActualSizeAfterGeneration
169 if (m_env.subDisplayFile()) {
170 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
171 <<
", prefix = " << m_optionsObj->m_prefix
172 <<
": checking necessity of opening generic output file (qseq name is " << workingQSeq.
name()
177 m_env.openOutputFile(m_optionsObj->m_ov.m_dataOutputFileName,
179 m_optionsObj->m_ov.m_dataOutputAllowedSet,
188 if (m_env.subDisplayFile()) {
189 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
190 <<
", prefix = " << m_optionsObj->m_prefix
191 <<
": checking necessity of opening output files for pseq " << workingPSeq.
name()
197 if ((m_numPsNotSubWritten > 0 ) &&
199 workingPSeq.
subWriteContents(subActualSizeBeforeGeneration - m_numPsNotSubWritten,
200 m_numPsNotSubWritten,
201 m_optionsObj->m_ov.m_pseqDataOutputFileName,
202 m_optionsObj->m_ov.m_pseqDataOutputFileType,
203 m_optionsObj->m_ov.m_pseqDataOutputAllowedSet);
204 if (m_env.subDisplayFile()) {
205 *m_env.subDisplayFile() <<
"In MonteCarloG<P_V,P_M>::internGenerateSequence()"
206 <<
": just wrote remaining pseq positions (per period request)"
209 m_numPsNotSubWritten = 0;
221 workingPSeq.
unifiedWriteContents(m_optionsObj->m_ov.m_pseqDataOutputFileName,m_optionsObj->m_ov.m_pseqDataOutputFileType);
222 if (m_env.subDisplayFile()) {
223 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
224 <<
", prefix = " << m_optionsObj->m_prefix
225 <<
": closed unified data output file '" << m_optionsObj->m_ov.m_pseqDataOutputFileName
226 <<
"' for pseq " << workingPSeq.
name()
232 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
233 if (m_optionsObj->m_ov.m_pseqComputeStats) {
234 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
235 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
236 <<
": about to call 'workingPSeq.computeStatistics()'"
239 workingPSeq.computeStatistics(*m_optionsObj->m_pseqStatisticalOptionsObj,
240 genericFilePtrSet.
ofsVar);
241 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
242 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
243 <<
": returned from call to 'workingPSeq.computeStatistics()'"
253 if (m_env.subDisplayFile()) {
254 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
255 <<
", prefix = " << m_optionsObj->m_prefix
256 <<
": checking necessity of opening output files for qseq " << workingQSeq.
name()
262 if ((m_numQsNotSubWritten > 0 ) &&
264 workingQSeq.
subWriteContents(subActualSizeBeforeGeneration - m_numQsNotSubWritten,
265 m_numQsNotSubWritten,
266 m_optionsObj->m_ov.m_qseqDataOutputFileName,
267 m_optionsObj->m_ov.m_qseqDataOutputFileType,
268 m_optionsObj->m_ov.m_qseqDataOutputAllowedSet);
269 if (m_env.subDisplayFile()) {
270 *m_env.subDisplayFile() <<
"In MonteCarloG<P_V,P_M>::internGenerateSequence()"
271 <<
": just wrote remaining qseq positions (per period request)"
274 m_numQsNotSubWritten = 0;
286 workingQSeq.
unifiedWriteContents(m_optionsObj->m_ov.m_qseqDataOutputFileName,m_optionsObj->m_ov.m_qseqDataOutputFileType);
287 if (m_env.subDisplayFile()) {
288 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
289 <<
", prefix = " << m_optionsObj->m_prefix
290 <<
": closed unified data output file '" << m_optionsObj->m_ov.m_qseqDataOutputFileName
291 <<
"' for qseq " << workingQSeq.
name()
297 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
298 if (m_optionsObj->m_ov.m_qseqComputeStats) {
299 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
300 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
301 <<
": about to call 'workingQSeq.computeStatistics()'"
304 workingQSeq.computeStatistics(*m_optionsObj->m_qseqStatisticalOptionsObj,
305 genericFilePtrSet.
ofsVar);
306 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
307 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
308 <<
": returned from call to 'workingQSeq.computeStatistics()'"
316 if (genericFilePtrSet.
ofsVar) {
318 delete genericFilePtrSet.
ofsVar;
321 if (m_env.subDisplayFile()) {
322 *m_env.subDisplayFile() <<
"In MonteCarloSG<P_V,P_M,Q_V,Q_M>::internGenerateSequence()"
323 <<
", prefix = " << m_optionsObj->m_prefix
324 <<
": closed generic data output file '" << m_optionsObj->m_ov.m_dataOutputFileName
325 <<
"' for QoI sequence " << workingQSeq.
name()
329 if (m_env.subDisplayFile()) {
330 *m_env.subDisplayFile() << std::endl;
336 template <
class P_V,
class P_M,
class Q_V,
class Q_M>
342 unsigned int requestedSeqSize)
344 if (m_env.subDisplayFile()) {
345 *m_env.subDisplayFile() <<
"Starting the generation of qoi sequence " << workingQSeq.
name()
346 <<
", with " << requestedSeqSize
352 struct timeval timevalSeq;
353 struct timeval timevalQoIFunction;
355 double seqRunTime = 0;
356 double qoiFunctionRunTime = 0;
358 iRC = gettimeofday(&timevalSeq, NULL);
362 m_numPsNotSubWritten = 0;
364 m_numQsNotSubWritten = 0;
366 P_V tmpP(m_paramSpace.zeroVector());
367 Q_V tmpQ(m_qoiSpace.zeroVector());
369 unsigned int actualSeqSize = 0;
370 for (
unsigned int i = 0; i < requestedSeqSize; ++i) {
373 if (m_optionsObj->m_ov.m_qseqMeasureRunTimes) iRC = gettimeofday(&timevalQoIFunction, NULL);
374 m_qoiFunctionSynchronizer->callFunction(&tmpP,NULL,&tmpQ,NULL,NULL,NULL);
375 if (m_optionsObj->m_ov.m_qseqMeasureRunTimes) qoiFunctionRunTime +=
MiscGetEllapsedSeconds(&timevalQoIFunction);
377 bool allQsAreFinite =
true;
378 for (
unsigned int j = 0; j < tmpQ.sizeLocal(); ++j) {
379 if ((tmpQ[j] == INFINITY) || (tmpQ[j] == -INFINITY)) {
380 std::cerr <<
"WARNING In MonteCarloSG<P_V,P_M,Q_V,Q_M>::actualGenerateSequence()"
381 <<
", worldRank " << m_env.worldRank()
382 <<
", fullRank " << m_env.fullRank()
383 <<
", subEnvironment " << m_env.subId()
384 <<
", subRank " << m_env.subRank()
385 <<
", inter0Rank " << m_env.inter0Rank()
387 <<
", tmpQ[" << j <<
"] = " << tmpQ[j]
388 <<
", tmpP = " << tmpP
389 <<
", tmpQ = " << tmpQ
391 allQsAreFinite =
false;
401 if (allQsAreFinite) {};
405 m_numPsNotSubWritten++;
406 if ((m_optionsObj->m_ov.m_pseqDataOutputPeriod > 0 ) &&
407 (((i+1) % m_optionsObj->m_ov.m_pseqDataOutputPeriod) == 0 ) &&
408 (m_optionsObj->m_ov.m_pseqDataOutputFileName !=
".")) {
409 workingPSeq.
subWriteContents(i + 1 - m_optionsObj->m_ov.m_pseqDataOutputPeriod,
410 m_optionsObj->m_ov.m_pseqDataOutputPeriod,
411 m_optionsObj->m_ov.m_pseqDataOutputFileName,
412 m_optionsObj->m_ov.m_pseqDataOutputFileType,
413 m_optionsObj->m_ov.m_pseqDataOutputAllowedSet);
414 if (m_env.subDisplayFile()) {
415 *m_env.subDisplayFile() <<
"In MonteCarloG<P_V,P_M>::actualGenerateSequence()"
416 <<
": just wrote pseq positions (per period request)"
419 m_numPsNotSubWritten = 0;
423 m_numQsNotSubWritten++;
424 if ((m_optionsObj->m_ov.m_qseqDataOutputPeriod > 0 ) &&
425 (((i+1) % m_optionsObj->m_ov.m_qseqDataOutputPeriod) == 0 ) &&
426 (m_optionsObj->m_ov.m_qseqDataOutputFileName !=
".")) {
427 workingQSeq.
subWriteContents(i + 1 - m_optionsObj->m_ov.m_qseqDataOutputPeriod,
428 m_optionsObj->m_ov.m_qseqDataOutputPeriod,
429 m_optionsObj->m_ov.m_qseqDataOutputFileName,
430 m_optionsObj->m_ov.m_qseqDataOutputFileType,
431 m_optionsObj->m_ov.m_qseqDataOutputAllowedSet);
432 if (m_env.subDisplayFile()) {
433 *m_env.subDisplayFile() <<
"In MonteCarloG<P_V,P_M>::actualGenerateSequence()"
434 <<
": just wrote qseq positions (per period request)"
437 m_numQsNotSubWritten = 0;
444 if ((m_optionsObj->m_ov.m_qseqDisplayPeriod > 0) &&
445 (((i+1) % m_optionsObj->m_ov.m_qseqDisplayPeriod) == 0)) {
446 if (m_env.subDisplayFile()) {
447 *m_env.subDisplayFile() <<
"Finished generating " << i+1
461 if (m_env.subDisplayFile()) {
462 *m_env.subDisplayFile() <<
"Finished the generation of qoi sequence " << workingQSeq.
name()
465 <<
"\nSome information about this sequence:"
466 <<
"\n Sequence run time = " << seqRunTime
468 <<
"\n\n Breaking of the seq run time:\n"
469 <<
"\n QoI function run time = " << qoiFunctionRunTime
470 <<
" seconds (" << 100.*qoiFunctionRunTime/seqRunTime
478 template <
class P_V,
class P_M,
class Q_V,
class Q_M>
482 const std::string& dataInputFileName,
483 const std::string& dataInputFileType,
486 unsigned int requestedSeqSize)
489 P_V tmpP(m_paramSpace.zeroVector());
490 for (
unsigned int i = 0; i < requestedSeqSize; ++i) {
A templated class that implements a Monte Carlo generator of samples.
std::ofstream * ofsVar
Provides a stream interface to write data to files.
void actualGenerateSequence(const BaseVectorRV< P_V, P_M > ¶mRv, BaseVectorSequence< P_V, P_M > &workingPSeq, BaseVectorSequence< Q_V, Q_M > &workingQSeq, unsigned int seqSize)
This method actually generates the QoI sequence.
MonteCarloSG(const char *prefix, const McOptionsValues *alternativeOptionsValues, const BaseVectorRV< P_V, P_M > ¶mRv, const BaseVectorFunction< P_V, P_M, Q_V, Q_M > &qoiFunction)
Constructor.
#define UQ_FILE_EXTENSION_FOR_MATLAB_FORMAT
This class reads the options for the Monte Carlo sequence generator from an input file...
void print(std::ostream &os) const
Prints the sequence.
virtual void unifiedReadContents(const std::string &fileName, const std::string &fileType, const unsigned int subSequenceSize)=0
Reads info of the unified sequence from a file. See template specialization.
virtual void setPositionValues(unsigned int posId, const V &vec)=0
Set the values in vec at position posId of the sequence. See template specialization.
virtual void resizeSequence(unsigned int newSubSequenceSize)=0
Resize the sequence. See template specialization.
const std::string & name() const
Access to protected attribute m_name: name of the sequence of vectors.
void internGenerateSequence(const BaseVectorRV< P_V, P_M > ¶mRv, BaseVectorSequence< P_V, P_M > &workingPSeq, BaseVectorSequence< Q_V, Q_M > &workingQSeq)
Generates the QoI (output) sequence; it calls actualGenerateSequence().
virtual void subWriteContents(unsigned int initialPos, unsigned int numPos, const std::string &fileName, const std::string &fileType, const std::set< unsigned int > &allowedSubEnvIds) const =0
Writes info of the sub-sequence to a file. See template specialization.
Struct for handling data input and output from files.
virtual unsigned int subSequenceSize() const =0
Size of the sub-sequence of vectors. See template specialization.
~MonteCarloSG()
Destructor.
unsigned int vectorSizeLocal() const
Local dimension (size) of the vector space.
A templated class for synchronizing the calls of vector-valued functions.
unsigned int subPeriod() const
Sub-period of the realization. Access to protected attribute m_subPeriod.
This class provides options for the Monte Carlo sequence generator if no input file is available...
const BaseVectorRealizer< V, M > & realizer() const
Finds a realization (sample) of the PDF of this vector RV; access to private attribute m_realizer...
virtual void unifiedWriteContents(const std::string &fileName, const std::string &fileType) const =0
Writes info of the unified sequence to a file. See template specialization.
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
double MiscGetEllapsedSeconds(struct timeval *timeval0)
void setName(const std::string &newName)
Changes the name of the sequence of vectors.
virtual void getPositionValues(unsigned int posId, V &vec) const =0
Gets the values of the sequence at position posId and stores them at vec. See template specialization...
void generateSequence(BaseVectorSequence< P_V, P_M > &workingPSeq, BaseVectorSequence< Q_V, Q_M > &workingQSeq)
Generates the QoI (output) sequence, it calls internGenerateSequence().
void actualReadSequence(const BaseVectorRV< P_V, P_M > ¶mRv, const std::string &dataInputFileName, const std::string &dataInputFileType, BaseVectorSequence< P_V, P_M > &workingPSeq, BaseVectorSequence< Q_V, Q_M > &workingQSeq, unsigned int seqSize)
Reads the sequence.
#define UQ_MOC_SG_FILENAME_FOR_NO_FILE
virtual void realization(V &nextValues) const =0
Performs a realization (sample) from a probability density function. See template specialization...