26 #include <queso/ScalarSequence.h>
34 unsigned int subSequenceSize,
35 const std::string& name)
39 m_seq (subSequenceSize,0.),
41 m_unifiedMinPlain (NULL),
43 m_unifiedMaxPlain (NULL),
44 m_subMeanPlain (NULL),
45 m_unifiedMeanPlain (NULL),
46 m_subMedianPlain (NULL),
47 m_unifiedMedianPlain (NULL),
48 m_subSampleVariancePlain (NULL),
49 m_unifiedSampleVariancePlain(NULL)
56 deleteStoredScalars();
71 if (posId >= this->subSequenceSize()) {
72 std::cerr <<
"In ScalarSequence<T>::operator[]() const"
73 <<
": posId = " << posId
74 <<
", this->subSequenceSize() = " << this->subSequenceSize()
86 if (posId >= this->subSequenceSize()) {
87 std::cerr <<
"In ScalarSequence<T>::operator[]()"
88 <<
": posId = " << posId
89 <<
", this->subSequenceSize() = " << this->subSequenceSize()
94 deleteStoredScalars();
125 unsigned int numPos = this->subSequenceSize();
127 this->resetValues(0,numPos);
128 this->resizeSequence(0);
145 if (m_env.numSubEnvironments() == 1) {
146 return this->subSequenceSize();
151 unsigned int unifiedNumSamples = 0;
152 if (useOnlyInter0Comm) {
153 if (m_env.inter0Rank() >= 0) {
154 unsigned int subNumSamples = this->subSequenceSize();
155 m_env.inter0Comm().template Allreduce<unsigned int>(&subNumSamples, &unifiedNumSamples, (int) 1,
RawValue_MPI_SUM,
156 "ScalarSequence<T>::unifiedSequenceSize()",
157 "failed MPI.Allreduce() for unifiedSequenceSize()");
161 unifiedNumSamples = this->subSequenceSize();
168 return unifiedNumSamples;
175 if (newSequenceSize != this->subSequenceSize()) {
176 m_seq.resize(newSequenceSize,0.);
177 std::vector<T>(m_seq).swap(m_seq);
178 deleteStoredScalars();
188 if (this->subSequenceSize() == 0)
return;
190 bool bRC = ((initialPos < this->subSequenceSize()) &&
192 ((initialPos+numPos) <= this->subSequenceSize()));
195 for (
unsigned int j = 0; j < numPos; ++j) {
196 m_seq[initialPos+j] = 0.;
199 deleteStoredScalars();
208 if (this->subSequenceSize() == 0)
return;
210 bool bRC = ((initialPos < this->subSequenceSize()) &&
212 ((initialPos+numPos) <= this->subSequenceSize()));
216 if (initialPos < this->subSequenceSize()) std::advance(posIteratorBegin,initialPos);
217 else posIteratorBegin = m_seq.end();
219 unsigned int posEnd = initialPos + numPos - 1;
221 if (posEnd < this->subSequenceSize()) std::advance(posIteratorEnd,posEnd);
222 else posIteratorEnd = m_seq.end();
224 unsigned int oldSequenceSize = this->subSequenceSize();
225 m_seq.erase(posIteratorBegin,posIteratorEnd);
226 queso_require_equal_to_msg((oldSequenceSize - numPos), this->subSequenceSize(),
"(oldSequenceSize - numPos) != this->subSequenceSize()");
228 deleteStoredScalars();
236 bool useOnlyInter0Comm,
237 std::vector<T>& outputVec)
const
245 if (useOnlyInter0Comm) {
246 if (m_env.inter0Rank() >= 0) {
247 int auxSubSize = (int) this->subSequenceSize();
248 unsigned int auxUnifiedSize = this->unifiedSequenceSize(useOnlyInter0Comm);
249 outputVec.resize(auxUnifiedSize,0.);
254 std::vector<int> recvcnts(m_env.inter0Comm().NumProc(),0);
255 m_env.inter0Comm().template Gather<int>(&auxSubSize, 1, &recvcnts[0], (int) 1, 0,
256 "ScalarSequence<T>::getUnifiedContentsAtProc0Only()",
257 "failed MPI.Gather()");
258 if (m_env.inter0Rank() == 0) {
263 std::vector<int> displs(m_env.inter0Comm().NumProc(),0);
264 for (
unsigned int r = 1; r < (
unsigned int) m_env.inter0Comm().NumProc(); ++r) {
265 displs[r] = displs[r-1] + recvcnts[r-1];
268 #if 0 // for debug only
269 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
270 for (
unsigned int r = 0; r < (
unsigned int) m_env.inter0Comm().NumProc(); ++r) {
271 *m_env.subDisplayFile() <<
" auxSubSize = " << auxSubSize
272 <<
", recvcnts[" << r <<
"] = " << recvcnts[r]
273 <<
", displs[" << r <<
"] = " << displs[r]
274 <<
", m_seq.size() = " << m_seq.size()
275 <<
", outputVec.size() = " << outputVec.size()
278 for (
unsigned int i = 0; i < m_seq.size(); ++i) {
279 *m_env.subDisplayFile() <<
" (before gatherv) m_seq[" << i <<
"]= " << m_seq[i]
285 m_env.inter0Comm().template Gatherv<double>(&m_seq[0], auxSubSize,
286 &outputVec[0], (
int *) &recvcnts[0], (
int *) &displs[0], 0,
287 "ScalarSequence<T>::getUnifiedContentsAtProc0Only()",
288 "failed MPI.Gatherv()");
290 #if 0 // for debug only
291 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
292 for (
unsigned int i = 0; i < m_seq.size(); ++i) {
293 *m_env.subDisplayFile() <<
" (after gatherv) m_seq[" << i <<
"]= " << m_seq[i]
296 for (
unsigned int i = 0; i < outputVec.size(); ++i) {
297 *m_env.subDisplayFile() <<
" (after gatherv) outputVec[" << i <<
"]= " << outputVec[i]
303 #if 0 // for debug only
304 if (m_env.inter0Rank() == 0) {
305 for (
unsigned int i = 0; i < auxSubSize; ++i) {
306 outputVec[i] = m_seq[i];
309 "ScalarSequence<T>::getUnifiedContentsAtProc0Only(1)",
310 "failed MPI.Gatherv()");
314 "ScalarSequence<T>::getUnifiedContentsAtProc0Only(2)",
315 "failed MPI.Gatherv()");
317 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
318 for (
unsigned int i = 0; i < m_seq.size(); ++i) {
319 *m_env.subDisplayFile() <<
" (after 2nd gatherv) m_seq[" << i <<
"]= " << m_seq[i]
322 for (
unsigned int i = 0; i < outputVec.size(); ++i) {
323 *m_env.subDisplayFile() <<
" (after 2nd gatherv) outputVec[" << i <<
"]= " << outputVec[i]
345 if (m_subMinPlain == NULL) {
346 m_subMinPlain =
new T(0.);
347 if (m_subMaxPlain == NULL) m_subMaxPlain =
new T(0.);
348 subMinMaxExtra(0,this->subSequenceSize(),*m_subMinPlain,*m_subMaxPlain);
351 return *m_subMinPlain;
358 if (m_unifiedMinPlain == NULL) {
359 m_unifiedMinPlain =
new T(0.);
360 if (m_unifiedMaxPlain == NULL) m_unifiedMaxPlain =
new T(0.);
361 unifiedMinMaxExtra(useOnlyInter0Comm,0,this->subSequenceSize(),*m_unifiedMinPlain,*m_unifiedMaxPlain);
364 return *m_unifiedMinPlain;
371 if (m_subMaxPlain == NULL) {
372 if (m_subMinPlain == NULL) m_subMinPlain =
new T(0.);
373 m_subMaxPlain =
new T(0.);
374 subMinMaxExtra(0,this->subSequenceSize(),*m_subMinPlain,*m_subMaxPlain);
377 return *m_subMaxPlain;
384 if (m_unifiedMaxPlain == NULL) {
385 if (m_unifiedMinPlain == NULL) m_unifiedMinPlain =
new T(0.);
386 m_unifiedMaxPlain =
new T(0.);
387 unifiedMinMaxExtra(useOnlyInter0Comm,0,this->subSequenceSize(),*m_unifiedMinPlain,*m_unifiedMaxPlain);
390 return *m_unifiedMaxPlain;
397 if (m_subMeanPlain == NULL) {
398 m_subMeanPlain =
new T(0.);
399 *m_subMeanPlain = subMeanExtra(0,subSequenceSize());
402 return *m_subMeanPlain;
409 if (m_unifiedMeanPlain == NULL) {
410 m_unifiedMeanPlain =
new T(0.);
411 *m_unifiedMeanPlain = unifiedMeanExtra(useOnlyInter0Comm,0,subSequenceSize());
414 return *m_unifiedMeanPlain;
421 if (m_subMedianPlain == NULL) {
422 m_subMedianPlain =
new T(0.);
423 *m_subMedianPlain = subMedianExtra(0,subSequenceSize());
426 return *m_subMedianPlain;
433 if (m_unifiedMedianPlain == NULL) {
434 m_unifiedMedianPlain =
new T(0.);
435 *m_unifiedMedianPlain = unifiedMedianExtra(useOnlyInter0Comm,0,subSequenceSize());
438 return *m_unifiedMedianPlain;
445 if (m_subSampleVariancePlain == NULL) {
446 m_subSampleVariancePlain =
new T(0.);
447 *m_subSampleVariancePlain = subSampleVarianceExtra(0,subSequenceSize(),subMeanPlain());
450 return *m_subSampleVariancePlain;
457 if (m_unifiedSampleVariancePlain == NULL) {
458 m_unifiedSampleVariancePlain =
new T(0.);
459 *m_unifiedSampleVariancePlain = unifiedSampleVarianceExtra(useOnlyInter0Comm,0,subSequenceSize(),unifiedMeanPlain(useOnlyInter0Comm));
462 return *m_unifiedSampleVariancePlain;
470 delete m_subMinPlain;
471 m_subMinPlain = NULL;
473 if (m_unifiedMinPlain) {
474 delete m_unifiedMinPlain;
475 m_unifiedMinPlain = NULL;
478 delete m_subMaxPlain;
479 m_subMaxPlain = NULL;
481 if (m_unifiedMaxPlain) {
482 delete m_unifiedMaxPlain;
483 m_unifiedMaxPlain = NULL;
485 if (m_subMeanPlain) {
486 delete m_subMeanPlain;
487 m_subMeanPlain = NULL;
489 if (m_unifiedMeanPlain) {
490 delete m_unifiedMeanPlain;
491 m_unifiedMeanPlain = NULL;
493 if (m_subMedianPlain) {
494 delete m_subMedianPlain;
495 m_subMedianPlain = NULL;
497 if (m_unifiedMedianPlain) {
498 delete m_unifiedMedianPlain;
499 m_unifiedMedianPlain = NULL;
501 if (m_subSampleVariancePlain) {
502 delete m_subSampleVariancePlain;
503 m_subSampleVariancePlain = NULL;
505 if (m_unifiedSampleVariancePlain) {
506 delete m_unifiedSampleVariancePlain;
507 m_unifiedSampleVariancePlain = NULL;
517 unsigned int maxJ = this->subSequenceSize();
518 if (meanValue == 0.) {
519 for (
unsigned int j = 0; j < maxJ; ++j) {
520 m_seq[j] = m_env.rngObject()->gaussianSample(stdDev);
524 for (
unsigned int j = 0; j < maxJ; ++j) {
525 m_seq[j] = meanValue + m_env.rngObject()->gaussianSample(stdDev);
529 deleteStoredScalars();
538 unsigned int maxJ = this->subSequenceSize();
541 for (
unsigned int j = 0; j < maxJ; ++j) {
542 m_seq[j] = m_env.rngObject()->uniformSample();
546 for (
unsigned int j = 0; j < maxJ; ++j) {
547 m_seq[j] = b*m_env.rngObject()->uniformSample();
553 for (
unsigned int j = 0; j < maxJ; ++j) {
554 m_seq[j] = a + m_env.rngObject()->uniformSample();
558 for (
unsigned int j = 0; j < maxJ; ++j) {
559 m_seq[j] = a + (b-a)*m_env.rngObject()->uniformSample();
564 deleteStoredScalars();
572 unsigned int numEvaluationPoints,
575 std::vector<T>& cdfValues)
const
579 std::vector<T> centers(numEvaluationPoints,0.);
580 std::vector<unsigned int> bins (numEvaluationPoints,0);
583 this->subSequenceSize(),
592 minDomainValue = centers[0];
593 maxDomainValue = centers[centers.size()-1];
595 unsigned int sumOfBins = 0;
596 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
597 sumOfBins += bins[i];
601 cdfValues.resize(numEvaluationPoints);
602 unsigned int partialSum = 0;
603 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
604 partialSum += bins[i];
605 cdfValues[i] = ((T) partialSum)/((T) sumOfBins);
614 bool useOnlyInter0Comm,
615 unsigned int numEvaluationPoints,
616 T& unifiedMinDomainValue,
617 T& unifiedMaxDomainValue,
618 std::vector<T>& unifiedCdfValues)
const
620 if (m_env.numSubEnvironments() == 1) {
621 return this->subUniformlySampledCdf(numEvaluationPoints,
622 unifiedMinDomainValue,
623 unifiedMaxDomainValue,
630 if (useOnlyInter0Comm) {
631 if (m_env.inter0Rank() >= 0) {
632 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
633 *m_env.subDisplayFile() <<
"Entering ScalarSequence<T>::unifiedUniformlySampledCdf()"
637 T unifiedTmpMinValue;
638 T unifiedTmpMaxValue;
639 std::vector<T> unifiedCenters(numEvaluationPoints,0.);
640 std::vector<unsigned int> unifiedBins (numEvaluationPoints,0);
642 this->unifiedMinMaxExtra(useOnlyInter0Comm,
644 this->subSequenceSize(),
647 this->unifiedHistogram(useOnlyInter0Comm,
654 unifiedMinDomainValue = unifiedCenters[0];
655 unifiedMaxDomainValue = unifiedCenters[unifiedCenters.size()-1];
657 unsigned int unifiedTotalSumOfBins = 0;
658 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
659 unifiedTotalSumOfBins += unifiedBins[i];
662 std::vector<unsigned int> unifiedPartialSumsOfBins(numEvaluationPoints,0);
663 unifiedPartialSumsOfBins[0] = unifiedBins[0];
664 for (
unsigned int i = 1; i < numEvaluationPoints; ++i) {
665 unifiedPartialSumsOfBins[i] = unifiedPartialSumsOfBins[i-1] + unifiedBins[i];
668 unifiedCdfValues.clear();
669 unifiedCdfValues.resize(numEvaluationPoints);
670 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
671 unifiedCdfValues[i] = ((T) unifiedPartialSumsOfBins[i])/((T) unifiedTotalSumOfBins);
674 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
675 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
676 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedUniformlySampledCdf()"
678 <<
", unifiedTmpMinValue = " << unifiedTmpMinValue
679 <<
", unifiedTmpMaxValue = " << unifiedTmpMaxValue
680 <<
", unifiedBins = " << unifiedBins[i]
681 <<
", unifiedCdfValue = " << unifiedCdfValues[i]
682 <<
", unifiedPartialSumsOfBins = " << unifiedPartialSumsOfBins[i]
683 <<
", unifiedTotalSumOfBins = " << unifiedTotalSumOfBins
688 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
689 *m_env.subDisplayFile() <<
"Leaving ScalarSequence<T>::unifiedUniformlySampledCdf()"
695 this->subUniformlySampledCdf(numEvaluationPoints,
696 unifiedMinDomainValue,
697 unifiedMaxDomainValue,
713 unsigned int numEvaluationPoints,
715 std::vector<T>& cdfValues)
const
719 std::vector<unsigned int> bins(numEvaluationPoints,0);
722 this->subSequenceSize(),
731 unsigned int sumOfBins = 0;
732 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
733 sumOfBins += bins[i];
737 cdfValues.resize(numEvaluationPoints);
738 unsigned int partialSum = 0;
739 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
740 partialSum += bins[i];
741 cdfValues[i] = ((T) partialSum)/((T) sumOfBins);
750 unsigned int numEvaluationPoints,
751 std::vector<T>& gridValues,
752 std::vector<T>& cdfValues)
const
756 std::vector<unsigned int> bins(numEvaluationPoints,0);
757 gridValues.resize (numEvaluationPoints,0.);
758 cdfValues.resize (numEvaluationPoints,0.);
761 this->subSequenceSize(),
765 if (tmpMinValue == tmpMaxValue) {
766 if (tmpMinValue < -1.e-12) {
767 tmpMinValue += tmpMinValue*(1.e-8);
769 else if (tmpMinValue > 1.e-12) {
770 tmpMinValue -= tmpMinValue*(1.e-8);
773 tmpMinValue = 1.e-12;
777 subWeightHistogram(0,
783 unsigned int sumOfBins = 0;
784 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
785 sumOfBins += bins[i];
789 cdfValues.resize(numEvaluationPoints);
790 unsigned int partialSum = 0;
791 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
792 partialSum += bins[i];
793 cdfValues[i] = ((T) partialSum)/((T) sumOfBins);
802 unsigned int numEvaluationPoints,
804 std::vector<T>& cdfValues)
const
808 std::vector<unsigned int> bins(numEvaluationPoints,0);
811 this->subSequenceSize(),
814 subWeightHistogram(0,
820 unsigned int sumOfBins = 0;
821 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
822 sumOfBins += bins[i];
826 cdfValues.resize(numEvaluationPoints);
827 unsigned int partialSum = 0;
828 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
829 partialSum += bins[i];
830 cdfValues[i] = ((T) partialSum)/((T) sumOfBins);
839 unsigned int initialPos,
840 unsigned int numPos)
const
842 if (this->subSequenceSize() == 0)
return 0.;
844 bool bRC = ((initialPos < this->subSequenceSize()) &&
846 ((initialPos+numPos) <= this->subSequenceSize()));
848 std::cerr <<
"In ScalarSequence<T>::subMeanExtra()"
849 <<
": ERROR at fullRank " << m_env.fullRank()
850 <<
", initialPos = " << initialPos
851 <<
", numPos = " << numPos
852 <<
", this->subSequenceSize() = " << this->subSequenceSize()
854 if (m_env.subDisplayFile()) {
855 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::subMeanExtra()"
856 <<
": ERROR at fullRank " << m_env.fullRank()
857 <<
", initialPos = " << initialPos
858 <<
", numPos = " << numPos
859 <<
", this->subSequenceSize() = " << this->subSequenceSize()
865 unsigned int finalPosPlus1 = initialPos + numPos;
867 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
871 return tmpSum/(T) numPos;
877 bool useOnlyInter0Comm,
878 unsigned int initialPos,
879 unsigned int numPos)
const
881 if (m_env.numSubEnvironments() == 1) {
882 return this->subMeanExtra(initialPos,
888 T unifiedMeanValue = 0.;
889 if (useOnlyInter0Comm) {
890 if (m_env.inter0Rank() >= 0) {
891 bool bRC = ((initialPos < this->subSequenceSize()) &&
893 ((initialPos+numPos) <= this->subSequenceSize()));
896 unsigned int finalPosPlus1 = initialPos + numPos;
898 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
899 localSum += m_seq[j];
902 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
903 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMeanExtra()"
904 <<
": initialPos = " << initialPos
905 <<
", numPos = " << numPos
906 <<
", before MPI.Allreduce"
912 unsigned int unifiedNumPos = 0;
913 m_env.inter0Comm().template Allreduce<unsigned int>(&numPos, &unifiedNumPos, (int) 1,
RawValue_MPI_SUM,
914 "ScalarSequence<T>::unifiedMeanExtra()",
915 "failed MPI.Allreduce() for numPos");
917 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
918 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMeanExtra()"
919 <<
": numPos = " << numPos
920 <<
", unifiedNumPos = " << unifiedNumPos
924 m_env.inter0Comm().template Allreduce<double>(&localSum, &unifiedMeanValue, (int) 1,
RawValue_MPI_SUM,
925 "ScalarSequence<T>::unifiedMeanExtra()",
926 "failed MPI.Allreduce() for sum");
928 unifiedMeanValue /= ((T) unifiedNumPos);
930 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
931 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMeanExtra()"
932 <<
": localSum = " << localSum
933 <<
", unifiedMeanValue = " << unifiedMeanValue
939 this->subMeanExtra(initialPos,
949 return unifiedMeanValue;
955 unsigned int initialPos,
956 unsigned int numPos)
const
958 if (this->subSequenceSize() == 0)
return 0.;
960 bool bRC = ((initialPos < this->subSequenceSize()) &&
962 ((initialPos+numPos) <= this->subSequenceSize()));
964 std::cerr <<
"In ScalarSequence<T>::subMedianExtra()"
965 <<
": ERROR at fullRank " << m_env.fullRank()
966 <<
", initialPos = " << initialPos
967 <<
", numPos = " << numPos
968 <<
", this->subSequenceSize() = " << this->subSequenceSize()
970 if (m_env.subDisplayFile()) {
971 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::subMedianExtra()"
972 <<
": ERROR at fullRank " << m_env.fullRank()
973 <<
", initialPos = " << initialPos
974 <<
", numPos = " << numPos
975 <<
", this->subSequenceSize() = " << this->subSequenceSize()
983 this->extractScalarSeq(initialPos,
989 unsigned int tmpPos = (
unsigned int) (0.5 * (
double) numPos);
990 T resultValue = sortedSequence[tmpPos];
998 bool useOnlyInter0Comm,
999 unsigned int initialPos,
1000 unsigned int numPos)
const
1002 if (m_env.numSubEnvironments() == 1) {
1003 return this->subMedianExtra(initialPos,
1009 T unifiedMedianValue = 0.;
1010 if (useOnlyInter0Comm) {
1011 if (m_env.inter0Rank() >= 0) {
1012 bool bRC = ((initialPos < this->subSequenceSize()) &&
1014 ((initialPos+numPos) <= this->subSequenceSize()));
1018 this->unifiedSort(useOnlyInter0Comm,
1020 unifiedSortedSequence);
1021 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
1022 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMedianExtra()"
1023 <<
", unifiedMedianValue = " << unifiedMedianValue
1029 this->subMedianExtra(initialPos,
1039 return unifiedMedianValue;
1045 unsigned int initialPos,
1046 unsigned int numPos,
1047 const T& meanValue)
const
1049 if (this->subSequenceSize() == 0)
return 0.;
1051 bool bRC = ((initialPos < this->subSequenceSize()) &&
1053 ((initialPos+numPos) <= this->subSequenceSize()));
1056 unsigned int finalPosPlus1 = initialPos + numPos;
1059 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1060 diff = m_seq[j] - meanValue;
1061 samValue += diff*diff;
1064 samValue /= (((T) numPos) - 1.);
1072 bool useOnlyInter0Comm,
1073 unsigned int initialPos,
1074 unsigned int numPos,
1075 const T& unifiedMeanValue)
const
1077 if (m_env.numSubEnvironments() == 1) {
1078 return this->subSampleVarianceExtra(initialPos,
1085 T unifiedSamValue = 0.;
1086 if (useOnlyInter0Comm) {
1087 if (m_env.inter0Rank() >= 0) {
1088 bool bRC = ((initialPos < this->subSequenceSize()) &&
1090 ((initialPos+numPos) <= this->subSequenceSize()));
1093 unsigned int finalPosPlus1 = initialPos + numPos;
1095 T localSamValue = 0.;
1096 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1097 diff = m_seq[j] - unifiedMeanValue;
1098 localSamValue += diff*diff;
1101 unsigned int unifiedNumPos = 0;
1102 m_env.inter0Comm().template Allreduce<unsigned int>(&numPos, &unifiedNumPos, (int) 1,
RawValue_MPI_SUM,
1103 "ScalarSequence<T>::unifiedSampleVarianceExtra()",
1104 "failed MPI.Allreduce() for numPos");
1106 m_env.inter0Comm().template Allreduce<double>(&localSamValue, &unifiedSamValue, (int) 1,
RawValue_MPI_SUM,
1107 "ScalarSequence<T>::unifiedSampleVarianceExtra()",
1108 "failed MPI.Allreduce() for samValue");
1110 unifiedSamValue /= (((T) unifiedNumPos) - 1.);
1114 this->subSampleVarianceExtra(initialPos,
1125 return unifiedSamValue;
1131 unsigned int initialPos,
1132 unsigned int numPos,
1133 const T& meanValue)
const
1135 if (this->subSequenceSize() == 0)
return 0.;
1137 bool bRC = ((initialPos < this->subSequenceSize()) &&
1139 ((initialPos+numPos) <= this->subSequenceSize()));
1142 unsigned int finalPosPlus1 = initialPos + numPos;
1145 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1146 diff = m_seq[j] - meanValue;
1147 stdValue += diff*diff;
1150 stdValue /= (((T) numPos) - 1.);
1151 stdValue = sqrt(stdValue);
1159 bool useOnlyInter0Comm,
1160 unsigned int initialPos,
1161 unsigned int numPos,
1162 const T& unifiedMeanValue)
const
1164 if (m_env.numSubEnvironments() == 1) {
1165 return this->subSampleStd(initialPos,
1172 T unifiedStdValue = 0.;
1173 if (useOnlyInter0Comm) {
1174 if (m_env.inter0Rank() >= 0) {
1175 bool bRC = ((initialPos < this->subSequenceSize()) &&
1177 ((initialPos+numPos) <= this->subSequenceSize()));
1180 unsigned int finalPosPlus1 = initialPos + numPos;
1182 T localStdValue = 0.;
1183 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1184 diff = m_seq[j] - unifiedMeanValue;
1185 localStdValue += diff*diff;
1188 unsigned int unifiedNumPos = 0;
1189 m_env.inter0Comm().template Allreduce<unsigned int>(&numPos, &unifiedNumPos, (int) 1,
RawValue_MPI_SUM,
1190 "ScalarSequence<T>::unifiedSampleStd()",
1191 "failed MPI.Allreduce() for numPos");
1193 m_env.inter0Comm().template Allreduce<double>(&localStdValue, &unifiedStdValue, (int) 1,
RawValue_MPI_SUM,
1194 "ScalarSequence<T>::unifiedSampleStd()",
1195 "failed MPI.Allreduce() for stdValue");
1197 unifiedStdValue /= (((T) unifiedNumPos) - 1.);
1198 unifiedStdValue = sqrt(unifiedStdValue);
1202 this->subSampleStd(initialPos,
1213 return unifiedStdValue;
1219 unsigned int initialPos,
1220 unsigned int numPos,
1221 const T& meanValue)
const
1223 if (this->subSequenceSize() == 0)
return 0.;
1225 bool bRC = ((initialPos < this->subSequenceSize()) &&
1227 ((initialPos+numPos) <= this->subSequenceSize()));
1230 unsigned int finalPosPlus1 = initialPos + numPos;
1233 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1234 diff = m_seq[j] - meanValue;
1235 popValue += diff*diff;
1238 popValue /= (T) numPos;
1246 bool useOnlyInter0Comm,
1247 unsigned int initialPos,
1248 unsigned int numPos,
1249 const T& unifiedMeanValue)
const
1251 if (m_env.numSubEnvironments() == 1) {
1252 return this->subPopulationVariance(initialPos,
1259 T unifiedPopValue = 0.;
1260 if (useOnlyInter0Comm) {
1261 if (m_env.inter0Rank() >= 0) {
1262 bool bRC = ((initialPos < this->subSequenceSize()) &&
1264 ((initialPos+numPos) <= this->subSequenceSize()));
1267 unsigned int finalPosPlus1 = initialPos + numPos;
1269 T localPopValue = 0.;
1270 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1271 diff = m_seq[j] - unifiedMeanValue;
1272 localPopValue += diff*diff;
1275 unsigned int unifiedNumPos = 0;
1276 m_env.inter0Comm().template Allreduce<unsigned int>(&numPos, &unifiedNumPos, (int) 1,
RawValue_MPI_SUM,
1277 "ScalarSequence<T>::unifiedPopulationVariance()",
1278 "failed MPI.Allreduce() for numPos");
1280 m_env.inter0Comm().template Allreduce<double>(&localPopValue, &unifiedPopValue, (int) 1,
RawValue_MPI_SUM,
1281 "ScalarSequence<T>::unifiedPopulationVariance()",
1282 "failed MPI.Allreduce() for popValue");
1284 unifiedPopValue /= ((T) unifiedNumPos);
1288 this->subPopulationVariance(initialPos,
1299 return unifiedPopValue;
1305 unsigned int initialPos,
1306 unsigned int numPos,
1308 unsigned int lag)
const
1310 bool bRC = ((initialPos < this->subSequenceSize()) &&
1312 ((initialPos+numPos) <= this->subSequenceSize()) &&
1316 unsigned int loopSize = numPos - lag;
1317 unsigned int finalPosPlus1 = initialPos + loopSize;
1321 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1322 diff1 = m_seq[j ] - meanValue;
1323 diff2 = m_seq[j+lag] - meanValue;
1324 covValue += diff1*diff2;
1327 covValue /= (T) loopSize;
1335 unsigned int initialPos,
1336 unsigned int numPos,
1337 unsigned int lag)
const
1339 bool bRC = ((initialPos < this->subSequenceSize()) &&
1341 ((initialPos+numPos) <= this->subSequenceSize()) &&
1345 T meanValue = this->subMeanExtra(initialPos,
1348 T covValueZero = this->autoCovariance(initialPos,
1353 T corrValue = this->autoCovariance(initialPos,
1358 return corrValue/covValueZero;
1364 unsigned int initialPos,
1365 unsigned int numPos,
1366 unsigned int maxLag,
1367 std::vector<T>& autoCorrs)
const
1369 double tmp = log((
double) numPos)/log(2.);
1370 double fractionalPart = tmp - ((double) ((
unsigned int) tmp));
1371 if (fractionalPart > 0.) tmp += (1. - fractionalPart);
1372 unsigned int fftSize = (
unsigned int) std::pow(2.,tmp+1);
1374 std::vector<double> rawDataVec(numPos,0.);
1375 std::vector<std::complex<double> > resultData(0,std::complex<double>(0.,0.));
1379 this->extractRawData(initialPos,
1383 T meanValue = this->subMeanExtra(initialPos,
1385 for (
unsigned int j = 0; j < numPos; ++j) {
1386 rawDataVec[j] -= meanValue;
1389 rawDataVec.resize(fftSize,0.);
1399 fftObj.
forward(rawDataVec,fftSize,resultData);
1402 for (
unsigned int j = 0; j < fftSize; ++j) {
1403 rawDataVec[j] = std::norm(resultData[j]);
1413 fftObj.
inverse(rawDataVec,fftSize,resultData);
1421 autoCorrs.resize(maxLag+1,0.);
1422 for (
unsigned int j = 0; j < autoCorrs.size(); ++j) {
1423 double ratio = ((double) j)/((double) (numPos-1));
1424 autoCorrs[j] = ( resultData[j].real()/resultData[0].real() )*(1.-ratio);
1433 unsigned int initialPos,
1434 unsigned int numPos,
1435 unsigned int numSum,
1436 T& autoCorrsSum)
const
1445 double tmp = log((
double) numPos)/log(2.);
1446 double fractionalPart = tmp - ((double) ((
unsigned int) tmp));
1447 if (fractionalPart > 0.) tmp += (1. - fractionalPart);
1448 unsigned int fftSize = (
unsigned int) std::pow(2.,tmp+1);
1450 std::vector<double> rawDataVec(numPos,0.);
1451 std::vector<std::complex<double> > resultData(0,std::complex<double>(0.,0.));
1455 this->extractRawData(initialPos,
1459 T meanValue = this->subMeanExtra(initialPos,
1461 for (
unsigned int j = 0; j < numPos; ++j) {
1462 rawDataVec[j] -= meanValue;
1464 rawDataVec.resize(fftSize,0.);
1474 fftObj.
forward(rawDataVec,fftSize,resultData);
1477 for (
unsigned int j = 0; j < fftSize; ++j) {
1478 rawDataVec[j] = std::norm(resultData[j]);
1480 fftObj.
inverse(rawDataVec,fftSize,resultData);
1491 for (
unsigned int j = 0; j < numSum; ++j) {
1492 double ratio = ((double) j)/((double) (numPos-1));
1493 autoCorrsSum += ( resultData[j].real()/resultData[0].real() )*(1.-ratio);
1502 unsigned int initialPos,
1503 unsigned int numPos,
1510 std::advance(pos1,initialPos);
1513 std::advance(pos2,initialPos+numPos);
1515 if ((initialPos+numPos) == this->subSequenceSize()) {
1520 pos = std::min_element(pos1, pos2);
1522 pos = std::max_element(pos1, pos2);
1531 bool useOnlyInter0Comm,
1532 unsigned int initialPos,
1533 unsigned int numPos,
1535 T& unifiedMaxValue)
const
1537 if (m_env.numSubEnvironments() == 1) {
1538 return this->subMinMaxExtra(initialPos,
1546 if (useOnlyInter0Comm) {
1547 if (m_env.inter0Rank() >= 0) {
1551 this->subMinMaxExtra(initialPos,
1557 std::vector<double> sendBuf(1,0.);
1558 for (
unsigned int i = 0; i < sendBuf.size(); ++i) {
1559 sendBuf[i] = minValue;
1561 m_env.inter0Comm().template Allreduce<double>(&sendBuf[0], &unifiedMinValue, (int) sendBuf.size(),
RawValue_MPI_MIN,
1562 "ScalarSequence<T>::unifiedMinMaxExtra()",
1563 "failed MPI.Allreduce() for min");
1566 for (
unsigned int i = 0; i < sendBuf.size(); ++i) {
1567 sendBuf[i] = maxValue;
1569 m_env.inter0Comm().template Allreduce<double>(&sendBuf[0], &unifiedMaxValue, (int) sendBuf.size(),
RawValue_MPI_MAX,
1570 "ScalarSequence<T>::unifiedMinMaxExtra()",
1571 "failed MPI.Allreduce() for max");
1573 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
1574 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMinMaxExtra()"
1575 <<
": localMinValue = " << minValue
1576 <<
", localMaxValue = " << maxValue
1577 <<
", unifiedMinValue = " << unifiedMinValue
1578 <<
", unifiedMaxValue = " << unifiedMaxValue
1584 this->subMinMaxExtra(initialPos,
1602 unsigned int initialPos,
1603 const T& minHorizontalValue,
1604 const T& maxHorizontalValue,
1605 std::vector<T>& centers,
1606 std::vector<unsigned int>& bins)
const
1614 for (
unsigned int j = 0; j < bins.size(); ++j) {
1619 double horizontalDelta = (maxHorizontalValue - minHorizontalValue)/(((
double) bins.size()) - 2.);
1621 double minCenter = minHorizontalValue - horizontalDelta/2.;
1622 double maxCenter = maxHorizontalValue + horizontalDelta/2.;
1623 for (
unsigned int j = 0; j < centers.size(); ++j) {
1624 double factor = ((double) j)/(((double) centers.size()) - 1.);
1625 centers[j] = (1. - factor) * minCenter + factor * maxCenter;
1628 unsigned int dataSize = this->subSequenceSize();
1629 for (
unsigned int j = 0; j < dataSize; ++j) {
1630 double value = m_seq[j];
1631 if (value < minHorizontalValue) {
1634 else if (value >= maxHorizontalValue) {
1635 bins[bins.size()-1]++;
1638 unsigned int index = 1 + (
unsigned int) ((value - minHorizontalValue)/horizontalDelta);
1649 bool useOnlyInter0Comm,
1650 unsigned int initialPos,
1651 const T& unifiedMinHorizontalValue,
1652 const T& unifiedMaxHorizontalValue,
1653 std::vector<T>& unifiedCenters,
1654 std::vector<unsigned int>& unifiedBins)
const
1656 if (m_env.numSubEnvironments() == 1) {
1657 return this->subHistogram(initialPos,
1658 unifiedMinHorizontalValue,
1659 unifiedMaxHorizontalValue,
1666 if (useOnlyInter0Comm) {
1667 if (m_env.inter0Rank() >= 0) {
1668 queso_require_equal_to_msg(unifiedCenters.size(), unifiedBins.size(),
"vectors 'unifiedCenters' and 'unifiedBins' have different sizes");
1672 for (
unsigned int j = 0; j < unifiedBins.size(); ++j) {
1673 unifiedCenters[j] = 0.;
1677 double unifiedHorizontalDelta = (unifiedMaxHorizontalValue - unifiedMinHorizontalValue)/(((
double) unifiedBins.size()) - 2.);
1679 double unifiedMinCenter = unifiedMinHorizontalValue - unifiedHorizontalDelta/2.;
1680 double unifiedMaxCenter = unifiedMaxHorizontalValue + unifiedHorizontalDelta/2.;
1681 for (
unsigned int j = 0; j < unifiedCenters.size(); ++j) {
1682 double factor = ((double) j)/(((double) unifiedCenters.size()) - 1.);
1683 unifiedCenters[j] = (1. - factor) * unifiedMinCenter + factor * unifiedMaxCenter;
1686 std::vector<unsigned int> localBins(unifiedBins.size(),0);
1687 unsigned int dataSize = this->subSequenceSize();
1688 for (
unsigned int j = 0; j < dataSize; ++j) {
1689 double value = m_seq[j];
1690 if (value < unifiedMinHorizontalValue) {
1693 else if (value >= unifiedMaxHorizontalValue) {
1694 localBins[localBins.size()-1]++;
1697 unsigned int index = 1 + (
unsigned int) ((value - unifiedMinHorizontalValue)/unifiedHorizontalDelta);
1702 m_env.inter0Comm().template Allreduce<unsigned int>(&localBins[0], &unifiedBins[0], (int) localBins.size(),
RawValue_MPI_SUM,
1703 "ScalarSequence<T>::unifiedHistogram()",
1704 "failed MPI.Allreduce() for bins");
1706 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
1707 for (
unsigned int i = 0; i < unifiedCenters.size(); ++i) {
1708 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedHistogram()"
1710 <<
", unifiedMinHorizontalValue = " << unifiedMinHorizontalValue
1711 <<
", unifiedMaxHorizontalValue = " << unifiedMaxHorizontalValue
1712 <<
", unifiedCenters = " << unifiedCenters[i]
1713 <<
", unifiedBins = " << unifiedBins[i]
1720 this->subHistogram(initialPos,
1721 unifiedMinHorizontalValue,
1722 unifiedMaxHorizontalValue,
1739 unsigned int initialPos,
1740 const T& minHorizontalValue,
1741 const T& maxHorizontalValue,
1743 std::vector<unsigned int>& bins)
const
1747 for (
unsigned int j = 0; j < bins.size(); ++j) {
1751 double horizontalDelta = (maxHorizontalValue - minHorizontalValue)/(((
double) bins.size()) - 2.);
1752 double minCenter = minHorizontalValue - horizontalDelta/2.;
1753 double maxCenter = maxHorizontalValue + horizontalDelta/2.;
1760 unsigned int dataSize = this->subSequenceSize();
1761 for (
unsigned int j = 0; j < dataSize; ++j) {
1762 double value = m_seq[j];
1763 if (value < minHorizontalValue) {
1766 else if (value >= maxHorizontalValue) {
1767 bins[bins.size()-1] += value;
1770 unsigned int index = 1 + (
unsigned int) ((value - minHorizontalValue)/horizontalDelta);
1771 bins[index] += value;
1781 unsigned int initialPos,
1782 const T& minHorizontalValue,
1783 const T& maxHorizontalValue,
1785 std::vector<unsigned int>& bins)
const
1789 for (
unsigned int j = 0; j < bins.size(); ++j) {
1793 double horizontalDelta = (maxHorizontalValue - minHorizontalValue)/(((
double) bins.size()) - 2.);
1794 double minCenter = minHorizontalValue - horizontalDelta/2.;
1795 double maxCenter = maxHorizontalValue + horizontalDelta/2.;
1802 unsigned int dataSize = this->subSequenceSize();
1803 for (
unsigned int j = 0; j < dataSize; ++j) {
1804 double value = m_seq[j];
1805 if (value < minHorizontalValue) {
1808 else if (value >= maxHorizontalValue) {
1809 bins[bins.size()-1] += value;
1812 unsigned int index = 1 + (
unsigned int) ((value - minHorizontalValue)/horizontalDelta);
1813 bins[index] += value;
1823 unsigned int initialPos,
1824 const T& minHorizontalValue,
1825 const T& maxHorizontalValue,
1826 std::vector<T>& gridValues,
1827 std::vector<unsigned int>& bins)
const
1831 for (
unsigned int j = 0; j < bins.size(); ++j) {
1835 double horizontalDelta = (maxHorizontalValue - minHorizontalValue)/(((
double) bins.size()) - 2.);
1836 double minCenter = minHorizontalValue - horizontalDelta/2.;
1837 double maxCenter = maxHorizontalValue + horizontalDelta/2.;
1844 gridValues.resize(tmpGrid.size(),0.);
1845 for (
unsigned int i = 0; i < tmpGrid.size(); ++i) {
1846 gridValues[i] = tmpGrid[i];
1849 unsigned int dataSize = this->subSequenceSize();
1850 for (
unsigned int j = 0; j < dataSize; ++j) {
1851 double value = m_seq[j];
1852 if (value < minHorizontalValue) {
1855 else if (value >= maxHorizontalValue) {
1856 bins[bins.size()-1] += value;
1859 unsigned int index = 1 + (
unsigned int) ((value - minHorizontalValue)/horizontalDelta);
1860 bins[index] += value;
1875 unsigned int initialPos,
1878 unsigned int numPos = this->subSequenceSize() - initialPos;
1880 this->extractScalarSeq(initialPos,
1892 bool useOnlyInter0Comm,
1893 unsigned int initialPos,
1896 if (m_env.numSubEnvironments() == 1) {
1897 return this->subSort(initialPos,unifiedSortedSequence);
1902 if (useOnlyInter0Comm) {
1903 if (m_env.inter0Rank() >= 0) {
1906 unsigned int localNumPos = this->subSequenceSize() - initialPos;
1908 std::vector<T> leafData(localNumPos,0.);
1909 this->extractRawData(0,
1914 if (m_env.inter0Rank() == 0) {
1915 int minus1NumTreeLevels = 0;
1916 int power2NumTreeNodes = 1;
1918 while (power2NumTreeNodes < m_env.inter0Comm().NumProc()) {
1919 power2NumTreeNodes += power2NumTreeNodes;
1920 minus1NumTreeLevels++;
1923 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
1924 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedSort()"
1925 <<
": sorting tree has " << m_env.inter0Comm().NumProc()
1926 <<
" nodes and " << minus1NumTreeLevels+1
1931 this->parallelMerge(unifiedSortedSequence.
rawData(),
1933 minus1NumTreeLevels);
1935 else if (m_env.inter0Rank() > 0) {
1936 unsigned int uintBuffer[1];
1939 "ScalarSequence<T>::unifiedSort()",
1940 "failed MPI.Recv() for init");
1943 unsigned int treeLevel = uintBuffer[0];
1944 this->parallelMerge(unifiedSortedSequence.
rawData(),
1952 unsigned int unifiedDataSize = unifiedSortedSequence.
subSequenceSize();
1954 "ScalarSequence<T>::unifiedSort()",
1955 "failed MPI.Bcast() for unified data size");
1957 unsigned int sumOfNumPos = 0;
1958 m_env.inter0Comm().template Allreduce<unsigned int>(&localNumPos, &sumOfNumPos, (int) 1,
RawValue_MPI_SUM,
1959 "ScalarSequence<T>::unifiedSort()",
1960 "failed MPI.Allreduce() for data size");
1966 "ScalarSequence<T>::unifiedSort()",
1967 "failed MPI.Bcast() for unified data");
1969 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
1970 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
1971 <<
": tree node " << m_env.inter0Rank()
1972 <<
", unifiedSortedSequence[0] = " << unifiedSortedSequence[0]
1973 <<
", unifiedSortedSequence[" << unifiedSortedSequence.
subSequenceSize()-1 <<
"] = " << unifiedSortedSequence[unifiedSortedSequence.
subSequenceSize()-1]
1981 this->subSort(initialPos,unifiedSortedSequence);
2000 this->subSort(initialPos,
2004 unsigned int dataSize = this->subSequenceSize() - initialPos;
2008 bool everythingOk =
true;
2013 unsigned int pos1 = (
unsigned int) ( (((
double) dataSize) + 1.)*1./4. - 1. );
2014 if (pos1 > (dataSize-1)) {
2016 everythingOk =
false;
2018 unsigned int pos1inc = pos1+1;
2019 if (pos1inc > (dataSize-1)) {
2020 pos1inc = dataSize-1;
2021 everythingOk =
false;
2027 unsigned int pos3 = (
unsigned int) ( (((
double) dataSize) + 1.)*3./4. - 1. );
2028 if (pos3 > (dataSize-1)) {
2030 everythingOk =
false;
2032 unsigned int pos3inc = pos3+1;
2033 if (pos3inc > (dataSize-1)) {
2034 pos3inc = dataSize-1;
2035 everythingOk =
false;
2038 double fraction1 = (((double) dataSize) + 1.)*1./4. - 1. - ((double) pos1);
2039 if (fraction1 < 0.) {
2041 everythingOk =
false;
2043 double fraction3 = (((double) dataSize) + 1.)*3./4. - 1. - ((double) pos3);
2044 if (fraction3 < 0.) {
2046 everythingOk =
false;
2049 if (everythingOk ==
false) {
2050 std::cerr <<
"In ScalarSequence<T>::subInterQuantileRange()"
2051 <<
", worldRank = " << m_env.worldRank()
2052 <<
": at least one adjustment was necessary"
2067 T value1 = (1.-fraction1) * sortedSequence[pos1] + fraction1 * sortedSequence[pos1inc];
2068 T value3 = (1.-fraction3) * sortedSequence[pos3] + fraction3 * sortedSequence[pos3inc];
2069 T iqrValue = value3 - value1;
2071 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2072 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::subInterQuantileRange()"
2073 <<
": iqrValue = " << iqrValue
2074 <<
", dataSize = " << dataSize
2075 <<
", pos1 = " << pos1
2076 <<
", pos3 = " << pos3
2077 <<
", value1 = " << value1
2078 <<
", value3 = " << value3
2109 bool useOnlyInter0Comm,
2110 unsigned int initialPos)
const
2112 T unifiedIqrValue = 0.;
2114 if (m_env.numSubEnvironments() == 1) {
2115 return this->subInterQuantileRange(initialPos);
2120 if (useOnlyInter0Comm) {
2121 if (m_env.inter0Rank() >= 0) {
2125 this->unifiedSort(useOnlyInter0Comm,
2127 unifiedSortedSequence);
2128 unsigned int unifiedDataSize = unifiedSortedSequence.
subSequenceSize();
2130 unsigned int localDataSize = this->subSequenceSize() - initialPos;
2131 unsigned int sumOfLocalSizes = 0;
2132 m_env.inter0Comm().template Allreduce<unsigned int>(&localDataSize, &sumOfLocalSizes, (int) 1,
RawValue_MPI_SUM,
2133 "ScalarSequence<T>::unifiedInterQuantileRange()",
2134 "failed MPI.Allreduce() for data size");
2138 unsigned int pos1 = (
unsigned int) ( (((
double) unifiedDataSize) + 1.)*1./4. - 1. );
2139 unsigned int pos3 = (
unsigned int) ( (((
double) unifiedDataSize) + 1.)*3./4. - 1. );
2141 double fraction1 = (((double) unifiedDataSize) + 1.)*1./4. - 1. - ((double) pos1);
2142 double fraction3 = (((double) unifiedDataSize) + 1.)*3./4. - 1. - ((double) pos3);
2144 T value1 = (1.-fraction1) * unifiedSortedSequence[pos1] + fraction1 * unifiedSortedSequence[pos1+1];
2145 T value3 = (1.-fraction3) * unifiedSortedSequence[pos3] + fraction3 * unifiedSortedSequence[pos3+1];
2146 unifiedIqrValue = value3 - value1;
2148 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2149 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedInterQuantileRange()"
2150 <<
": unifiedIqrValue = " << unifiedIqrValue
2151 <<
", localDataSize = " << localDataSize
2152 <<
", unifiedDataSize = " << unifiedDataSize
2153 <<
", pos1 = " << pos1
2154 <<
", pos3 = " << pos3
2155 <<
", value1 = " << value1
2156 <<
", value3 = " << value3
2185 unifiedIqrValue = this->subInterQuantileRange(initialPos);
2194 return unifiedIqrValue;
2200 unsigned int initialPos,
2202 unsigned int kdeDimension)
const
2204 bool bRC = (initialPos < this->subSequenceSize());
2207 unsigned int dataSize = this->subSequenceSize() - initialPos;
2209 T meanValue = this->subMeanExtra(initialPos,
2212 T samValue = this->subSampleVarianceExtra(initialPos,
2217 if (iqrValue <= 0.) {
2218 scaleValue = 1.06*std::sqrt(samValue)/std::pow(dataSize,1./(4. + ((
double) kdeDimension)));
2221 scaleValue = 1.06*std::min(std::sqrt(samValue),iqrValue/1.34)/std::pow(dataSize,1./(4. + ((
double) kdeDimension)));
2224 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2225 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::subScaleForKde()"
2226 <<
": iqrValue = " << iqrValue
2227 <<
", meanValue = " << meanValue
2228 <<
", samValue = " << samValue
2229 <<
", dataSize = " << dataSize
2230 <<
", scaleValue = " << scaleValue
2240 bool useOnlyInter0Comm,
2241 unsigned int initialPos,
2242 const T& unifiedIqrValue,
2243 unsigned int kdeDimension)
const
2245 if (m_env.numSubEnvironments() == 1) {
2246 return this->subScaleForKde(initialPos,
2253 T unifiedScaleValue = 0.;
2254 if (useOnlyInter0Comm) {
2255 if (m_env.inter0Rank() >= 0) {
2256 bool bRC = (initialPos < this->subSequenceSize());
2259 unsigned int localDataSize = this->subSequenceSize() - initialPos;
2261 T unifiedMeanValue = this->unifiedMeanExtra(useOnlyInter0Comm,
2265 T unifiedSamValue = this->unifiedSampleVarianceExtra(useOnlyInter0Comm,
2270 unsigned int unifiedDataSize = 0;
2271 m_env.inter0Comm().template Allreduce<unsigned int>(&localDataSize, &unifiedDataSize, (int) 1,
RawValue_MPI_SUM,
2272 "ScalarSequence<T>::unifiedScaleForKde()",
2273 "failed MPI.Allreduce() for data size");
2275 if (unifiedIqrValue <= 0.) {
2276 unifiedScaleValue = 1.06*std::sqrt(unifiedSamValue)/std::pow(unifiedDataSize,1./(4. + ((
double) kdeDimension)));
2279 unifiedScaleValue = 1.06*std::min(std::sqrt(unifiedSamValue),unifiedIqrValue/1.34)/std::pow(unifiedDataSize,1./(4. + ((
double) kdeDimension)));
2282 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2283 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedScaleForKde()"
2284 <<
": unifiedIqrValue = " << unifiedIqrValue
2285 <<
", unifiedMeanValue = " << unifiedMeanValue
2286 <<
", unifiedSamValue = " << unifiedSamValue
2287 <<
", unifiedDataSize = " << unifiedDataSize
2288 <<
", unifiedScaleValue = " << unifiedScaleValue
2294 unifiedScaleValue = this->subScaleForKde(initialPos,
2305 return unifiedScaleValue;
2311 unsigned int initialPos,
2313 const std::vector<T>& evaluationPositions,
2314 std::vector<double>& densityValues)
const
2316 bool bRC = ((initialPos < this->subSequenceSize() ) &&
2317 (0 < evaluationPositions.size()) &&
2318 (evaluationPositions.size() == densityValues.size() ));
2321 unsigned int dataSize = this->subSequenceSize() - initialPos;
2322 unsigned int numEvals = evaluationPositions.size();
2324 double scaleInv = 1./scaleValue;
2325 for (
unsigned int j = 0; j < numEvals; ++j) {
2326 double x = evaluationPositions[j];
2328 for (
unsigned int k = 0;
k < dataSize; ++
k) {
2329 double xk = m_seq[initialPos+
k];
2332 densityValues[j] = scaleInv * (value/(double) dataSize);
2341 bool useOnlyInter0Comm,
2342 unsigned int initialPos,
2343 double unifiedScaleValue,
2344 const std::vector<T>& unifiedEvaluationPositions,
2345 std::vector<double>& unifiedDensityValues)
const
2347 if (m_env.numSubEnvironments() == 1) {
2348 return this->subGaussian1dKde(initialPos,
2350 unifiedEvaluationPositions,
2351 unifiedDensityValues);
2356 if (useOnlyInter0Comm) {
2357 if (m_env.inter0Rank() >= 0) {
2358 bool bRC = ((initialPos < this->subSequenceSize() ) &&
2359 (0 < unifiedEvaluationPositions.size()) &&
2360 (unifiedEvaluationPositions.size() == unifiedDensityValues.size() ));
2363 unsigned int localDataSize = this->subSequenceSize() - initialPos;
2364 unsigned int unifiedDataSize = 0;
2365 m_env.inter0Comm().template Allreduce<unsigned int>(&localDataSize, &unifiedDataSize, (int) 1,
RawValue_MPI_SUM,
2366 "ScalarSequence<T>::unifiedGaussian1dKde()",
2367 "failed MPI.Allreduce() for data size");
2369 unsigned int numEvals = unifiedEvaluationPositions.size();
2371 std::vector<double> densityValues(numEvals,0.);
2372 double unifiedScaleInv = 1./unifiedScaleValue;
2373 for (
unsigned int j = 0; j < numEvals; ++j) {
2374 double x = unifiedEvaluationPositions[j];
2376 for (
unsigned int k = 0;
k < localDataSize; ++
k) {
2377 double xk = m_seq[initialPos+
k];
2380 densityValues[j] = value;
2383 for (
unsigned int j = 0; j < numEvals; ++j) {
2384 unifiedDensityValues[j] = 0.;
2386 m_env.inter0Comm().template Allreduce<double>(&densityValues[0], &unifiedDensityValues[0], (int) numEvals,
RawValue_MPI_SUM,
2387 "ScalarSequence<T>::unifiedGaussian1dKde()",
2388 "failed MPI.Allreduce() for density values");
2390 for (
unsigned int j = 0; j < numEvals; ++j) {
2391 unifiedDensityValues[j] *= unifiedScaleInv/((double) unifiedDataSize);
2394 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2395 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedGaussian1dKde()"
2396 <<
": unifiedDensityValues[0] = " << unifiedDensityValues[0]
2397 <<
", unifiedDensityValues[" << unifiedDensityValues.size()-1 <<
"] = " << unifiedDensityValues[unifiedDensityValues.size()-1]
2403 this->subGaussian1dKde(initialPos,
2405 unifiedEvaluationPositions,
2406 unifiedDensityValues);
2421 unsigned int initialPos,
2422 unsigned int spacing)
2424 if (m_env.subDisplayFile()) {
2425 *m_env.subDisplayFile() <<
"Entering ScalarSequence<V,M>::filter()"
2426 <<
": initialPos = " << initialPos
2427 <<
", spacing = " << spacing
2428 <<
", subSequenceSize = " << this->subSequenceSize()
2433 unsigned int j = initialPos;
2434 unsigned int originalSubSequenceSize = this->subSequenceSize();
2435 while (j < originalSubSequenceSize) {
2438 m_seq[i] = m_seq[j];
2444 this->resizeSequence(i);
2446 if (m_env.subDisplayFile()) {
2447 *m_env.subDisplayFile() <<
"Leaving ScalarSequence<V,M>::filter()"
2448 <<
": initialPos = " << initialPos
2449 <<
", spacing = " << spacing
2450 <<
", subSequenceSize = " << this->subSequenceSize()
2460 bool useOnlyInter0Comm,
2461 unsigned int initialPos,
2462 unsigned int spacing)
const
2464 double resultValue = 0.;
2468 if (useOnlyInter0Comm) {
2469 if (m_env.inter0Rank() >= 0) {
2490 unsigned int srcInitialPos,
2491 unsigned int srcNumPos)
2497 deleteStoredScalars();
2498 unsigned int currentSize = this->subSequenceSize();
2499 m_seq.resize(currentSize+srcNumPos,0.);
2500 for (
unsigned int i = 0; i < srcNumPos; ++i) {
2501 m_seq[currentSize+i] = src.
m_seq[srcInitialPos+i];
2515 T subMaxValue = subCorrespondingScalarValues.
subMaxPlain();
2518 unsigned int subNumPos = 0;
2519 for (
unsigned int i = 0; i < iMax; ++i) {
2520 if (subCorrespondingScalarValues[i] == subMaxValue) {
2527 for (
unsigned int i = 0; i < iMax; ++i) {
2528 if (subCorrespondingScalarValues[i] == subMaxValue) {
2529 subPositionsOfMaximum[j] = (*this)[i];
2545 T maxValue = subCorrespondingScalarValues.
subMaxPlain();
2548 unsigned int numPos = 0;
2549 for (
unsigned int i = 0; i < iMax; ++i) {
2550 if (subCorrespondingScalarValues[i] == maxValue) {
2557 for (
unsigned int i = 0; i < iMax; ++i) {
2558 if (subCorrespondingScalarValues[i] == maxValue) {
2559 unifiedPositionsOfMaximum[j] = (*this)[i];
2570 unsigned int initialPos,
2571 unsigned int numPos,
2572 const std::string& fileName,
2573 const std::string& fileType,
2574 const std::set<unsigned int>& allowedSubEnvIds)
const
2579 if (m_env.openOutputFile(fileName,
2588 this->subWriteContents(initialPos,
2593 #ifdef QUESO_HAS_HDF5
2597 hsize_t dims[1] = { this->subSequenceSize() };
2598 hid_t dataspace_id = H5Screate_simple(1, dims, dims);
2602 "error create dataspace with id: " << dataspace_id);
2605 hid_t dataset_id = H5Dcreate(filePtrSet.h5Var,
2616 "error creating dataset with id: " << dataset_id);
2619 herr_t status = H5Dwrite(
2630 "error writing dataset to file with id: " << filePtrSet.h5Var);
2633 H5Dclose(dataset_id);
2634 H5Sclose(dataspace_id);
2638 m_env.closeFile(filePtrSet,fileType);
2648 const std::string& fileType)
const
2651 this->writeSubMatlabHeader(ofs, this->subSequenceSize());
2654 this->writeTxtHeader(ofs, this->subSequenceSize());
2657 unsigned int chainSize = this->subSequenceSize();
2658 for (
unsigned int j = 0; j < chainSize; ++j) {
2673 const std::string& fileName,
2674 const std::string& inputFileType)
const
2676 std::string fileType(inputFileType);
2677 #ifdef QUESO_HAS_HDF5
2681 if (m_env.subDisplayFile()) {
2682 *m_env.subDisplayFile() <<
"WARNING in ScalarSequence<T>::unifiedWriteContents()"
2684 <<
"' has been requested, but this QUESO library has not been built with 'hdf5'"
2689 if (m_env.subRank() == 0) {
2690 std::cerr <<
"WARNING in ScalarSequence<T>::unifiedWriteContents()"
2692 <<
"' has been requested, but this QUESO library has not been built with 'hdf5'"
2704 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
2705 *m_env.subDisplayFile() <<
"Entering ScalarSequence<T>::unifiedWriteContents()"
2706 <<
": worldRank " << m_env.worldRank()
2707 <<
", subEnvironment " << m_env.subId()
2708 <<
", subRank " << m_env.subRank()
2709 <<
", inter0Rank " << m_env.inter0Rank()
2711 <<
", fileName = " << fileName
2712 <<
", fileType = " << fileType
2718 if (m_env.inter0Rank() >= 0) {
2719 for (
unsigned int r = 0; r < (
unsigned int) m_env.inter0Comm().NumProc(); ++r) {
2720 if (m_env.inter0Rank() == (int) r) {
2724 bool writeOver =
false;
2727 if (m_env.openUnifiedOutputFile(fileName,
2730 unifiedFilePtrSet)) {
2733 unsigned int chainSize = this->subSequenceSize();
2740 this->writeUnifiedMatlabHeader(*unifiedFilePtrSet.
ofsVar,
2741 this->subSequenceSize()*m_env.inter0Comm().NumProc());
2744 this->writeTxtHeader(*unifiedFilePtrSet.
ofsVar,
2745 this->subSequenceSize()*m_env.inter0Comm().NumProc());
2749 for (
unsigned int j = 0; j < chainSize; ++j) {
2750 *unifiedFilePtrSet.
ofsVar << m_seq[j]
2754 m_env.closeFile(unifiedFilePtrSet,fileType);
2756 #ifdef QUESO_HAS_HDF5
2758 unsigned int numParams = 1;
2760 hid_t datatype = H5Tcopy(H5T_NATIVE_DOUBLE);
2763 dimsf[0] = chainSize;
2764 hid_t dataspace = H5Screate_simple(1, dimsf, NULL);
2766 hid_t dataset = H5Dcreate2(unifiedFilePtrSet.h5Var,
2775 struct timeval timevalBegin;
2777 iRC = gettimeofday(&timevalBegin,NULL);
2782 status = H5Dwrite(dataset,
2794 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
2795 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedWriteContents()"
2796 <<
": worldRank " << m_env.worldRank()
2797 <<
", fullRank " << m_env.fullRank()
2798 <<
", subEnvironment " << m_env.subId()
2799 <<
", subRank " << m_env.subRank()
2800 <<
", inter0Rank " << m_env.inter0Rank()
2801 <<
", fileName = " << fileName
2802 <<
", numParams = " << numParams
2803 <<
", chainSize = " << chainSize
2804 <<
", writeTime = " << writeTime <<
" seconds"
2810 H5Sclose(dataspace);
2816 queso_error_msg(
"hdf file type not supported for multiple sub-environments yet");
2823 m_env.inter0Comm().Barrier();
2826 if (m_env.inter0Rank() == 0) {
2830 if (m_env.openUnifiedOutputFile(fileName,
2833 unifiedFilePtrSet)) {
2836 *unifiedFilePtrSet.
ofsVar <<
"];\n";
2839 m_env.closeFile(unifiedFilePtrSet,fileType);
2851 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
2852 *m_env.subDisplayFile() <<
"Leaving ScalarSequence<T>::unifiedWriteContents()"
2853 <<
", fileName = " << fileName
2854 <<
", fileType = " << fileType
2865 double sequenceSize)
const
2867 ofs << m_name <<
"_unified" <<
" = zeros(" << sequenceSize
2871 ofs << m_name <<
"_unified" <<
" = [";
2877 double sequenceSize)
const
2879 ofs << m_name <<
"_sub" << m_env.subIdString() <<
" = zeros(" << sequenceSize
2883 ofs << m_name <<
"_sub" << m_env.subIdString() <<
" = [";
2889 double sequenceSize)
const
2891 ofs << sequenceSize <<
" " << 1 << std::endl;
2898 const std::string& fileName,
2899 const std::string& inputFileType,
2900 const unsigned int subReadSize)
2903 std::string fileType(inputFileType);
2904 #ifdef QUESO_HAS_HDF5
2908 if (m_env.subDisplayFile()) {
2909 *m_env.subDisplayFile() <<
"WARNING in ScalarSequence<T>::unifiedReadContents()"
2911 <<
"' has been requested, but this QUESO library has not been built with 'hdf5'"
2916 if (m_env.subRank() == 0) {
2917 std::cerr <<
"WARNING in ScalarSequence<T>::unifiedReadContents()"
2919 <<
"' has been requested, but this QUESO library has not been built with 'hdf5'"
2929 if (m_env.subDisplayFile()) {
2930 *m_env.subDisplayFile() <<
"Entering ScalarSequence<T>::unifiedReadContents()"
2931 <<
": worldRank " << m_env.worldRank()
2932 <<
", fullRank " << m_env.fullRank()
2933 <<
", subEnvironment " << m_env.subId()
2934 <<
", subRank " << m_env.subRank()
2935 <<
", inter0Rank " << m_env.inter0Rank()
2937 <<
", fileName = " << fileName
2938 <<
", subReadSize = " << subReadSize
2943 this->resizeSequence(subReadSize);
2945 if (m_env.inter0Rank() >= 0) {
2946 double unifiedReadSize = subReadSize*m_env.inter0Comm().NumProc();
2949 unsigned int idOfMyFirstLine = 1 + m_env.inter0Rank()*subReadSize;
2950 unsigned int idOfMyLastLine = (1 + m_env.inter0Rank())*subReadSize;
2951 unsigned int numParams = 1;
2953 for (
unsigned int r = 0; r < (
unsigned int) m_env.inter0Comm().NumProc(); ++r) {
2954 if (m_env.inter0Rank() == (int) r) {
2957 if (m_env.openUnifiedInputFile(fileName,
2959 unifiedFilePtrSet)) {
2965 std::string tmpString;
2968 *unifiedFilePtrSet.
ifsVar >> tmpString;
2972 *unifiedFilePtrSet.
ifsVar >> tmpString;
2977 *unifiedFilePtrSet.
ifsVar >> tmpString;
2979 unsigned int posInTmpString = 6;
2983 std::string nPositionsString((
size_t) (tmpString.size()-posInTmpString+1),
' ');
2984 unsigned int posInPositionsString = 0;
2987 nPositionsString[posInPositionsString++] = tmpString[posInTmpString++];
2988 }
while (tmpString[posInTmpString] !=
',');
2989 nPositionsString[posInPositionsString] =
'\0';
2994 std::string nParamsString((
size_t) (tmpString.size()-posInTmpString+1),
' ');
2995 unsigned int posInParamsString = 0;
2998 nParamsString[posInParamsString++] = tmpString[posInTmpString++];
2999 }
while (tmpString[posInTmpString] !=
')');
3000 nParamsString[posInParamsString] =
'\0';
3003 unsigned int sizeOfChainInFile = (
unsigned int) strtod(nPositionsString.c_str(),NULL);
3004 unsigned int numParamsInFile = (
unsigned int) strtod(nParamsString.c_str(), NULL);
3005 if (m_env.subDisplayFile()) {
3006 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedReadContents()"
3007 <<
": worldRank " << m_env.worldRank()
3008 <<
", fullRank " << m_env.fullRank()
3009 <<
", sizeOfChainInFile = " << sizeOfChainInFile
3010 <<
", numParamsInFile = " << numParamsInFile
3018 queso_require_equal_to_msg(numParamsInFile, numParams,
"number of parameters of chain in file is different than number of parameters in this chain object");
3022 unsigned int maxCharsPerLine = 64*numParams;
3024 unsigned int lineId = 0;
3025 while (lineId < idOfMyFirstLine) {
3026 unifiedFilePtrSet.
ifsVar->ignore(maxCharsPerLine,
'\n');
3033 std::string tmpString;
3036 *unifiedFilePtrSet.
ifsVar >> tmpString;
3040 *unifiedFilePtrSet.
ifsVar >> tmpString;
3045 std::streampos tmpPos = unifiedFilePtrSet.
ifsVar->tellg();
3046 unifiedFilePtrSet.
ifsVar->seekg(tmpPos+(std::streampos)2);
3050 while (lineId <= idOfMyLastLine) {
3051 for (
unsigned int i = 0; i < numParams; ++i) {
3052 *unifiedFilePtrSet.
ifsVar >> tmpScalar;
3054 m_seq[lineId - idOfMyFirstLine] = tmpScalar;
3058 #ifdef QUESO_HAS_HDF5
3061 hid_t dataset = H5Dopen2(unifiedFilePtrSet.h5Var,
3064 hid_t datatype = H5Dget_type(dataset);
3065 H5T_class_t t_class = H5Tget_class(datatype);
3067 hid_t dataspace = H5Dget_space(dataset);
3068 int rank = H5Sget_simple_extent_ndims(dataspace);
3072 status_n = H5Sget_simple_extent_dims(dataspace, dims_in, NULL);
3081 struct timeval timevalBegin;
3083 iRC = gettimeofday(&timevalBegin,NULL);
3086 unsigned int chainSizeIn = (
unsigned int) dims_in[1];
3088 std::vector<double*>
dataIn((
size_t) numParams,NULL);
3089 dataIn[0] = (
double*) malloc(numParams*chainSizeIn*
sizeof(
double));
3090 for (
unsigned int i = 1; i < numParams; ++i) {
3091 dataIn[i] = dataIn[i-1] + chainSizeIn;
3095 status = H5Dread(dataset,
3104 for (
unsigned int j = 0; j < subReadSize; ++j) {
3105 for (
unsigned int i = 0; i < numParams; ++i) {
3106 tmpScalar = dataIn[i][j];
3108 m_seq[j] = tmpScalar;
3112 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
3113 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedReadContents()"
3114 <<
": worldRank " << m_env.worldRank()
3115 <<
", fullRank " << m_env.fullRank()
3116 <<
", subEnvironment " << m_env.subId()
3117 <<
", subRank " << m_env.subRank()
3118 <<
", inter0Rank " << m_env.inter0Rank()
3119 <<
", fileName = " << fileName
3120 <<
", numParams = " << numParams
3121 <<
", chainSizeIn = " << chainSizeIn
3122 <<
", subReadSize = " << subReadSize
3123 <<
", readTime = " << readTime <<
" seconds"
3127 H5Sclose(dataspace);
3131 for (
unsigned int tmpIndex = 0; tmpIndex < dataIn.size(); tmpIndex++) {
3132 free (dataIn[tmpIndex]);
3136 queso_error_msg(
"hdf file type not supported for multiple sub-environments yet");
3143 m_env.closeFile(unifiedFilePtrSet,fileType);
3146 m_env.inter0Comm().Barrier();
3151 for (
unsigned int i = 1; i < subReadSize; ++i) {
3152 m_seq[i] = tmpScalar;
3156 if (m_env.subDisplayFile()) {
3157 *m_env.subDisplayFile() <<
"Leaving ScalarSequence<T>::unifiedReadContents()"
3158 <<
", fileName = " << fileName
3173 for (
unsigned int i = 0; i < m_seq.size(); ++i) {
3174 m_seq[i] = src.
m_seq[i];
3176 deleteStoredScalars();
3184 unsigned int initialPos,
3185 unsigned int spacing,
3186 unsigned int numPos,
3191 for (
unsigned int j = 0; j < numPos; ++j) {
3201 scalarSeq[j] = m_seq[initialPos+j ];
3205 for (
unsigned int j = 0; j < numPos; ++j) {
3215 scalarSeq[j] = m_seq[initialPos+j*spacing];
3225 unsigned int initialPos,
3226 unsigned int spacing,
3227 unsigned int numPos,
3228 std::vector<double>& rawDataVec)
const
3230 rawDataVec.resize(numPos);
3232 for (
unsigned int j = 0; j < numPos; ++j) {
3233 rawDataVec[j] = m_seq[initialPos+j ];
3237 for (
unsigned int j = 0; j < numPos; ++j) {
3238 rawDataVec[j] = m_seq[initialPos+j*spacing];
3257 std::sort(m_seq.begin(), m_seq.end());
3266 std::vector<T>& sortedBuffer,
3267 const std::vector<T>& leafData,
3268 unsigned int currentTreeLevel)
const
3270 int parentNode = m_env.inter0Rank() & ~(1 << currentTreeLevel);
3272 if (m_env.inter0Rank() >= 0) {
3273 if (currentTreeLevel == 0) {
3275 unsigned int leafDataSize = leafData.size();
3276 sortedBuffer.resize(leafDataSize,0.);
3277 for (
unsigned int i = 0; i < leafDataSize; ++i) {
3278 sortedBuffer[i] = leafData[i];
3280 std::sort(sortedBuffer.begin(), sortedBuffer.end());
3281 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
3282 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
3283 <<
": tree node " << m_env.inter0Rank()
3284 <<
", leaf sortedBuffer[0] = " << sortedBuffer[0]
3285 <<
", leaf sortedBuffer[" << sortedBuffer.size()-1 <<
"] = " << sortedBuffer[sortedBuffer.size()-1]
3290 int nextTreeLevel = currentTreeLevel - 1;
3291 int rightChildNode = m_env.inter0Rank() | (1 << nextTreeLevel);
3293 if (rightChildNode >= m_env.inter0Comm().NumProc()) {
3294 this->parallelMerge(sortedBuffer,
3299 unsigned int uintBuffer[1];
3300 uintBuffer[0] = nextTreeLevel;
3302 "ScalarSequence<T>::parallelMerge()",
3303 "failed MPI.Send() for init");
3305 this->parallelMerge(sortedBuffer,
3310 unsigned int leftSize = sortedBuffer.size();
3311 std::vector<T> leftSortedBuffer(leftSize,0.);
3312 for (
unsigned int i = 0; i < leftSize; ++i) {
3313 leftSortedBuffer[i] = sortedBuffer[i];
3319 "ScalarSequence<T>::parallelMerge()",
3320 "failed MPI.Recv() for size");
3323 unsigned int rightSize = uintBuffer[0];
3324 std::vector<T> rightSortedBuffer(rightSize,0.);
3326 "ScalarSequence<T>::parallelMerge()",
3327 "failed MPI.Recv() for data");
3330 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
3331 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
3332 <<
": tree node " << m_env.inter0Rank()
3333 <<
" is combining " << leftSortedBuffer.size()
3334 <<
" left doubles with " << rightSortedBuffer.size()
3339 sortedBuffer.clear();
3340 sortedBuffer.resize(leftSortedBuffer.size()+rightSortedBuffer.size(),0.);
3344 while ((i < leftSize ) &&
3346 if (leftSortedBuffer[i] > rightSortedBuffer[j]) sortedBuffer[k++] = rightSortedBuffer[j++];
3347 else sortedBuffer[k++] = leftSortedBuffer [i++];
3349 while (i < leftSize ) sortedBuffer[k++] = leftSortedBuffer [i++];
3350 while (j < rightSize) sortedBuffer[k++] = rightSortedBuffer[j++];
3351 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
3352 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
3353 <<
": tree node " << m_env.inter0Rank()
3354 <<
", merged sortedBuffer[0] = " << sortedBuffer[0]
3355 <<
", merged sortedBuffer[" << sortedBuffer.size()-1 <<
"] = " << sortedBuffer[sortedBuffer.size()-1]
3361 if (parentNode != m_env.inter0Rank()) {
3363 unsigned int uintBuffer[1];
3364 uintBuffer[0] = sortedBuffer.size();
3366 "ScalarSequence<T>::parallelMerge()",
3367 "failed MPI.Send() for size");
3369 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
3370 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
3371 <<
": tree node " << m_env.inter0Rank()
3372 <<
" is sending " << sortedBuffer.size()
3373 <<
" doubles to tree node " << parentNode
3374 <<
", with sortedBuffer[0] = " << sortedBuffer[0]
3375 <<
" and sortedBuffer[" << sortedBuffer.size()-1 <<
"] = " << sortedBuffer[sortedBuffer.size()-1]
3380 "ScalarSequence<T>::parallelMerge()",
3381 "failed MPI.Send() for data");
3393 #ifdef QUESO_COMPUTES_EXTRA_POST_PROCESSING_STATISTICS
3397 unsigned int numEvaluationPoints,
3400 std::vector<T>& mdfValues)
const
3404 std::vector<T> centers(numEvaluationPoints,0.);
3405 std::vector<unsigned int> bins (numEvaluationPoints,0);
3408 this->subSequenceSize(),
3417 minDomainValue = centers[0];
3418 maxDomainValue = centers[centers.size()-1];
3419 T binSize = (maxDomainValue - minDomainValue)/((
double)(centers.size() - 1));
3421 unsigned int totalCount = 0;
3422 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
3423 totalCount += bins[i];
3427 mdfValues.resize(numEvaluationPoints);
3428 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
3429 mdfValues[i] = ((T) bins[i])/((T) totalCount)/binSize;
3437 ScalarSequence<T>::subMeanCltStd(
3438 unsigned int initialPos,
3439 unsigned int numPos,
3440 const T& meanValue)
const
3442 if (this->subSequenceSize() == 0)
return 0.;
3444 bool bRC = ((initialPos < this->subSequenceSize()) &&
3446 ((initialPos+numPos) <= this->subSequenceSize()));
3449 unsigned int finalPosPlus1 = initialPos + numPos;
3452 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
3453 diff = m_seq[j] - meanValue;
3454 stdValue += diff*diff;
3457 stdValue /= (((T) numPos) - 1.);
3458 stdValue /= (((T) numPos) - 1.);
3459 stdValue = sqrt(stdValue);
3466 ScalarSequence<T>::unifiedMeanCltStd(
3467 bool useOnlyInter0Comm,
3468 unsigned int initialPos,
3469 unsigned int numPos,
3470 const T& unifiedMeanValue)
const
3472 if (m_env.numSubEnvironments() == 1) {
3473 return this->subMeanCltStd(initialPos,
3480 T unifiedStdValue = 0.;
3481 if (useOnlyInter0Comm) {
3482 if (m_env.inter0Rank() >= 0) {
3483 bool bRC = ((initialPos < this->subSequenceSize()) &&
3485 ((initialPos+numPos) <= this->subSequenceSize()));
3488 unsigned int finalPosPlus1 = initialPos + numPos;
3490 T localStdValue = 0.;
3491 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
3492 diff = m_seq[j] - unifiedMeanValue;
3493 localStdValue += diff*diff;
3496 unsigned int unifiedNumPos = 0;
3497 m_env.inter0Comm().template Allreduce<unsigned int>(&numPos, &unifiedNumPos, (int) 1,
RawValue_MPI_SUM,
3498 "ScalarSequence<T>::unifiedMeanCltStd()",
3499 "failed MPI.Allreduce() for numPos");
3501 m_env.inter0Comm().template Allreduce<double>(&localStdValue, &unifiedStdValue, (int) 1,
RawValue_MPI_SUM,
3502 "ScalarSequence<T>::unifiedMeanCltStd()",
3503 "failed MPI.Allreduce() for stdValue");
3505 unifiedStdValue /= (((T) unifiedNumPos) - 1.);
3506 unifiedStdValue /= (((T) unifiedNumPos) - 1.);
3507 unifiedStdValue /= sqrt(unifiedStdValue);
3511 this->subMeanCltStd(initialPos,
3521 return unifiedStdValue;
3526 ScalarSequence<T>::bmm(
3527 unsigned int initialPos,
3528 unsigned int batchLength)
const
3530 bool bRC = ((initialPos < this->subSequenceSize() ) &&
3531 (batchLength < (this->subSequenceSize()-initialPos)));
3534 unsigned int numberOfBatches = (this->subSequenceSize() - initialPos)/batchLength;
3535 ScalarSequence<T> batchMeans(m_env,numberOfBatches,
"");
3537 for (
unsigned int batchId = 0; batchId < numberOfBatches; batchId++) {
3538 batchMeans[batchId] = this->subMeanExtra(initialPos + batchId*batchLength,
3542 T meanOfBatchMeans = batchMeans.subMeanExtra(0,
3543 batchMeans.subSequenceSize());
3550 T bmmValue = batchMeans.subSampleVarianceExtra(0,
3551 batchMeans.subSequenceSize(),
3554 bmmValue /= (T) batchMeans.subSequenceSize();
3562 ScalarSequence<T>::psd(
3563 unsigned int initialPos,
3564 unsigned int numBlocks,
3565 double hopSizeRatio,
3566 std::vector<double>& psdResult)
const
3568 bool bRC = ((initialPos < this->subSequenceSize() ) &&
3569 (hopSizeRatio != 0. ) &&
3570 (numBlocks < (this->subSequenceSize() - initialPos)) &&
3571 (fabs(hopSizeRatio) < (double) (this->subSequenceSize() - initialPos)));
3574 unsigned int dataSize = this->subSequenceSize() - initialPos;
3576 T meanValue = this->subMeanExtra(initialPos,
3580 unsigned int hopSize = 0;
3581 unsigned int blockSize = 0;
3582 if (hopSizeRatio <= -1.) {
3583 double overlapSize = -hopSizeRatio;
3584 double tmp = ((double) (dataSize + (numBlocks - 1)*overlapSize))/((double) numBlocks);
3585 blockSize = (
unsigned int) tmp;
3587 else if (hopSizeRatio < 0.) {
3588 double tmp = ((double) dataSize)/(( ((double) numBlocks) - 1. )*(-hopSizeRatio) + 1.);
3589 blockSize = (
unsigned int) tmp;
3590 hopSize = (
unsigned int) ( ((
double) blockSize) * (-hopSizeRatio) );
3592 else if (hopSizeRatio == 0.) {
3595 else if (hopSizeRatio < 1.) {
3596 double tmp = ((double) dataSize)/(( ((double) numBlocks) - 1. )*hopSizeRatio + 1.);
3597 blockSize = (
unsigned int) tmp;
3598 hopSize = (
unsigned int) ( ((
double) blockSize) * hopSizeRatio );
3601 hopSize = (
unsigned int) hopSizeRatio;
3602 blockSize = dataSize - (numBlocks - 1)*hopSize;
3605 int numberOfDiscardedDataElements = dataSize - (numBlocks-1)*hopSize - blockSize;
3619 double tmp = log((
double) blockSize)/log(2.);
3620 double fractionalPart = tmp - ((double) ((
unsigned int) tmp));
3621 if (fractionalPart > 0.) tmp += (1. - fractionalPart);
3622 unsigned int fftSize = (
unsigned int) std::pow(2.,tmp);
3630 double modificationScale = 0.;
3631 for (
unsigned int j = 0; j < blockSize; ++j) {
3633 modificationScale += tmpValue*tmpValue;
3635 modificationScale = 1./modificationScale;
3637 std::vector<double> blockData(blockSize,0.);
3638 Fft<T> fftObj(m_env);
3639 std::vector<std::complex<double> > fftResult(0,std::complex<double>(0.,0.));
3642 unsigned int halfFFTSize = fftSize/2;
3644 psdResult.resize(1+halfFFTSize,0.);
3645 double factor = 1./M_PI/((double) numBlocks);
3648 psdResult.resize(fftSize,0.);
3649 double factor = 1./2./M_PI/((double) numBlocks);
3652 for (
unsigned int blockId = 0; blockId < numBlocks; blockId++) {
3654 unsigned int initialDataPos = initialPos + blockId*hopSize;
3655 for (
unsigned int j = 0; j < blockSize; ++j) {
3656 unsigned int dataPos = initialDataPos + j;
3658 blockData[j] =
MiscHammingWindow(blockSize-1,j) * ( m_seq[dataPos] - meanValue );
3661 fftObj.forward(blockData,fftSize,fftResult);
3671 for (
unsigned int j = 0; j < psdResult.size(); ++j) {
3672 psdResult[j] += norm(fftResult[j])*modificationScale;
3676 for (
unsigned int j = 0; j < psdResult.size(); ++j) {
3677 psdResult[j] *= factor;
3685 ScalarSequence<T>::geweke(
3686 unsigned int initialPos,
3688 double ratioNb)
const
3690 double doubleFullDataSize = (double) (this->subSequenceSize() - initialPos);
3691 ScalarSequence<T> tmpSeq(m_env,0,
"");
3692 std::vector<double> psdResult(0,0.);
3694 unsigned int dataSizeA = (
unsigned int) (doubleFullDataSize * ratioNa);
3695 double doubleDataSizeA = (double) dataSizeA;
3696 unsigned int initialPosA = initialPos;
3697 this->extractScalarSeq(initialPosA,
3701 double meanA = tmpSeq.subMeanExtra(0,
3704 (
unsigned int) std::sqrt((
double) dataSizeA),
3707 double psdA = psdResult[0];
3708 double varOfMeanA = 2.*M_PI*psdA/doubleDataSizeA;
3710 unsigned int dataSizeB = (
unsigned int) (doubleFullDataSize * ratioNb);
3711 double doubleDataSizeB = (double) dataSizeB;
3712 unsigned int initialPosB = this->subSequenceSize() - dataSizeB;
3713 this->extractScalarSeq(initialPosB,
3717 double meanB = tmpSeq.subMeanExtra(0,
3720 (
unsigned int) std::sqrt((
double) dataSizeB),
3723 double psdB = psdResult[0];
3724 double varOfMeanB = 2.*M_PI*psdB/doubleDataSizeB;
3726 if (m_env.subDisplayFile()) {
3727 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::geweke()"
3728 <<
", before computation of gewCoef"
3730 <<
", dataSizeA = " << dataSizeA
3731 <<
", numBlocksA = " << (
unsigned int) std::sqrt((
double) dataSizeA)
3732 << ", meanA = " << meanA
3733 << ", psdA = " << psdA
3734 << ", varOfMeanA = " << varOfMeanA
3736 << ", dataSizeB = " << dataSizeB
3737 << ", numBlocksB = " << (
unsigned int) std::sqrt((
double) dataSizeB)
3738 << ", meanB = " << meanB
3739 << ", psdB = " << psdB
3740 << ", varOfMeanB = " << varOfMeanB
3743 double gewCoef = (meanA - meanB)/std::sqrt(varOfMeanA + varOfMeanB);
3750 ScalarSequence<T>::meanStacc(
3751 unsigned int initialPos)
const
3762 ScalarSequence<T>::subCdfPercentageRange(
3763 unsigned int initialPos,
3764 unsigned int numPos,
3767 T& upperValue)
const
3773 ScalarSequence<T> sortedSequence(m_env,0,
"");;
3774 sortedSequence.resizeSequence(numPos);
3775 this->extractScalarSeq(initialPos,
3779 sortedSequence.subSort();
3781 unsigned int lowerId = (
unsigned int) round( 0.5*(1.-range)*((double) numPos) );
3782 lowerValue = sortedSequence[lowerId];
3784 unsigned int upperId = (
unsigned int) round( 0.5*(1.+range)*((double) numPos) );
3785 if (upperId == numPos) {
3786 upperId = upperId-1;
3789 upperValue = sortedSequence[upperId];
3796 ScalarSequence<T>::unifiedCdfPercentageRange(
3797 bool useOnlyInter0Comm,
3798 unsigned int initialPos,
3799 unsigned int numPos,
3801 T& unifiedLowerValue,
3802 T& unifiedUpperValue)
const
3804 if (m_env.numSubEnvironments() == 1) {
3805 return this->subCdfPercentageRange(initialPos,
3818 if (useOnlyInter0Comm) {
3819 if (m_env.inter0Rank() >= 0) {
3824 this->subCdfPercentageRange(initialPos,
3840 ScalarSequence<T>::subCdfStacc(
3841 unsigned int initialPos,
3842 std::vector<double>& cdfStaccValues,
3843 std::vector<double>& cdfStaccValuesUp,
3844 std::vector<double>& cdfStaccValuesLow,
3845 const ScalarSequence<T>& sortedDataValues)
const
3848 bool bRC = (initialPos < this->subSequenceSize() );
3851 unsigned int numPoints = subSequenceSize()-initialPos;
3852 double auxNumPoints = numPoints;
3853 double maxLamb = 0.;
3854 std::vector<double> ro (numPoints,0.);
3855 std::vector<double> Isam_mat(numPoints,0.);
3857 for (
unsigned int pointId = 0; pointId < numPoints; pointId++) {
3858 double p = ( ((double) pointId) + 1.0 )/auxNumPoints;
3859 double ro0 = p*(1.0-p);
3860 cdfStaccValues[pointId] = p;
3865 for (
unsigned int k = 0;
k < numPoints;
k++) {
3866 if (m_seq[
k] <= sortedDataValues[pointId]) {
3874 for (
unsigned int tau = 0; tau < (numPoints-1); tau++) {
3876 for (
unsigned int kk = 0; kk < numPoints-(tau+1); kk++) {
3877 ro[tau] += (Isam_mat[kk+tau+1]-p)*(Isam_mat[kk]-p);
3879 ro[tau] *= 1.0/auxNumPoints;
3882 for (
unsigned int tau = 0; tau < (numPoints-1); tau++) {
3883 double auxTau = tau;
3884 lamb += (1.-(auxTau+1.)/auxNumPoints)*ro[tau]/ro0;
3885 if (lamb > maxLamb) maxLamb = lamb;
3890 cdfStaccValuesUp [pointId] = cdfStaccValues[pointId]+1.96*sqrt(ro0/auxNumPoints*(1.+lamb));
3891 cdfStaccValuesLow[pointId] = cdfStaccValues[pointId]-1.96*sqrt(ro0/auxNumPoints*(1.+lamb));
3892 if (cdfStaccValuesLow[pointId] < 0.) cdfStaccValuesLow[pointId] = 0.;
3893 if (cdfStaccValuesUp [pointId] > 1.) cdfStaccValuesUp [pointId] = 1.;
3901 unsigned int dataSize = this->subSequenceSize() - initialPos;
3902 unsigned int numEvals = evaluationPositions.size();
3904 for (
unsigned int j = 0; j < numEvals; ++j) {
3905 double x = evaluationPositions[j];
3907 for (
unsigned int k = 0;
k < dataSize; ++
k) {
3908 double xk = m_seq[initialPos+
k];
3911 cdfStaccValues[j] = value/(double) dataSize;
3920 ScalarSequence<T>::subCdfStacc(
3921 unsigned int initialPos,
3922 const std::vector<T>& evaluationPositions,
3923 std::vector<double>& cdfStaccValues)
const
3927 bool bRC = ((initialPos < this->subSequenceSize() ) &&
3928 (0 < evaluationPositions.size()) &&
3929 (evaluationPositions.size() == cdfStaccValues.size() ));
3939 unsigned int dataSize = this->subSequenceSize() - initialPos;
3940 unsigned int numEvals = evaluationPositions.size();
3942 for (
unsigned int j = 0; j < numEvals; ++j) {
3945 for (
unsigned int k = 0;
k < dataSize; ++
k) {
3949 cdfStaccValues[j] = value/(double) dataSize;
3955 #endif // #ifdef QUESO_COMPUTES_EXTRA_POST_PROCESSING_STATISTICS
3965 unsigned int initialPos,
3968 const std::vector<T>& evaluationPositions1,
3969 const std::vector<T>& evaluationPositions2,
3970 std::vector<double>& densityValues)
3974 double covValue = 0.;
3975 double corrValue = 0.;
3984 (0 < evaluationPositions1.size() ) &&
3985 (evaluationPositions1.size() == evaluationPositions2.size() ) &&
3986 (evaluationPositions1.size() == densityValues.size() ));
3990 unsigned int numEvals = evaluationPositions1.size();
3992 double scale1Inv = 1./scaleValue1;
3993 double scale2Inv = 1./scaleValue2;
3995 double r = 1. - corrValue*corrValue;
3997 std::cerr <<
"In ComputeSubGaussian2dKde()"
3998 <<
": WARNING, r = " << r
4005 for (
unsigned int j = 0; j < numEvals; ++j) {
4006 double x1 = evaluationPositions1[j];
4007 double x2 = evaluationPositions2[j];
4009 for (
unsigned int k = 0;
k < dataSize; ++
k) {
4010 double d1k = scale1Inv*(x1 - scalarSeq1[initialPos+
k]);
4011 double d2k = scale2Inv*(x2 - scalarSeq2[initialPos+
k]);
4012 value += exp(-.5*( d1k*d1k + 2*corrValue*d1k*d2k + d2k*d2k )/r);
4014 densityValues[j] = scale1Inv * scale2Inv * (value/(double) dataSize) / 2. / M_PI / sqrt(r);
4025 unsigned int initialPos,
4026 double unifiedScaleValue1,
4027 double unifiedScaleValue2,
4028 const std::vector<T>& unifiedEvaluationPositions1,
4029 const std::vector<T>& unifiedEvaluationPositions2,
4030 std::vector<double>& unifiedDensityValues)
4038 unifiedEvaluationPositions1,
4039 unifiedEvaluationPositions2,
4040 unifiedDensityValues);
4045 if (useOnlyInter0Comm) {
4056 unifiedEvaluationPositions1,
4057 unifiedEvaluationPositions2,
4058 unifiedDensityValues);
4075 unsigned int subNumSamples,
4094 for (
unsigned k = 0;
k < subNumSamples; ++
k) {
4096 tmpP = subPSeq[
k] - unifiedMeanP;
4097 tmpQ = subQSeq[
k] - unifiedMeanQ;
4098 covValue += tmpP*tmpQ;
4114 unsigned int unifiedNumSamples = 0;
4116 "ComputeCovCorrBetweenScalarSequences()",
4117 "failed MPI.Allreduce() for subNumSamples");
4121 "ComputeCovCorrBetweenScalarSequences()",
4122 "failed MPI.Allreduce() for a matrix position");
4123 covValue = aux/((double) (unifiedNumSamples-1));
4125 corrValue = covValue/std::sqrt(unifiedSampleVarianceP)/std::sqrt(unifiedSampleVarianceQ);
4127 if ((corrValue < -1.) || (corrValue > 1.)) {
4128 std::cerr <<
"In ComputeCovCorrBetweenScalarSequences()"
4129 <<
": computed correlation is out of range, corrValue = " << corrValue
void writeSubMatlabHeader(std::ofstream &ofs, double sequenceSize) const
Helper function to write header info for matlab files from one chain.
void erasePositions(unsigned int initialPos, unsigned int numPos)
Erases numPos values of the sequence, starting at position initialPos.
T subMeanExtra(unsigned int initialPos, unsigned int numPos) const
Finds the mean value of the sub-sequence, considering numPos positions starting at position initialPo...
void unifiedGaussian1dKde(bool useOnlyInter0Comm, unsigned int initialPos, double unifiedScaleValue, const std::vector< T > &unifiedEvaluationPositions, std::vector< double > &unifiedDensityValues) const
Gaussian kernel for the KDE estimate of the unified sequence.
T subPositionsOfMaximum(const ScalarSequence< T > &subCorrespondingScalarValues, ScalarSequence< T > &subPositionsOfMaximum)
Finds the positions where the maximum element occurs in the sub-sequence.
double MiscGetEllapsedSeconds(struct timeval *timeval0)
void subUniformlySampledCdf(unsigned int numIntervals, T &minDomainValue, T &maxDomainValue, std::vector< T > &cdfValues) const
Uniformly samples from the CDF from the sub-sequence.
void unifiedSort(bool useOnlyInter0Comm, unsigned int initialPos, ScalarSequence< T > &unifiedSortedSequence) const
Sorts the unified sequence of scalars.
#define queso_require_greater_equal_msg(expr1, expr2, msg)
void unifiedMinMaxExtra(bool useOnlyInter0Comm, unsigned int initialPos, unsigned int numPos, T &unifiedMinValue, T &unifiedMaxValue) const
Finds the minimum and the maximum values of the unified sequence, considering numPos positions starti...
const T & unifiedMeanPlain(bool useOnlyInter0Comm) const
Finds the mean value of the unified sequence of scalars.
std::ifstream * ifsVar
Provides a stream interface to read data from files.
const T & unifiedMinPlain(bool useOnlyInter0Comm) const
Finds the minimum value of the unified sequence of scalars.
void autoCorrViaFft(unsigned int initialPos, unsigned int numPos, unsigned int maxLag, std::vector< T > &autoCorrs) const
Calculates the autocorrelation via Fast Fourier transforms (FFT).
and that you are informed that you can do these things To protect your we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it For if you distribute copies of the whether gratis or for a you must give the recipients all the rights that we gave you You must make sure that receive or can get the source code If you link other code with the you must provide complete object files to the so that they can relink them with the library after making changes to the library and recompiling it And you must show them these terms so they know their rights We protect your rights with a two step which gives you legal permission to copy
const T & operator[](unsigned int posId) const
Access position posId of the sequence of scalars (const).
void unifiedReadContents(const std::string &fileName, const std::string &fileType, const unsigned int subSequenceSize)
Reads the unified sequence from a file.
std::vector< T > & rawData()
The sequence of scalars. Access to private attribute m_seq.
std::vector< T >::const_iterator seqScalarPositionConstIteratorTypedef
T unifiedScaleForKde(bool useOnlyInter0Comm, unsigned int initialPos, const T &unifiedIqrValue, unsigned int kdeDimension) const
Selects the scales (bandwidth) for the kernel density estimation, considering the unified sequence...
void ComputeUnifiedGaussian2dKde(bool useOnlyInter0Comm, const ScalarSequence< T > &scalarSeq1, const ScalarSequence< T > &scalarSeq2, unsigned int initialPos, double unifiedScaleValue1, double unifiedScaleValue2, const std::vector< T > &unifiedEvaluationPositions1, const std::vector< T > &unifiedEvaluationPositions2, std::vector< double > &unifiedDensityValues)
This (virtual) class sets up the environment underlying the use of the QUESO library by an executable...
void clear()
Clears the sequence of scalars.
void append(const ScalarSequence< T > &src, unsigned int srcInitialPos, unsigned int srcNumPos)
Appends the scalar sequence src to this sequence.
T unifiedPopulationVariance(bool useOnlyInter0Comm, unsigned int initialPos, unsigned int numPos, const T &unifiedMeanValue) const
Finds the population variance of the unified sequence, considering numPos positions starting at posit...
ScalarSequence< T > & operator=(const ScalarSequence< T > &rhs)
Assignment operator; it copies rhs to this.
int inter0Rank() const
Returns the process inter0 rank.
double MiscGaussianDensity(double x, double mu, double sigma)
T subSampleStd(unsigned int initialPos, unsigned int numPos, const T &meanValue) const
Finds the sample standard deviation of the unified sequence, considering numPos positions starting at...
T subMedianExtra(unsigned int initialPos, unsigned int numPos) const
Finds the median value of the sub-sequence, considering numPos positions starting at position initial...
void subBasicHistogram(unsigned int initialPos, const T &minHorizontalValue, const T &maxHorizontalValue, UniformOneDGrid< T > *&gridValues, std::vector< unsigned int > &bins) const
Calculates the histogram of the sub-sequence.
T brooksGelmanConvMeasure(bool useOnlyInter0Comm, unsigned int initialPos, unsigned int spacing) const
Estimates convergence rate using Brooks & Gelman method.
void extractRawData(unsigned int initialPos, unsigned int spacing, unsigned int numPos, std::vector< double > &rawData) const
Extracts the raw data.
void inverse(const std::vector< T > &data, unsigned int fftSize, std::vector< std::complex< double > > &result)
Calculates the inverse Fourier transform for real and complex data.
#define queso_require_equal_to_msg(expr1, expr2, msg)
#define UQ_FILE_EXTENSION_FOR_HDF_FORMAT
void parallelMerge(std::vector< T > &sortedBuffer, const std::vector< T > &leafData, unsigned int treeLevel) const
Sorts/merges data in parallel using MPI.
const std::string & name() const
Access to the name of the sequence of scalars.
#define queso_require_less_msg(expr1, expr2, msg)
unsigned int unifiedSequenceSize(bool useOnlyInter0Comm) const
Size of the unified sequence of scalars.
void setName(const std::string &newName)
Sets a new name to the sequence of scalars.
void unifiedHistogram(bool useOnlyInter0Comm, unsigned int initialPos, const T &unifiedMinHorizontalValue, const T &unifiedMaxHorizontalValue, std::vector< T > &unifiedCenters, std::vector< unsigned int > &unifiedBins) const
Calculates the histogram of the unified sequence.
T unifiedPositionsOfMaximum(const ScalarSequence< T > &subCorrespondingScalarValues, ScalarSequence< T > &unifiedPositionsOfMaximum)
Finds the positions where the maximum element occurs in the unified sequence.
void subWeightCdf(unsigned int numIntervals, std::vector< T > &gridValues, std::vector< T > &cdfValues) const
Finds the Weighted Cumulative Distribution Function (CDF) of the sub-sequence of scalars.
Class for handling scalar samples.
T unifiedInterQuantileRange(bool useOnlyInter0Comm, unsigned int initialPos) const
Returns the interquartile range of the values in the unified sequence.
void unifiedUniformlySampledCdf(bool useOnlyInter0Comm, unsigned int numIntervals, T &unifiedMinDomainValue, T &unifiedMaxDomainValue, std::vector< T > &unifiedCdfValues) const
Uniformly samples from the CDF from the unified sequence.
#define UQ_FILE_EXTENSION_FOR_TXT_FORMAT
Struct for handling data input and output from files.
void filter(unsigned int initialPos, unsigned int spacing)
Filters positions in the sequence of vectors.
const T & subMinPlain() const
Finds the minimum value of the sub-sequence of scalars.
ScalarSequence(const BaseEnvironment &env, unsigned int subSequenceSize, const std::string &name)
Default constructor.
double MiscHammingWindow(unsigned int N, unsigned int j)
Class for accommodating uniform one-dimensional grids.
T unifiedMedianExtra(bool useOnlyInter0Comm, unsigned int initialPos, unsigned int localNumPos) const
Finds the median value of the unified sequence, considering numPos positions starting at position ini...
#define RawValue_MPI_DOUBLE
void subGaussian1dKde(unsigned int initialPos, double scaleValue, const std::vector< T > &evaluationPositions, std::vector< double > &densityValues) const
Gaussian kernel for the KDE estimate of the sub-sequence.
#define RawValue_MPI_UNSIGNED
void copy(const ScalarSequence< T > &src)
Copies the scalar sequence src to this.
T subPopulationVariance(unsigned int initialPos, unsigned int numPos, const T &meanValue) const
Finds the population variance of the sub-sequence, considering numPos positions starting at position ...
void ComputeSubGaussian2dKde(const ScalarSequence< T > &scalarSeq1, const ScalarSequence< T > &scalarSeq2, unsigned int initialPos, double scaleValue1, double scaleValue2, const std::vector< T > &evaluationPositions1, const std::vector< T > &evaluationPositions2, std::vector< double > &densityValues)
const T & unifiedSampleVariancePlain(bool useOnlyInter0Comm) const
Finds the variance of a sample of the unified sequence of scalars.
void subWriteContents(unsigned int initialPos, unsigned int numPos, const std::string &fileName, const std::string &fileType, const std::set< unsigned int > &allowedSubEnvIds) const
Writes the sub-sequence to a file.
void subSort(unsigned int initialPos, ScalarSequence< T > &sortedSequence) const
Sorts the sub-sequence of scalars.
T subInterQuantileRange(unsigned int initialPos) const
Returns the interquartile range of the values in the sub-sequence.
const T & subMeanPlain() const
Finds the mean value of the sub-sequence of scalars.
#define RawValue_MPI_ANY_SOURCE
T unifiedSampleStd(bool useOnlyInter0Comm, unsigned int initialPos, unsigned int localNumPos, const T &unifiedMeanValue) const
Finds the sample standard deviation of the unified sequence, considering localnumPos positions starti...
void setUniform(const T &a, const T &b)
Sets the values of the sequence as a uniform distribution between the values given by vectors aVec an...
void getUnifiedContentsAtProc0Only(bool useOnlyInter0Comm, std::vector< T > &outputVec) const
Gets the unified contents of processor of rank equals to 0.
#define queso_not_implemented()
const T & unifiedMaxPlain(bool useOnlyInter0Comm) const
Finds the maximum value of the unified sequence of scalars.
~ScalarSequence()
Destructor.
T subScaleForKde(unsigned int initialPos, const T &iqrValue, unsigned int kdeDimension) const
Selects the scales (output value) for the kernel density estimation, considering only the sub-sequenc...
void extractScalarSeq(unsigned int initialPos, unsigned int spacing, unsigned int numPos, ScalarSequence< T > &scalarSeq) const
Extracts a sequence of scalars.
unsigned int numSubEnvironments() const
Access function to the number of sub-environments.
void unifiedWriteContents(const std::string &fileName, const std::string &fileType) const
Writes the unified sequence to a file.
std::ofstream * ofsVar
Provides a stream interface to write data to files.
void resizeSequence(unsigned int newSequenceSize)
Resizes the size of the sequence of scalars.
const T & subSampleVariancePlain() const
Finds the variance of a sample of the sub-sequence of scalars.
void subBasicCdf(unsigned int numIntervals, UniformOneDGrid< T > *&gridValues, std::vector< T > &cdfValues) const
Finds the Cumulative Distribution Function (CDF) of the sub-sequence of scalars.
#define queso_require_not_equal_to_msg(expr1, expr2, msg)
void deleteStoredScalars()
Deletes all stored scalars.
void subWeightHistogram(unsigned int initialPos, const T &minHorizontalValue, const T &maxHorizontalValue, UniformOneDGrid< T > *&gridValues, std::vector< unsigned int > &bins) const
Calculates the weighted histogram of the sub-sequence.
T unifiedSampleVarianceExtra(bool useOnlyInter0Comm, unsigned int initialPos, unsigned int localNumPos, const T &unifiedMeanValue) const
Finds the sample variance of the unified sequence, considering numPos positions starting at position ...
#define SCALAR_SEQUENCE_INIT_MPI_MSG
#define queso_require_less_equal_msg(expr1, expr2, msg)
void setGaussian(const T &mean, const T &stdDev)
Sets the values of the sequence as a Gaussian distribution of mean given by meanVec and standard devi...
std::vector< T >::iterator seqScalarPositionIteratorTypedef
#define UQ_FILE_EXTENSION_FOR_MATLAB_FORMAT
#define queso_require_msg(asserted, msg)
void writeUnifiedMatlabHeader(std::ofstream &ofs, double sequenceSize) const
Helper function to write header info for matlab files from all chains.
void subSort()
Sorts the sequence of scalars in the private attribute m_seq.
#define SCALAR_SEQUENCE_SIZE_MPI_MSG
void ComputeCovCorrBetweenScalarSequences(const ScalarSequence< T > &subPSeq, const ScalarSequence< T > &subQSeq, unsigned int subNumSamples, T &covValue, T &corrValue)
const T & unifiedMedianPlain(bool useOnlyInter0Comm) const
Finds the median value of the unified sequence of scalars.
void resetValues(unsigned int initialPos, unsigned int)
Sets numPos values of the sequence to zero, starting at position initialPos.
void subMinMaxExtra(unsigned int initialPos, unsigned int numPos, T &minValue, T &maxValue) const
Finds the minimum and the maximum values of the sub-sequence, considering numPos positions starting a...
T unifiedMeanExtra(bool useOnlyInter0Comm, unsigned int initialPos, unsigned int localNumPos) const
Finds the mean value of the unified sequence of numPos positions starting at position initialPos...
#define queso_error_msg(msg)
T autoCovariance(unsigned int initialPos, unsigned int numPos, const T &meanValue, unsigned int lag) const
Calculates the autocovariance.
void writeTxtHeader(std::ofstream &ofs, double sequenceSize) const
Helper function to write txt info for matlab files.
const BaseEnvironment & env() const
Access to QUESO environment.
void forward(const std::vector< T > &data, unsigned int fftSize, std::vector< std::complex< double > > &result)
Calculates the forward Fourier transform (for real data. TODO: complex data).
T autoCorrViaDef(unsigned int initialPos, unsigned int numPos, unsigned int lag) const
Calculates the autocorrelation via definition.
#define SCALAR_SEQUENCE_DATA_MPI_MSG
unsigned int subSequenceSize() const
Size of the sub-sequence of scalars.
const T & subMedianPlain() const
Finds the median value of the sub-sequence of scalars.
const MpiComm & inter0Comm() const
Access function for MpiComm inter0-communicator.
Class for a Fast Fourier Transform (FFT) algorithm.
const T & subMaxPlain() const
Finds the maximum value of the sub-sequence of scalars.
void subHistogram(unsigned int initialPos, const T &minHorizontalValue, const T &maxHorizontalValue, std::vector< T > ¢ers, std::vector< unsigned int > &bins) const
Calculates the histogram of the sub-sequence.
T subSampleVarianceExtra(unsigned int initialPos, unsigned int numPos, const T &meanValue) const
Finds the sample variance of the sub-sequence, considering numPos positions starting at position init...