25 #include <queso/ScalarSequence.h>
33 unsigned int subSequenceSize,
34 const std::string& name)
38 m_seq (subSequenceSize,0.),
40 m_unifiedMinPlain (NULL),
42 m_unifiedMaxPlain (NULL),
43 m_subMeanPlain (NULL),
44 m_unifiedMeanPlain (NULL),
45 m_subMedianPlain (NULL),
46 m_unifiedMedianPlain (NULL),
47 m_subSampleVariancePlain (NULL),
48 m_unifiedSampleVariancePlain(NULL)
55 deleteStoredScalars();
70 if (posId >= this->subSequenceSize()) {
71 std::cerr <<
"In ScalarSequence<T>::operator[]() const"
72 <<
": posId = " << posId
73 <<
", this->subSequenceSize() = " << this->subSequenceSize()
78 "ScalarSequences<T>::operator[] const",
79 "posId > subSequenceSize()");
88 if (posId >= this->subSequenceSize()) {
89 std::cerr <<
"In ScalarSequence<T>::operator[]()"
90 <<
": posId = " << posId
91 <<
", this->subSequenceSize() = " << this->subSequenceSize()
96 "ScalarSequences<T>::operator[]",
97 "posId > subSequenceSize()");
99 deleteStoredScalars();
130 unsigned int numPos = this->subSequenceSize();
132 this->resetValues(0,numPos);
133 this->resizeSequence(0);
150 if (m_env.numSubEnvironments() == 1) {
151 return this->subSequenceSize();
156 unsigned int unifiedNumSamples = 0;
157 if (useOnlyInter0Comm) {
158 if (m_env.inter0Rank() >= 0) {
159 unsigned int subNumSamples = this->subSequenceSize();
161 "ScalarSequence<T>::unifiedSequenceSize()",
162 "failed MPI.Allreduce() for unifiedSequenceSize()");
166 unifiedNumSamples = this->subSequenceSize();
172 "ScalarSequence<T>::unifiedSequenceSize()",
173 "parallel vectors not supported yet");
176 return unifiedNumSamples;
183 if (newSequenceSize != this->subSequenceSize()) {
184 m_seq.resize(newSequenceSize,0.);
185 std::vector<T>(m_seq).swap(m_seq);
186 deleteStoredScalars();
196 if (this->subSequenceSize() == 0)
return;
198 bool bRC = ((initialPos < this->subSequenceSize()) &&
200 ((initialPos+numPos) <= this->subSequenceSize()));
203 "ScalarSequences<T>::resetValues()",
204 "invalid input data");
206 for (
unsigned int j = 0; j < numPos; ++j) {
207 m_seq[initialPos+j] = 0.;
210 deleteStoredScalars();
219 if (this->subSequenceSize() == 0)
return;
221 bool bRC = ((initialPos < this->subSequenceSize()) &&
223 ((initialPos+numPos) <= this->subSequenceSize()));
226 "ScalarSequences<T>::erasePositions()",
227 "invalid input data");
230 if (initialPos < this->subSequenceSize()) std::advance(posIteratorBegin,initialPos);
231 else posIteratorBegin = m_seq.end();
233 unsigned int posEnd = initialPos + numPos - 1;
235 if (posEnd < this->subSequenceSize()) std::advance(posIteratorEnd,posEnd);
236 else posIteratorEnd = m_seq.end();
238 unsigned int oldSequenceSize = this->subSequenceSize();
239 m_seq.erase(posIteratorBegin,posIteratorEnd);
242 "ScalarSequences<T>::erasePositions()",
243 "(oldSequenceSize - numPos) != this->subSequenceSize()");
245 deleteStoredScalars();
253 bool useOnlyInter0Comm,
254 std::vector<T>& outputVec)
const
262 if (useOnlyInter0Comm) {
263 if (m_env.inter0Rank() >= 0) {
264 int auxSubSize = (int) this->subSequenceSize();
265 unsigned int auxUnifiedSize = this->unifiedSequenceSize(useOnlyInter0Comm);
266 outputVec.resize(auxUnifiedSize,0.);
271 std::vector<int> recvcnts(m_env.inter0Comm().NumProc(),0);
273 "ScalarSequence<T>::getUnifiedContentsAtProc0Only()",
274 "failed MPI.Gather()");
275 if (m_env.inter0Rank() == 0) {
279 "ScalarSequence<T>::getUnifiedContentsAtProc0Only()",
280 "failed MPI.Gather() result at proc 0");
283 std::vector<int> displs(m_env.inter0Comm().NumProc(),0);
284 for (
unsigned int r = 1; r < (
unsigned int) m_env.inter0Comm().NumProc(); ++r) {
285 displs[r] = displs[r-1] + recvcnts[r-1];
288 #if 0 // for debug only
289 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
290 for (
unsigned int r = 0; r < (
unsigned int) m_env.inter0Comm().NumProc(); ++r) {
291 *m_env.subDisplayFile() <<
" auxSubSize = " << auxSubSize
292 <<
", recvcnts[" << r <<
"] = " << recvcnts[r]
293 <<
", displs[" << r <<
"] = " << displs[r]
294 <<
", m_seq.size() = " << m_seq.size()
295 <<
", outputVec.size() = " << outputVec.size()
298 for (
unsigned int i = 0; i < m_seq.size(); ++i) {
299 *m_env.subDisplayFile() <<
" (before gatherv) m_seq[" << i <<
"]= " << m_seq[i]
305 "ScalarSequence<T>::getUnifiedContentsAtProc0Only()",
306 "failed MPI.Gatherv()");
308 #if 0 // for debug only
309 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
310 for (
unsigned int i = 0; i < m_seq.size(); ++i) {
311 *m_env.subDisplayFile() <<
" (after gatherv) m_seq[" << i <<
"]= " << m_seq[i]
314 for (
unsigned int i = 0; i < outputVec.size(); ++i) {
315 *m_env.subDisplayFile() <<
" (after gatherv) outputVec[" << i <<
"]= " << outputVec[i]
321 #if 0 // for debug only
322 if (m_env.inter0Rank() == 0) {
323 for (
unsigned int i = 0; i < auxSubSize; ++i) {
324 outputVec[i] = m_seq[i];
327 "ScalarSequence<T>::getUnifiedContentsAtProc0Only(1)",
328 "failed MPI.Gatherv()");
332 "ScalarSequence<T>::getUnifiedContentsAtProc0Only(2)",
333 "failed MPI.Gatherv()");
335 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
336 for (
unsigned int i = 0; i < m_seq.size(); ++i) {
337 *m_env.subDisplayFile() <<
" (after 2nd gatherv) m_seq[" << i <<
"]= " << m_seq[i]
340 for (
unsigned int i = 0; i < outputVec.size(); ++i) {
341 *m_env.subDisplayFile() <<
" (after 2nd gatherv) outputVec[" << i <<
"]= " << outputVec[i]
355 "ScalarSequence<T>::getUnifiedContentsAtProc0Only()",
356 "parallel vectors not supported yet");
366 if (m_subMinPlain == NULL) {
367 m_subMinPlain =
new T(0.);
368 if (m_subMaxPlain == NULL) m_subMaxPlain =
new T(0.);
369 subMinMaxExtra(0,this->subSequenceSize(),*m_subMinPlain,*m_subMaxPlain);
372 return *m_subMinPlain;
379 if (m_unifiedMinPlain == NULL) {
380 m_unifiedMinPlain =
new T(0.);
381 if (m_unifiedMaxPlain == NULL) m_unifiedMaxPlain =
new T(0.);
382 unifiedMinMaxExtra(useOnlyInter0Comm,0,this->subSequenceSize(),*m_unifiedMinPlain,*m_unifiedMaxPlain);
385 return *m_unifiedMinPlain;
392 if (m_subMaxPlain == NULL) {
393 if (m_subMinPlain == NULL) m_subMinPlain =
new T(0.);
394 m_subMaxPlain =
new T(0.);
395 subMinMaxExtra(0,this->subSequenceSize(),*m_subMinPlain,*m_subMaxPlain);
398 return *m_subMaxPlain;
405 if (m_unifiedMaxPlain == NULL) {
406 if (m_unifiedMinPlain == NULL) m_unifiedMinPlain =
new T(0.);
407 m_unifiedMaxPlain =
new T(0.);
408 unifiedMinMaxExtra(useOnlyInter0Comm,0,this->subSequenceSize(),*m_unifiedMinPlain,*m_unifiedMaxPlain);
411 return *m_unifiedMaxPlain;
418 if (m_subMeanPlain == NULL) {
419 m_subMeanPlain =
new T(0.);
420 *m_subMeanPlain = subMeanExtra(0,subSequenceSize());
423 return *m_subMeanPlain;
430 if (m_unifiedMeanPlain == NULL) {
431 m_unifiedMeanPlain =
new T(0.);
432 *m_unifiedMeanPlain = unifiedMeanExtra(useOnlyInter0Comm,0,subSequenceSize());
435 return *m_unifiedMeanPlain;
442 if (m_subMedianPlain == NULL) {
443 m_subMedianPlain =
new T(0.);
444 *m_subMedianPlain = subMedianExtra(0,subSequenceSize());
447 return *m_subMedianPlain;
454 if (m_unifiedMedianPlain == NULL) {
455 m_unifiedMedianPlain =
new T(0.);
456 *m_unifiedMedianPlain = unifiedMedianExtra(useOnlyInter0Comm,0,subSequenceSize());
459 return *m_unifiedMedianPlain;
466 if (m_subSampleVariancePlain == NULL) {
467 m_subSampleVariancePlain =
new T(0.);
468 *m_subSampleVariancePlain = subSampleVarianceExtra(0,subSequenceSize(),subMeanPlain());
471 return *m_subSampleVariancePlain;
478 if (m_unifiedSampleVariancePlain == NULL) {
479 m_unifiedSampleVariancePlain =
new T(0.);
480 *m_unifiedSampleVariancePlain = unifiedSampleVarianceExtra(useOnlyInter0Comm,0,subSequenceSize(),unifiedMeanPlain(useOnlyInter0Comm));
483 return *m_unifiedSampleVariancePlain;
491 delete m_subMinPlain;
492 m_subMinPlain = NULL;
494 if (m_unifiedMinPlain) {
495 delete m_unifiedMinPlain;
496 m_unifiedMinPlain = NULL;
499 delete m_subMaxPlain;
500 m_subMaxPlain = NULL;
502 if (m_unifiedMaxPlain) {
503 delete m_unifiedMaxPlain;
504 m_unifiedMaxPlain = NULL;
506 if (m_subMeanPlain) {
507 delete m_subMeanPlain;
508 m_subMeanPlain = NULL;
510 if (m_unifiedMeanPlain) {
511 delete m_unifiedMeanPlain;
512 m_unifiedMeanPlain = NULL;
514 if (m_subMedianPlain) {
515 delete m_subMedianPlain;
516 m_subMedianPlain = NULL;
518 if (m_unifiedMedianPlain) {
519 delete m_unifiedMedianPlain;
520 m_unifiedMedianPlain = NULL;
522 if (m_subSampleVariancePlain) {
523 delete m_subSampleVariancePlain;
524 m_subSampleVariancePlain = NULL;
526 if (m_unifiedSampleVariancePlain) {
527 delete m_unifiedSampleVariancePlain;
528 m_unifiedSampleVariancePlain = NULL;
538 unsigned int maxJ = this->subSequenceSize();
539 if (meanValue == 0.) {
540 for (
unsigned int j = 0; j < maxJ; ++j) {
541 m_seq[j] = m_env.rngObject()->gaussianSample(stdDev);
545 for (
unsigned int j = 0; j < maxJ; ++j) {
546 m_seq[j] = meanValue + m_env.rngObject()->gaussianSample(stdDev);
550 deleteStoredScalars();
559 unsigned int maxJ = this->subSequenceSize();
562 for (
unsigned int j = 0; j < maxJ; ++j) {
563 m_seq[j] = m_env.rngObject()->uniformSample();
567 for (
unsigned int j = 0; j < maxJ; ++j) {
568 m_seq[j] = b*m_env.rngObject()->uniformSample();
574 for (
unsigned int j = 0; j < maxJ; ++j) {
575 m_seq[j] = a + m_env.rngObject()->uniformSample();
579 for (
unsigned int j = 0; j < maxJ; ++j) {
580 m_seq[j] = a + (b-a)*m_env.rngObject()->uniformSample();
585 deleteStoredScalars();
593 unsigned int numEvaluationPoints,
596 std::vector<T>& cdfValues)
const
600 std::vector<T> centers(numEvaluationPoints,0.);
601 std::vector<unsigned int> bins (numEvaluationPoints,0);
604 this->subSequenceSize(),
613 minDomainValue = centers[0];
614 maxDomainValue = centers[centers.size()-1];
616 unsigned int sumOfBins = 0;
617 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
618 sumOfBins += bins[i];
622 cdfValues.resize(numEvaluationPoints);
623 unsigned int partialSum = 0;
624 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
625 partialSum += bins[i];
626 cdfValues[i] = ((T) partialSum)/((T) sumOfBins);
635 bool useOnlyInter0Comm,
636 unsigned int numEvaluationPoints,
637 T& unifiedMinDomainValue,
638 T& unifiedMaxDomainValue,
639 std::vector<T>& unifiedCdfValues)
const
641 if (m_env.numSubEnvironments() == 1) {
642 return this->subUniformlySampledCdf(numEvaluationPoints,
643 unifiedMinDomainValue,
644 unifiedMaxDomainValue,
651 if (useOnlyInter0Comm) {
652 if (m_env.inter0Rank() >= 0) {
653 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
654 *m_env.subDisplayFile() <<
"Entering ScalarSequence<T>::unifiedUniformlySampledCdf()"
658 T unifiedTmpMinValue;
659 T unifiedTmpMaxValue;
660 std::vector<T> unifiedCenters(numEvaluationPoints,0.);
661 std::vector<unsigned int> unifiedBins (numEvaluationPoints,0);
663 this->unifiedMinMaxExtra(useOnlyInter0Comm,
665 this->subSequenceSize(),
668 this->unifiedHistogram(useOnlyInter0Comm,
675 unifiedMinDomainValue = unifiedCenters[0];
676 unifiedMaxDomainValue = unifiedCenters[unifiedCenters.size()-1];
678 unsigned int unifiedTotalSumOfBins = 0;
679 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
680 unifiedTotalSumOfBins += unifiedBins[i];
683 std::vector<unsigned int> unifiedPartialSumsOfBins(numEvaluationPoints,0);
684 unifiedPartialSumsOfBins[0] = unifiedBins[0];
685 for (
unsigned int i = 1; i < numEvaluationPoints; ++i) {
686 unifiedPartialSumsOfBins[i] = unifiedPartialSumsOfBins[i-1] + unifiedBins[i];
689 unifiedCdfValues.clear();
690 unifiedCdfValues.resize(numEvaluationPoints);
691 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
692 unifiedCdfValues[i] = ((T) unifiedPartialSumsOfBins[i])/((T) unifiedTotalSumOfBins);
695 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
696 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
697 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedUniformlySampledCdf()"
699 <<
", unifiedTmpMinValue = " << unifiedTmpMinValue
700 <<
", unifiedTmpMaxValue = " << unifiedTmpMaxValue
701 <<
", unifiedBins = " << unifiedBins[i]
702 <<
", unifiedCdfValue = " << unifiedCdfValues[i]
703 <<
", unifiedPartialSumsOfBins = " << unifiedPartialSumsOfBins[i]
704 <<
", unifiedTotalSumOfBins = " << unifiedTotalSumOfBins
709 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
710 *m_env.subDisplayFile() <<
"Leaving ScalarSequence<T>::unifiedUniformlySampledCdf()"
716 this->subUniformlySampledCdf(numEvaluationPoints,
717 unifiedMinDomainValue,
718 unifiedMaxDomainValue,
725 "ScalarSequence<T>::unifiedUniformlySampledCdf()",
726 "parallel vectors not supported yet");
737 unsigned int numEvaluationPoints,
739 std::vector<T>& cdfValues)
const
743 std::vector<unsigned int> bins(numEvaluationPoints,0);
746 this->subSequenceSize(),
755 unsigned int sumOfBins = 0;
756 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
757 sumOfBins += bins[i];
761 cdfValues.resize(numEvaluationPoints);
762 unsigned int partialSum = 0;
763 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
764 partialSum += bins[i];
765 cdfValues[i] = ((T) partialSum)/((T) sumOfBins);
774 unsigned int numEvaluationPoints,
775 std::vector<T>& gridValues,
776 std::vector<T>& cdfValues)
const
780 std::vector<unsigned int> bins(numEvaluationPoints,0);
781 gridValues.resize (numEvaluationPoints,0.);
782 cdfValues.resize (numEvaluationPoints,0.);
785 this->subSequenceSize(),
789 if (tmpMinValue == tmpMaxValue) {
790 if (tmpMinValue < -1.e-12) {
791 tmpMinValue += tmpMinValue*(1.e-8);
793 else if (tmpMinValue > 1.e-12) {
794 tmpMinValue -= tmpMinValue*(1.e-8);
797 tmpMinValue = 1.e-12;
801 subWeightHistogram(0,
807 unsigned int sumOfBins = 0;
808 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
809 sumOfBins += bins[i];
813 cdfValues.resize(numEvaluationPoints);
814 unsigned int partialSum = 0;
815 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
816 partialSum += bins[i];
817 cdfValues[i] = ((T) partialSum)/((T) sumOfBins);
826 unsigned int numEvaluationPoints,
828 std::vector<T>& cdfValues)
const
832 std::vector<unsigned int> bins(numEvaluationPoints,0);
835 this->subSequenceSize(),
838 subWeightHistogram(0,
844 unsigned int sumOfBins = 0;
845 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
846 sumOfBins += bins[i];
850 cdfValues.resize(numEvaluationPoints);
851 unsigned int partialSum = 0;
852 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
853 partialSum += bins[i];
854 cdfValues[i] = ((T) partialSum)/((T) sumOfBins);
863 unsigned int initialPos,
864 unsigned int numPos)
const
866 if (this->subSequenceSize() == 0)
return 0.;
868 bool bRC = ((initialPos < this->subSequenceSize()) &&
870 ((initialPos+numPos) <= this->subSequenceSize()));
872 std::cerr <<
"In ScalarSequence<T>::subMeanExtra()"
873 <<
": ERROR at fullRank " << m_env.fullRank()
874 <<
", initialPos = " << initialPos
875 <<
", numPos = " << numPos
876 <<
", this->subSequenceSize() = " << this->subSequenceSize()
878 if (m_env.subDisplayFile()) {
879 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::subMeanExtra()"
880 <<
": ERROR at fullRank " << m_env.fullRank()
881 <<
", initialPos = " << initialPos
882 <<
", numPos = " << numPos
883 <<
", this->subSequenceSize() = " << this->subSequenceSize()
889 "ScalarSequence<T>::subMeanExtra()",
890 "invalid input data");
892 unsigned int finalPosPlus1 = initialPos + numPos;
894 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
898 return tmpSum/(T) numPos;
904 bool useOnlyInter0Comm,
905 unsigned int initialPos,
906 unsigned int numPos)
const
908 if (m_env.numSubEnvironments() == 1) {
909 return this->subMeanExtra(initialPos,
915 T unifiedMeanValue = 0.;
916 if (useOnlyInter0Comm) {
917 if (m_env.inter0Rank() >= 0) {
918 bool bRC = ((initialPos < this->subSequenceSize()) &&
920 ((initialPos+numPos) <= this->subSequenceSize()));
923 "ScalarSequence<T>::unifiedMeanExtra()",
924 "invalid input data");
926 unsigned int finalPosPlus1 = initialPos + numPos;
928 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
929 localSum += m_seq[j];
932 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
933 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMeanExtra()"
934 <<
": initialPos = " << initialPos
935 <<
", numPos = " << numPos
936 <<
", before MPI.Allreduce"
942 unsigned int unifiedNumPos = 0;
944 "ScalarSequence<T>::unifiedMeanExtra()",
945 "failed MPI.Allreduce() for numPos");
947 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
948 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMeanExtra()"
949 <<
": numPos = " << numPos
950 <<
", unifiedNumPos = " << unifiedNumPos
955 "ScalarSequence<T>::unifiedMeanExtra()",
956 "failed MPI.Allreduce() for sum");
958 unifiedMeanValue /= ((T) unifiedNumPos);
960 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
961 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMeanExtra()"
962 <<
": localSum = " << localSum
963 <<
", unifiedMeanValue = " << unifiedMeanValue
969 this->subMeanExtra(initialPos,
976 "ScalarSequence<T>::unifiedMeanExtra()",
977 "parallel vectors not supported yet");
982 return unifiedMeanValue;
988 unsigned int initialPos,
989 unsigned int numPos)
const
991 if (this->subSequenceSize() == 0)
return 0.;
993 bool bRC = ((initialPos < this->subSequenceSize()) &&
995 ((initialPos+numPos) <= this->subSequenceSize()));
997 std::cerr <<
"In ScalarSequence<T>::subMedianExtra()"
998 <<
": ERROR at fullRank " << m_env.fullRank()
999 <<
", initialPos = " << initialPos
1000 <<
", numPos = " << numPos
1001 <<
", this->subSequenceSize() = " << this->subSequenceSize()
1003 if (m_env.subDisplayFile()) {
1004 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::subMedianExtra()"
1005 <<
": ERROR at fullRank " << m_env.fullRank()
1006 <<
", initialPos = " << initialPos
1007 <<
", numPos = " << numPos
1008 <<
", this->subSequenceSize() = " << this->subSequenceSize()
1014 "ScalarSequence<T>::subMedianExtra()",
1015 "invalid input data");
1018 sortedSequence.resizeSequence(numPos);
1019 this->extractScalarSeq(initialPos,
1023 sortedSequence.subSort();
1025 unsigned int tmpPos = (
unsigned int) (0.5 * (
double) numPos);
1026 T resultValue = sortedSequence[tmpPos];
1034 bool useOnlyInter0Comm,
1035 unsigned int initialPos,
1036 unsigned int numPos)
const
1038 if (m_env.numSubEnvironments() == 1) {
1039 return this->subMedianExtra(initialPos,
1045 T unifiedMedianValue = 0.;
1046 if (useOnlyInter0Comm) {
1047 if (m_env.inter0Rank() >= 0) {
1048 bool bRC = ((initialPos < this->subSequenceSize()) &&
1050 ((initialPos+numPos) <= this->subSequenceSize()));
1053 "ScalarSequence<T>::unifiedMedianExtra()",
1054 "invalid input data");
1057 this->unifiedSort(useOnlyInter0Comm,
1059 unifiedSortedSequence);
1060 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
1061 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMedianExtra()"
1062 <<
", unifiedMedianValue = " << unifiedMedianValue
1068 this->subMedianExtra(initialPos,
1075 "ScalarSequence<T>::unifiedMedianExtra()",
1076 "parallel vectors not supported yet");
1081 return unifiedMedianValue;
1087 unsigned int initialPos,
1088 unsigned int numPos,
1089 const T& meanValue)
const
1091 if (this->subSequenceSize() == 0)
return 0.;
1093 bool bRC = ((initialPos < this->subSequenceSize()) &&
1095 ((initialPos+numPos) <= this->subSequenceSize()));
1098 "ScalarSequence<T>::subSampleVarianceExtra()",
1099 "invalid input data");
1101 unsigned int finalPosPlus1 = initialPos + numPos;
1104 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1105 diff = m_seq[j] - meanValue;
1106 samValue += diff*diff;
1109 samValue /= (((T) numPos) - 1.);
1117 bool useOnlyInter0Comm,
1118 unsigned int initialPos,
1119 unsigned int numPos,
1120 const T& unifiedMeanValue)
const
1122 if (m_env.numSubEnvironments() == 1) {
1123 return this->subSampleVarianceExtra(initialPos,
1130 T unifiedSamValue = 0.;
1131 if (useOnlyInter0Comm) {
1132 if (m_env.inter0Rank() >= 0) {
1133 bool bRC = ((initialPos < this->subSequenceSize()) &&
1135 ((initialPos+numPos) <= this->subSequenceSize()));
1138 "ScalarSequence<T>::unifiedSampleVarianceExtra()",
1139 "invalid input data");
1141 unsigned int finalPosPlus1 = initialPos + numPos;
1143 T localSamValue = 0.;
1144 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1145 diff = m_seq[j] - unifiedMeanValue;
1146 localSamValue += diff*diff;
1149 unsigned int unifiedNumPos = 0;
1151 "ScalarSequence<T>::unifiedSampleVarianceExtra()",
1152 "failed MPI.Allreduce() for numPos");
1155 "ScalarSequence<T>::unifiedSampleVarianceExtra()",
1156 "failed MPI.Allreduce() for samValue");
1158 unifiedSamValue /= (((T) unifiedNumPos) - 1.);
1162 this->subSampleVarianceExtra(initialPos,
1170 "ScalarSequence<T>::unifiedSampleVarianceExtra()",
1171 "parallel vectors not supported yet");
1176 return unifiedSamValue;
1182 unsigned int initialPos,
1183 unsigned int numPos,
1184 const T& meanValue)
const
1186 if (this->subSequenceSize() == 0)
return 0.;
1188 bool bRC = ((initialPos < this->subSequenceSize()) &&
1190 ((initialPos+numPos) <= this->subSequenceSize()));
1193 "ScalarSequence<T>::subSampleStd()",
1194 "invalid input data");
1196 unsigned int finalPosPlus1 = initialPos + numPos;
1199 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1200 diff = m_seq[j] - meanValue;
1201 stdValue += diff*diff;
1204 stdValue /= (((T) numPos) - 1.);
1205 stdValue = sqrt(stdValue);
1213 bool useOnlyInter0Comm,
1214 unsigned int initialPos,
1215 unsigned int numPos,
1216 const T& unifiedMeanValue)
const
1218 if (m_env.numSubEnvironments() == 1) {
1219 return this->subSampleStd(initialPos,
1226 T unifiedStdValue = 0.;
1227 if (useOnlyInter0Comm) {
1228 if (m_env.inter0Rank() >= 0) {
1229 bool bRC = ((initialPos < this->subSequenceSize()) &&
1231 ((initialPos+numPos) <= this->subSequenceSize()));
1234 "ScalarSequence<T>::unifiedSampleStd()",
1235 "invalid input data");
1237 unsigned int finalPosPlus1 = initialPos + numPos;
1239 T localStdValue = 0.;
1240 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1241 diff = m_seq[j] - unifiedMeanValue;
1242 localStdValue += diff*diff;
1245 unsigned int unifiedNumPos = 0;
1247 "ScalarSequence<T>::unifiedSampleStd()",
1248 "failed MPI.Allreduce() for numPos");
1251 "ScalarSequence<T>::unifiedSampleStd()",
1252 "failed MPI.Allreduce() for stdValue");
1254 unifiedStdValue /= (((T) unifiedNumPos) - 1.);
1255 unifiedStdValue = sqrt(unifiedStdValue);
1259 this->subSampleStd(initialPos,
1267 "ScalarSequence<T>::unifiedSampleStd()",
1268 "parallel vectors not supported yet");
1273 return unifiedStdValue;
1279 unsigned int initialPos,
1280 unsigned int numPos,
1281 const T& meanValue)
const
1283 if (this->subSequenceSize() == 0)
return 0.;
1285 bool bRC = ((initialPos < this->subSequenceSize()) &&
1287 ((initialPos+numPos) <= this->subSequenceSize()));
1290 "ScalarSequence<T>::subPopulationVariance()",
1291 "invalid input data");
1293 unsigned int finalPosPlus1 = initialPos + numPos;
1296 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1297 diff = m_seq[j] - meanValue;
1298 popValue += diff*diff;
1301 popValue /= (T) numPos;
1309 bool useOnlyInter0Comm,
1310 unsigned int initialPos,
1311 unsigned int numPos,
1312 const T& unifiedMeanValue)
const
1314 if (m_env.numSubEnvironments() == 1) {
1315 return this->subPopulationVariance(initialPos,
1322 T unifiedPopValue = 0.;
1323 if (useOnlyInter0Comm) {
1324 if (m_env.inter0Rank() >= 0) {
1325 bool bRC = ((initialPos < this->subSequenceSize()) &&
1327 ((initialPos+numPos) <= this->subSequenceSize()));
1330 "ScalarSequence<T>::unifiedPopulationVariance()",
1331 "invalid input data");
1333 unsigned int finalPosPlus1 = initialPos + numPos;
1335 T localPopValue = 0.;
1336 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1337 diff = m_seq[j] - unifiedMeanValue;
1338 localPopValue += diff*diff;
1341 unsigned int unifiedNumPos = 0;
1343 "ScalarSequence<T>::unifiedPopulationVariance()",
1344 "failed MPI.Allreduce() for numPos");
1347 "ScalarSequence<T>::unifiedPopulationVariance()",
1348 "failed MPI.Allreduce() for popValue");
1350 unifiedPopValue /= ((T) unifiedNumPos);
1354 this->subPopulationVariance(initialPos,
1362 "ScalarSequence<T>::unifiedPopulationVariance()",
1363 "parallel vectors not supported yet");
1368 return unifiedPopValue;
1374 unsigned int initialPos,
1375 unsigned int numPos,
1377 unsigned int lag)
const
1379 bool bRC = ((initialPos < this->subSequenceSize()) &&
1381 ((initialPos+numPos) <= this->subSequenceSize()) &&
1385 "ScalarSequence<T>::autoCovariance()",
1386 "invalid input data");
1388 unsigned int loopSize = numPos - lag;
1389 unsigned int finalPosPlus1 = initialPos + loopSize;
1393 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
1394 diff1 = m_seq[j ] - meanValue;
1395 diff2 = m_seq[j+lag] - meanValue;
1396 covValue += diff1*diff2;
1399 covValue /= (T) loopSize;
1407 unsigned int initialPos,
1408 unsigned int numPos,
1409 unsigned int lag)
const
1411 bool bRC = ((initialPos < this->subSequenceSize()) &&
1413 ((initialPos+numPos) <= this->subSequenceSize()) &&
1417 "ScalarSequence<T>::autoCorrViaDef()",
1418 "invalid input data");
1420 T meanValue = this->subMeanExtra(initialPos,
1423 T covValueZero = this->autoCovariance(initialPos,
1428 T corrValue = this->autoCovariance(initialPos,
1433 return corrValue/covValueZero;
1439 unsigned int initialPos,
1440 unsigned int numPos,
1441 unsigned int maxLag,
1442 std::vector<T>& autoCorrs)
const
1444 unsigned int fftSize = 0;
1446 double tmp = log((
double) maxLag)/log(2.);
1447 double fractionalPart = tmp - ((double) ((
unsigned int) tmp));
1448 if (fractionalPart > 0.) tmp += (1. - fractionalPart);
1449 unsigned int fftSize1 = (
unsigned int) std::pow(2.,tmp+1.);
1450 fftSize1 = fftSize1;
1452 tmp = log((
double) numPos)/log(2.);
1453 fractionalPart = tmp - ((double) ((
unsigned int) tmp));
1454 if (fractionalPart > 0.) tmp += (1. - fractionalPart);
1455 unsigned int fftSize2 = (
unsigned int) std::pow(2.,tmp+1);
1460 std::vector<double> rawDataVec(numPos,0.);
1461 std::vector<std::complex<double> > resultData(0,std::complex<double>(0.,0.));
1465 this->extractRawData(initialPos,
1469 T meanValue = this->subMeanExtra(initialPos,
1471 for (
unsigned int j = 0; j < numPos; ++j) {
1472 rawDataVec[j] -= meanValue;
1475 rawDataVec.resize(fftSize,0.);
1485 fftObj.
forward(rawDataVec,fftSize,resultData);
1488 for (
unsigned int j = 0; j < fftSize; ++j) {
1489 rawDataVec[j] = std::norm(resultData[j]);
1499 fftObj.
inverse(rawDataVec,fftSize,resultData);
1507 autoCorrs.resize(maxLag+1,0.);
1508 for (
unsigned int j = 0; j < autoCorrs.size(); ++j) {
1509 double ratio = ((double) j)/((double) (numPos-1));
1510 autoCorrs[j] = ( resultData[j].real()/resultData[0].real() )*(1.-ratio);
1519 unsigned int initialPos,
1520 unsigned int numPos,
1521 unsigned int numSum,
1522 T& autoCorrsSum)
const
1531 double tmp = log((
double) numPos)/log(2.);
1532 double fractionalPart = tmp - ((double) ((
unsigned int) tmp));
1533 if (fractionalPart > 0.) tmp += (1. - fractionalPart);
1534 unsigned int fftSize = (
unsigned int) std::pow(2.,tmp+1);
1536 std::vector<double> rawDataVec(numPos,0.);
1537 std::vector<std::complex<double> > resultData(0,std::complex<double>(0.,0.));
1541 this->extractRawData(initialPos,
1545 T meanValue = this->subMeanExtra(initialPos,
1547 for (
unsigned int j = 0; j < numPos; ++j) {
1548 rawDataVec[j] -= meanValue;
1550 rawDataVec.resize(fftSize,0.);
1560 fftObj.
forward(rawDataVec,fftSize,resultData);
1563 for (
unsigned int j = 0; j < fftSize; ++j) {
1564 rawDataVec[j] = std::norm(resultData[j]);
1566 fftObj.
inverse(rawDataVec,fftSize,resultData);
1577 for (
unsigned int j = 0; j < numSum; ++j) {
1578 double ratio = ((double) j)/((double) (numPos-1));
1579 autoCorrsSum += ( resultData[j].real()/resultData[0].real() )*(1.-ratio);
1588 unsigned int initialPos,
1589 unsigned int numPos,
1595 "ScalarSequence<T>::subMinMaxExtra()",
1599 std::advance(pos1,initialPos);
1602 std::advance(pos2,initialPos+numPos);
1604 if ((initialPos+numPos) == this->subSequenceSize()) {
1607 "ScalarSequence<T>::subMinMaxExtra()",
1612 pos = std::min_element(pos1, pos2);
1614 pos = std::max_element(pos1, pos2);
1623 bool useOnlyInter0Comm,
1624 unsigned int initialPos,
1625 unsigned int numPos,
1627 T& unifiedMaxValue)
const
1629 if (m_env.numSubEnvironments() == 1) {
1630 return this->subMinMaxExtra(initialPos,
1638 if (useOnlyInter0Comm) {
1639 if (m_env.inter0Rank() >= 0) {
1643 this->subMinMaxExtra(initialPos,
1649 std::vector<double> sendBuf(1,0.);
1650 for (
unsigned int i = 0; i < sendBuf.size(); ++i) {
1651 sendBuf[i] = minValue;
1654 "ScalarSequence<T>::unifiedMinMaxExtra()",
1655 "failed MPI.Allreduce() for min");
1658 for (
unsigned int i = 0; i < sendBuf.size(); ++i) {
1659 sendBuf[i] = maxValue;
1662 "ScalarSequence<T>::unifiedMinMaxExtra()",
1663 "failed MPI.Allreduce() for max");
1665 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
1666 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedMinMaxExtra()"
1667 <<
": localMinValue = " << minValue
1668 <<
", localMaxValue = " << maxValue
1669 <<
", unifiedMinValue = " << unifiedMinValue
1670 <<
", unifiedMaxValue = " << unifiedMaxValue
1676 this->subMinMaxExtra(initialPos,
1685 "ScalarSequence<T>::unifiedMinMaxExtra()",
1686 "parallel vectors not supported yet");
1697 unsigned int initialPos,
1698 const T& minHorizontalValue,
1699 const T& maxHorizontalValue,
1700 std::vector<T>& centers,
1701 std::vector<unsigned int>& bins)
const
1705 "ScalarSequence<T>::subHistogram()",
1706 "vectors 'centers' and 'bins' have different sizes");
1710 "ScalarSequence<T>::subHistogram()",
1711 "number of 'bins' is too small: should be at least 3");
1715 for (
unsigned int j = 0; j < bins.size(); ++j) {
1720 double horizontalDelta = (maxHorizontalValue - minHorizontalValue)/(((
double) bins.size()) - 2.);
1722 double minCenter = minHorizontalValue - horizontalDelta/2.;
1723 double maxCenter = maxHorizontalValue + horizontalDelta/2.;
1724 for (
unsigned int j = 0; j < centers.size(); ++j) {
1725 double factor = ((double) j)/(((double) centers.size()) - 1.);
1726 centers[j] = (1. - factor) * minCenter + factor * maxCenter;
1729 unsigned int dataSize = this->subSequenceSize();
1730 for (
unsigned int j = 0; j < dataSize; ++j) {
1731 double value = m_seq[j];
1732 if (value < minHorizontalValue) {
1735 else if (value >= maxHorizontalValue) {
1736 bins[bins.size()-1]++;
1739 unsigned int index = 1 + (
unsigned int) ((value - minHorizontalValue)/horizontalDelta);
1750 bool useOnlyInter0Comm,
1751 unsigned int initialPos,
1752 const T& unifiedMinHorizontalValue,
1753 const T& unifiedMaxHorizontalValue,
1754 std::vector<T>& unifiedCenters,
1755 std::vector<unsigned int>& unifiedBins)
const
1757 if (m_env.numSubEnvironments() == 1) {
1758 return this->subHistogram(initialPos,
1759 unifiedMinHorizontalValue,
1760 unifiedMaxHorizontalValue,
1767 if (useOnlyInter0Comm) {
1768 if (m_env.inter0Rank() >= 0) {
1771 "ScalarSequence<T>::unifiedHistogram()",
1772 "vectors 'unifiedCenters' and 'unifiedBins' have different sizes");
1776 "ScalarSequence<T>::unifiedHistogram()",
1777 "number of 'unifiedBins' is too small: should be at least 3");
1779 for (
unsigned int j = 0; j < unifiedBins.size(); ++j) {
1780 unifiedCenters[j] = 0.;
1784 double unifiedHorizontalDelta = (unifiedMaxHorizontalValue - unifiedMinHorizontalValue)/(((
double) unifiedBins.size()) - 2.);
1786 double unifiedMinCenter = unifiedMinHorizontalValue - unifiedHorizontalDelta/2.;
1787 double unifiedMaxCenter = unifiedMaxHorizontalValue + unifiedHorizontalDelta/2.;
1788 for (
unsigned int j = 0; j < unifiedCenters.size(); ++j) {
1789 double factor = ((double) j)/(((double) unifiedCenters.size()) - 1.);
1790 unifiedCenters[j] = (1. - factor) * unifiedMinCenter + factor * unifiedMaxCenter;
1793 std::vector<unsigned int> localBins(unifiedBins.size(),0);
1794 unsigned int dataSize = this->subSequenceSize();
1795 for (
unsigned int j = 0; j < dataSize; ++j) {
1796 double value = m_seq[j];
1797 if (value < unifiedMinHorizontalValue) {
1800 else if (value >= unifiedMaxHorizontalValue) {
1801 localBins[localBins.size()-1]++;
1804 unsigned int index = 1 + (
unsigned int) ((value - unifiedMinHorizontalValue)/unifiedHorizontalDelta);
1810 "ScalarSequence<T>::unifiedHistogram()",
1811 "failed MPI.Allreduce() for bins");
1813 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
1814 for (
unsigned int i = 0; i < unifiedCenters.size(); ++i) {
1815 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedHistogram()"
1817 <<
", unifiedMinHorizontalValue = " << unifiedMinHorizontalValue
1818 <<
", unifiedMaxHorizontalValue = " << unifiedMaxHorizontalValue
1819 <<
", unifiedCenters = " << unifiedCenters[i]
1820 <<
", unifiedBins = " << unifiedBins[i]
1827 this->subHistogram(initialPos,
1828 unifiedMinHorizontalValue,
1829 unifiedMaxHorizontalValue,
1837 "ScalarSequence<T>::unifiedHistogram()",
1838 "parallel vectors not supported yet");
1849 unsigned int initialPos,
1850 const T& minHorizontalValue,
1851 const T& maxHorizontalValue,
1853 std::vector<unsigned int>& bins)
const
1857 "ScalarSequence<T>::subBasicHistogram()",
1858 "number of 'bins' is too small: should be at least 3");
1860 for (
unsigned int j = 0; j < bins.size(); ++j) {
1864 double horizontalDelta = (maxHorizontalValue - minHorizontalValue)/(((
double) bins.size()) - 2.);
1865 double minCenter = minHorizontalValue - horizontalDelta/2.;
1866 double maxCenter = maxHorizontalValue + horizontalDelta/2.;
1873 unsigned int dataSize = this->subSequenceSize();
1874 for (
unsigned int j = 0; j < dataSize; ++j) {
1875 double value = m_seq[j];
1876 if (value < minHorizontalValue) {
1879 else if (value >= maxHorizontalValue) {
1880 bins[bins.size()-1] += value;
1883 unsigned int index = 1 + (
unsigned int) ((value - minHorizontalValue)/horizontalDelta);
1884 bins[index] += value;
1894 unsigned int initialPos,
1895 const T& minHorizontalValue,
1896 const T& maxHorizontalValue,
1898 std::vector<unsigned int>& bins)
const
1902 "ScalarSequence<T>::subWeightHistogram()",
1903 "number of 'bins' is too small: should be at least 3");
1905 for (
unsigned int j = 0; j < bins.size(); ++j) {
1909 double horizontalDelta = (maxHorizontalValue - minHorizontalValue)/(((
double) bins.size()) - 2.);
1910 double minCenter = minHorizontalValue - horizontalDelta/2.;
1911 double maxCenter = maxHorizontalValue + horizontalDelta/2.;
1918 unsigned int dataSize = this->subSequenceSize();
1919 for (
unsigned int j = 0; j < dataSize; ++j) {
1920 double value = m_seq[j];
1921 if (value < minHorizontalValue) {
1924 else if (value >= maxHorizontalValue) {
1925 bins[bins.size()-1] += value;
1928 unsigned int index = 1 + (
unsigned int) ((value - minHorizontalValue)/horizontalDelta);
1929 bins[index] += value;
1939 unsigned int initialPos,
1940 const T& minHorizontalValue,
1941 const T& maxHorizontalValue,
1942 std::vector<T>& gridValues,
1943 std::vector<unsigned int>& bins)
const
1947 "ScalarSequence<T>::subWeightHistogram()",
1948 "number of 'bins' is too small: should be at least 3");
1950 for (
unsigned int j = 0; j < bins.size(); ++j) {
1954 double horizontalDelta = (maxHorizontalValue - minHorizontalValue)/(((
double) bins.size()) - 2.);
1955 double minCenter = minHorizontalValue - horizontalDelta/2.;
1956 double maxCenter = maxHorizontalValue + horizontalDelta/2.;
1963 gridValues.resize(tmpGrid.size(),0.);
1964 for (
unsigned int i = 0; i < tmpGrid.size(); ++i) {
1965 gridValues[i] = tmpGrid[i];
1968 unsigned int dataSize = this->subSequenceSize();
1969 for (
unsigned int j = 0; j < dataSize; ++j) {
1970 double value = m_seq[j];
1971 if (value < minHorizontalValue) {
1974 else if (value >= maxHorizontalValue) {
1975 bins[bins.size()-1] += value;
1978 unsigned int index = 1 + (
unsigned int) ((value - minHorizontalValue)/horizontalDelta);
1979 bins[index] += value;
1994 unsigned int initialPos,
1997 unsigned int numPos = this->subSequenceSize() - initialPos;
1999 this->extractScalarSeq(initialPos,
2011 bool useOnlyInter0Comm,
2012 unsigned int initialPos,
2015 if (m_env.numSubEnvironments() == 1) {
2016 return this->subSort(initialPos,unifiedSortedSequence);
2021 if (useOnlyInter0Comm) {
2022 if (m_env.inter0Rank() >= 0) {
2025 unsigned int localNumPos = this->subSequenceSize() - initialPos;
2027 std::vector<T> leafData(localNumPos,0.);
2028 this->extractRawData(0,
2033 if (m_env.inter0Rank() == 0) {
2034 int minus1NumTreeLevels = 0;
2035 int power2NumTreeNodes = 1;
2037 while (power2NumTreeNodes < m_env.inter0Comm().NumProc()) {
2038 power2NumTreeNodes += power2NumTreeNodes;
2039 minus1NumTreeLevels++;
2042 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
2043 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedSort()"
2044 <<
": sorting tree has " << m_env.inter0Comm().NumProc()
2045 <<
" nodes and " << minus1NumTreeLevels+1
2050 this->parallelMerge(unifiedSortedSequence.
rawData(),
2052 minus1NumTreeLevels);
2054 else if (m_env.inter0Rank() > 0) {
2055 unsigned int uintBuffer[1];
2058 "ScalarSequence<T>::unifiedSort()",
2059 "failed MPI.Recv() for init");
2062 unsigned int treeLevel = uintBuffer[0];
2063 this->parallelMerge(unifiedSortedSequence.
rawData(),
2071 unsigned int unifiedDataSize = unifiedSortedSequence.
subSequenceSize();
2073 "ScalarSequence<T>::unifiedSort()",
2074 "failed MPI.Bcast() for unified data size");
2076 unsigned int sumOfNumPos = 0;
2078 "ScalarSequence<T>::unifiedSort()",
2079 "failed MPI.Allreduce() for data size");
2083 "ScalarSequence<T>::unifiedSort()",
2084 "incompatible unified sizes");
2088 "ScalarSequence<T>::unifiedSort()",
2089 "failed MPI.Bcast() for unified data");
2091 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2092 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
2093 <<
": tree node " << m_env.inter0Rank()
2094 <<
", unifiedSortedSequence[0] = " << unifiedSortedSequence[0]
2095 <<
", unifiedSortedSequence[" << unifiedSortedSequence.
subSequenceSize()-1 <<
"] = " << unifiedSortedSequence[unifiedSortedSequence.
subSequenceSize()-1]
2103 this->subSort(initialPos,unifiedSortedSequence);
2109 "ScalarSequence<T>::unifiedSort()",
2110 "parallel vectors not supported yet");
2124 "ScalarSequence<T>::subInterQuantileRange()",
2125 "'initialPos' is too big");
2128 this->subSort(initialPos,
2132 unsigned int dataSize = this->subSequenceSize() - initialPos;
2136 "ScalarSequence<T>::subInterQuantileRange()",
2137 "inconsistent size variables");
2139 bool everythingOk =
true;
2144 unsigned int pos1 = (
unsigned int) ( (((
double) dataSize) + 1.)*1./4. - 1. );
2145 if (pos1 > (dataSize-1)) {
2147 everythingOk =
false;
2149 unsigned int pos1inc = pos1+1;
2150 if (pos1inc > (dataSize-1)) {
2151 pos1inc = dataSize-1;
2152 everythingOk =
false;
2158 unsigned int pos3 = (
unsigned int) ( (((
double) dataSize) + 1.)*3./4. - 1. );
2159 if (pos3 > (dataSize-1)) {
2161 everythingOk =
false;
2163 unsigned int pos3inc = pos3+1;
2164 if (pos3inc > (dataSize-1)) {
2165 pos3inc = dataSize-1;
2166 everythingOk =
false;
2169 double fraction1 = (((double) dataSize) + 1.)*1./4. - 1. - ((double) pos1);
2170 if (fraction1 < 0.) {
2172 everythingOk =
false;
2174 double fraction3 = (((double) dataSize) + 1.)*3./4. - 1. - ((double) pos3);
2175 if (fraction3 < 0.) {
2177 everythingOk =
false;
2180 if (everythingOk ==
false) {
2181 std::cerr <<
"In ScalarSequence<T>::subInterQuantileRange()"
2182 <<
", worldRank = " << m_env.worldRank()
2183 <<
": at least one adjustment was necessary"
2198 T value1 = (1.-fraction1) * sortedSequence[pos1] + fraction1 * sortedSequence[pos1inc];
2199 T value3 = (1.-fraction3) * sortedSequence[pos3] + fraction3 * sortedSequence[pos3inc];
2200 T iqrValue = value3 - value1;
2202 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2203 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::subInterQuantileRange()"
2204 <<
": iqrValue = " << iqrValue
2205 <<
", dataSize = " << dataSize
2206 <<
", pos1 = " << pos1
2207 <<
", pos3 = " << pos3
2208 <<
", value1 = " << value1
2209 <<
", value3 = " << value3
2240 bool useOnlyInter0Comm,
2241 unsigned int initialPos)
const
2243 T unifiedIqrValue = 0.;
2245 if (m_env.numSubEnvironments() == 1) {
2246 return this->subInterQuantileRange(initialPos);
2251 if (useOnlyInter0Comm) {
2252 if (m_env.inter0Rank() >= 0) {
2256 this->unifiedSort(useOnlyInter0Comm,
2258 unifiedSortedSequence);
2259 unsigned int unifiedDataSize = unifiedSortedSequence.
subSequenceSize();
2261 unsigned int localDataSize = this->subSequenceSize() - initialPos;
2262 unsigned int sumOfLocalSizes = 0;
2264 "ScalarSequence<T>::unifiedInterQuantileRange()",
2265 "failed MPI.Allreduce() for data size");
2269 "ScalarSequence<T>::unifiedInterQuantileRange()",
2270 "incompatible unified sizes");
2272 unsigned int pos1 = (
unsigned int) ( (((
double) unifiedDataSize) + 1.)*1./4. - 1. );
2273 unsigned int pos3 = (
unsigned int) ( (((
double) unifiedDataSize) + 1.)*3./4. - 1. );
2275 double fraction1 = (((double) unifiedDataSize) + 1.)*1./4. - 1. - ((double) pos1);
2276 double fraction3 = (((double) unifiedDataSize) + 1.)*3./4. - 1. - ((double) pos3);
2278 T value1 = (1.-fraction1) * unifiedSortedSequence[pos1] + fraction1 * unifiedSortedSequence[pos1+1];
2279 T value3 = (1.-fraction3) * unifiedSortedSequence[pos3] + fraction3 * unifiedSortedSequence[pos3+1];
2280 unifiedIqrValue = value3 - value1;
2282 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2283 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedInterQuantileRange()"
2284 <<
": unifiedIqrValue = " << unifiedIqrValue
2285 <<
", localDataSize = " << localDataSize
2286 <<
", unifiedDataSize = " << unifiedDataSize
2287 <<
", pos1 = " << pos1
2288 <<
", pos3 = " << pos3
2289 <<
", value1 = " << value1
2290 <<
", value3 = " << value3
2319 unifiedIqrValue = this->subInterQuantileRange(initialPos);
2325 "ScalarSequence<T>::unifiedInterQuantileRange()",
2326 "parallel vectors not supported yet");
2331 return unifiedIqrValue;
2337 unsigned int initialPos,
2339 unsigned int kdeDimension)
const
2341 bool bRC = (initialPos < this->subSequenceSize());
2344 "ScalarSequence<V>::subScaleForKde()",
2345 "invalid input data");
2347 unsigned int dataSize = this->subSequenceSize() - initialPos;
2349 T meanValue = this->subMeanExtra(initialPos,
2352 T samValue = this->subSampleVarianceExtra(initialPos,
2357 if (iqrValue <= 0.) {
2358 scaleValue = 1.06*std::sqrt(samValue)/std::pow(dataSize,1./(4. + ((
double) kdeDimension)));
2361 scaleValue = 1.06*std::min(std::sqrt(samValue),iqrValue/1.34)/std::pow(dataSize,1./(4. + ((
double) kdeDimension)));
2364 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2365 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::subScaleForKde()"
2366 <<
": iqrValue = " << iqrValue
2367 <<
", meanValue = " << meanValue
2368 <<
", samValue = " << samValue
2369 <<
", dataSize = " << dataSize
2370 <<
", scaleValue = " << scaleValue
2380 bool useOnlyInter0Comm,
2381 unsigned int initialPos,
2382 const T& unifiedIqrValue,
2383 unsigned int kdeDimension)
const
2385 if (m_env.numSubEnvironments() == 1) {
2386 return this->subScaleForKde(initialPos,
2393 T unifiedScaleValue = 0.;
2394 if (useOnlyInter0Comm) {
2395 if (m_env.inter0Rank() >= 0) {
2396 bool bRC = (initialPos < this->subSequenceSize());
2399 "ScalarSequence<V>::unifiedScaleForKde()",
2400 "invalid input data");
2402 unsigned int localDataSize = this->subSequenceSize() - initialPos;
2404 T unifiedMeanValue = this->unifiedMeanExtra(useOnlyInter0Comm,
2408 T unifiedSamValue = this->unifiedSampleVarianceExtra(useOnlyInter0Comm,
2413 unsigned int unifiedDataSize = 0;
2415 "ScalarSequence<T>::unifiedScaleForKde()",
2416 "failed MPI.Allreduce() for data size");
2418 if (unifiedIqrValue <= 0.) {
2419 unifiedScaleValue = 1.06*std::sqrt(unifiedSamValue)/std::pow(unifiedDataSize,1./(4. + ((
double) kdeDimension)));
2422 unifiedScaleValue = 1.06*std::min(std::sqrt(unifiedSamValue),unifiedIqrValue/1.34)/std::pow(unifiedDataSize,1./(4. + ((
double) kdeDimension)));
2425 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2426 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedScaleForKde()"
2427 <<
": unifiedIqrValue = " << unifiedIqrValue
2428 <<
", unifiedMeanValue = " << unifiedMeanValue
2429 <<
", unifiedSamValue = " << unifiedSamValue
2430 <<
", unifiedDataSize = " << unifiedDataSize
2431 <<
", unifiedScaleValue = " << unifiedScaleValue
2437 unifiedScaleValue = this->subScaleForKde(initialPos,
2445 "ScalarSequence<T>::unifiedScaleForKde()",
2446 "parallel vectors not supported yet");
2451 return unifiedScaleValue;
2457 unsigned int initialPos,
2459 const std::vector<T>& evaluationPositions,
2460 std::vector<double>& densityValues)
const
2462 bool bRC = ((initialPos < this->subSequenceSize() ) &&
2463 (0 < evaluationPositions.size()) &&
2464 (evaluationPositions.size() == densityValues.size() ));
2467 "ScalarSequence<V>::subGaussian1dKde()",
2468 "invalid input data");
2470 unsigned int dataSize = this->subSequenceSize() - initialPos;
2471 unsigned int numEvals = evaluationPositions.size();
2473 double scaleInv = 1./scaleValue;
2474 for (
unsigned int j = 0; j < numEvals; ++j) {
2475 double x = evaluationPositions[j];
2477 for (
unsigned int k = 0; k < dataSize; ++k) {
2478 double xk = m_seq[initialPos+k];
2481 densityValues[j] = scaleInv * (value/(double) dataSize);
2490 bool useOnlyInter0Comm,
2491 unsigned int initialPos,
2492 double unifiedScaleValue,
2493 const std::vector<T>& unifiedEvaluationPositions,
2494 std::vector<double>& unifiedDensityValues)
const
2496 if (m_env.numSubEnvironments() == 1) {
2497 return this->subGaussian1dKde(initialPos,
2499 unifiedEvaluationPositions,
2500 unifiedDensityValues);
2505 if (useOnlyInter0Comm) {
2506 if (m_env.inter0Rank() >= 0) {
2507 bool bRC = ((initialPos < this->subSequenceSize() ) &&
2508 (0 < unifiedEvaluationPositions.size()) &&
2509 (unifiedEvaluationPositions.size() == unifiedDensityValues.size() ));
2512 "ScalarSequence<V>::unifiedGaussian1dKde()",
2513 "invalid input data");
2515 unsigned int localDataSize = this->subSequenceSize() - initialPos;
2516 unsigned int unifiedDataSize = 0;
2518 "ScalarSequence<T>::unifiedGaussian1dKde()",
2519 "failed MPI.Allreduce() for data size");
2521 unsigned int numEvals = unifiedEvaluationPositions.size();
2523 std::vector<double> densityValues(numEvals,0.);
2524 double unifiedScaleInv = 1./unifiedScaleValue;
2525 for (
unsigned int j = 0; j < numEvals; ++j) {
2526 double x = unifiedEvaluationPositions[j];
2528 for (
unsigned int k = 0; k < localDataSize; ++k) {
2529 double xk = m_seq[initialPos+k];
2532 densityValues[j] = value;
2535 for (
unsigned int j = 0; j < numEvals; ++j) {
2536 unifiedDensityValues[j] = 0.;
2539 "ScalarSequence<T>::unifiedGaussian1dKde()",
2540 "failed MPI.Allreduce() for density values");
2542 for (
unsigned int j = 0; j < numEvals; ++j) {
2543 unifiedDensityValues[j] *= unifiedScaleInv/((double) unifiedDataSize);
2546 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
2547 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedGaussian1dKde()"
2548 <<
": unifiedDensityValues[0] = " << unifiedDensityValues[0]
2549 <<
", unifiedDensityValues[" << unifiedDensityValues.size()-1 <<
"] = " << unifiedDensityValues[unifiedDensityValues.size()-1]
2555 this->subGaussian1dKde(initialPos,
2557 unifiedEvaluationPositions,
2558 unifiedDensityValues);
2564 "ScalarSequence<T>::unifiedGaussian1dKde()",
2565 "parallel vectors not supported yet");
2576 unsigned int initialPos,
2577 unsigned int spacing)
2579 if (m_env.subDisplayFile()) {
2580 *m_env.subDisplayFile() <<
"Entering ScalarSequence<V,M>::filter()"
2581 <<
": initialPos = " << initialPos
2582 <<
", spacing = " << spacing
2583 <<
", subSequenceSize = " << this->subSequenceSize()
2588 unsigned int j = initialPos;
2589 unsigned int originalSubSequenceSize = this->subSequenceSize();
2590 while (j < originalSubSequenceSize) {
2593 m_seq[i] = m_seq[j];
2599 this->resizeSequence(i);
2601 if (m_env.subDisplayFile()) {
2602 *m_env.subDisplayFile() <<
"Leaving ScalarSequence<V,M>::filter()"
2603 <<
": initialPos = " << initialPos
2604 <<
", spacing = " << spacing
2605 <<
", subSequenceSize = " << this->subSequenceSize()
2615 bool useOnlyInter0Comm,
2616 unsigned int initialPos,
2617 unsigned int spacing)
const
2619 double resultValue = 0.;
2623 if (useOnlyInter0Comm) {
2624 if (m_env.inter0Rank() >= 0) {
2627 "ScalarSequence<T>::brooksGelmanConvMeasure()",
2628 "not implemented yet");
2638 "ScalarSequence<T>::brooksGelmanConvMeasure()",
2639 "parallel vectors not supported yet");
2651 unsigned int srcInitialPos,
2652 unsigned int srcNumPos)
2656 "ScalarSequence<T>::append()",
2657 "srcInitialPos is too big");
2661 "ScalarSequence<T>::append()",
2662 "srcNumPos is too big");
2664 deleteStoredScalars();
2665 unsigned int currentSize = this->subSequenceSize();
2666 m_seq.resize(currentSize+srcNumPos,0.);
2667 for (
unsigned int i = 0; i < srcNumPos; ++i) {
2668 m_seq[currentSize+i] = src.
m_seq[srcInitialPos+i];
2682 "ScalarSequence<T>::subPositionsOfMaximum()",
2685 T subMaxValue = subCorrespondingScalarValues.
subMaxPlain();
2688 unsigned int subNumPos = 0;
2689 for (
unsigned int i = 0; i < iMax; ++i) {
2690 if (subCorrespondingScalarValues[i] == subMaxValue) {
2697 for (
unsigned int i = 0; i < iMax; ++i) {
2698 if (subCorrespondingScalarValues[i] == subMaxValue) {
2699 subPositionsOfMaximum[j] = (*this)[i];
2715 "ScalarSequence<T>::unifiedPositionsOfMaximum()",
2718 T maxValue = subCorrespondingScalarValues.
subMaxPlain();
2721 unsigned int numPos = 0;
2722 for (
unsigned int i = 0; i < iMax; ++i) {
2723 if (subCorrespondingScalarValues[i] == maxValue) {
2730 for (
unsigned int i = 0; i < iMax; ++i) {
2731 if (subCorrespondingScalarValues[i] == maxValue) {
2732 unifiedPositionsOfMaximum[j] = (*this)[i];
2743 unsigned int initialPos,
2744 unsigned int numPos,
2745 const std::string& fileName,
2746 const std::string& fileType,
2747 const std::set<unsigned int>& allowedSubEnvIds)
const
2751 "ScalarSequence<T>::subWriteContents()",
2752 "unexpected subRank");
2755 if (m_env.openOutputFile(fileName,
2761 this->subWriteContents(initialPos,
2765 m_env.closeFile(filePtrSet,fileType);
2774 unsigned int initialPos,
2775 unsigned int numPos,
2777 const std::string& fileType)
const
2782 ofs << m_name <<
"_sub" << m_env.subIdString() <<
" = zeros(" << this->subSequenceSize()
2786 ofs << m_name <<
"_sub" << m_env.subIdString() <<
" = [";
2787 unsigned int chainSize = this->subSequenceSize();
2788 for (
unsigned int j = 0; j < chainSize; ++j) {
2800 const std::string& fileName,
2801 const std::string& inputFileType)
const
2803 std::string fileType(inputFileType);
2804 #ifdef QUESO_HAS_HDF5
2808 if (m_env.subDisplayFile()) {
2809 *m_env.subDisplayFile() <<
"WARNING in ScalarSequence<T>::unifiedWriteContents()"
2811 <<
"' has been requested, but this QUESO library has not been built with 'hdf5'"
2816 if (m_env.subRank() == 0) {
2817 std::cerr <<
"WARNING in ScalarSequence<T>::unifiedWriteContents()"
2819 <<
"' has been requested, but this QUESO library has not been built with 'hdf5'"
2831 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
2832 *m_env.subDisplayFile() <<
"Entering ScalarSequence<T>::unifiedWriteContents()"
2833 <<
": worldRank " << m_env.worldRank()
2834 <<
", subEnvironment " << m_env.subId()
2835 <<
", subRank " << m_env.subRank()
2836 <<
", inter0Rank " << m_env.inter0Rank()
2838 <<
", fileName = " << fileName
2839 <<
", fileType = " << fileType
2845 if (m_env.inter0Rank() >= 0) {
2846 for (
unsigned int r = 0; r < (
unsigned int) m_env.inter0Comm().NumProc(); ++r) {
2847 if (m_env.inter0Rank() == (int) r) {
2851 bool writeOver =
false;
2854 if (m_env.openUnifiedOutputFile(fileName,
2857 unifiedFilePtrSet)) {
2860 unsigned int chainSize = this->subSequenceSize();
2863 *unifiedFilePtrSet.
ofsVar << m_name <<
"_unified" <<
" = zeros(" << this->subSequenceSize()*m_env.inter0Comm().NumProc()
2867 *unifiedFilePtrSet.
ofsVar << m_name <<
"_unified" <<
" = [";
2870 for (
unsigned int j = 0; j < chainSize; ++j) {
2871 *unifiedFilePtrSet.
ofsVar << m_seq[j]
2875 m_env.closeFile(unifiedFilePtrSet,fileType);
2877 #ifdef QUESO_HAS_HDF5
2879 unsigned int numParams = 1;
2881 hid_t datatype = H5Tcopy(H5T_NATIVE_DOUBLE);
2884 dimsf[0] = numParams;
2885 dimsf[1] = chainSize;
2886 hid_t dataspace = H5Screate_simple(2, dimsf, NULL);
2888 hid_t dataset = H5Dcreate2(unifiedFilePtrSet.h5Var,
2897 struct timeval timevalBegin;
2899 iRC = gettimeofday(&timevalBegin,NULL);
2903 std::vector<double*> dataOut((
size_t) numParams,NULL);
2904 dataOut[0] = (
double*) malloc(numParams*chainSize*
sizeof(
double));
2905 for (
unsigned int i = 1; i < numParams; ++i) {
2906 dataOut[i] = dataOut[i-1] + chainSize;
2909 for (
unsigned int j = 0; j < chainSize; ++j) {
2910 T tmpScalar = m_seq[j];
2911 for (
unsigned int i = 0; i < numParams; ++i) {
2912 dataOut[i][j] = tmpScalar;
2919 status = H5Dwrite(dataset,
2924 (
void*) dataOut[0]);
2931 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
2932 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedWriteContents()"
2933 <<
": worldRank " << m_env.worldRank()
2934 <<
", fullRank " << m_env.fullRank()
2935 <<
", subEnvironment " << m_env.subId()
2936 <<
", subRank " << m_env.subRank()
2937 <<
", inter0Rank " << m_env.inter0Rank()
2938 <<
", fileName = " << fileName
2939 <<
", numParams = " << numParams
2940 <<
", chainSize = " << chainSize
2941 <<
", writeTime = " << writeTime <<
" seconds"
2947 H5Sclose(dataspace);
2952 for (
unsigned int tmpIndex = 0; tmpIndex < dataOut.size(); tmpIndex++) {
2953 free (dataOut[tmpIndex]);
2959 "ScalarSequence<T>::unifiedWriteContents()",
2960 "hdf file type not supported for multiple sub-environments yet");
2967 m_env.inter0Comm().Barrier();
2970 if (m_env.inter0Rank() == 0) {
2973 if (m_env.openUnifiedOutputFile(fileName,
2976 unifiedFilePtrSet)) {
2977 *unifiedFilePtrSet.
ofsVar <<
"];\n";
2978 m_env.closeFile(unifiedFilePtrSet,fileType);
2987 "ScalarSequence<T>::unifiedWriteContents(), final",
2988 "invalid file type");
2993 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
2994 *m_env.subDisplayFile() <<
"Leaving ScalarSequence<T>::unifiedWriteContents()"
2995 <<
", fileName = " << fileName
2996 <<
", fileType = " << fileType
3007 const std::string& fileName,
3008 const std::string& inputFileType,
3009 const unsigned int subReadSize)
3011 std::string fileType(inputFileType);
3012 #ifdef QUESO_HAS_HDF5
3016 if (m_env.subDisplayFile()) {
3017 *m_env.subDisplayFile() <<
"WARNING in ScalarSequence<T>::unifiedReadContents()"
3019 <<
"' has been requested, but this QUESO library has not been built with 'hdf5'"
3024 if (m_env.subRank() == 0) {
3025 std::cerr <<
"WARNING in ScalarSequence<T>::unifiedReadContents()"
3027 <<
"' has been requested, but this QUESO library has not been built with 'hdf5'"
3037 if (m_env.subDisplayFile()) {
3038 *m_env.subDisplayFile() <<
"Entering ScalarSequence<T>::unifiedReadContents()"
3039 <<
": worldRank " << m_env.worldRank()
3040 <<
", fullRank " << m_env.fullRank()
3041 <<
", subEnvironment " << m_env.subId()
3042 <<
", subRank " << m_env.subRank()
3043 <<
", inter0Rank " << m_env.inter0Rank()
3045 <<
", fileName = " << fileName
3046 <<
", subReadSize = " << subReadSize
3051 this->resizeSequence(subReadSize);
3053 if (m_env.inter0Rank() >= 0) {
3054 double unifiedReadSize = subReadSize*m_env.inter0Comm().NumProc();
3057 unsigned int idOfMyFirstLine = 1 + m_env.inter0Rank()*subReadSize;
3058 unsigned int idOfMyLastLine = (1 + m_env.inter0Rank())*subReadSize;
3059 unsigned int numParams = 1;
3061 for (
unsigned int r = 0; r < (
unsigned int) m_env.inter0Comm().NumProc(); ++r) {
3062 if (m_env.inter0Rank() == (int) r) {
3065 if (m_env.openUnifiedInputFile(fileName,
3067 unifiedFilePtrSet)) {
3072 std::string tmpString;
3075 *unifiedFilePtrSet.
ifsVar >> tmpString;
3079 *unifiedFilePtrSet.
ifsVar >> tmpString;
3083 "ScalarSequence<T>::unifiedReadContents()",
3084 "string should be the '=' sign");
3087 *unifiedFilePtrSet.
ifsVar >> tmpString;
3089 unsigned int posInTmpString = 6;
3093 std::string nPositionsString((
size_t) (tmpString.size()-posInTmpString+1),
' ');
3094 unsigned int posInPositionsString = 0;
3098 "ScalarSequence<T>::unifiedReadContents()",
3099 "symbol ',' not found in first line of file");
3100 nPositionsString[posInPositionsString++] = tmpString[posInTmpString++];
3101 }
while (tmpString[posInTmpString] !=
',');
3102 nPositionsString[posInPositionsString] =
'\0';
3107 std::string nParamsString((
size_t) (tmpString.size()-posInTmpString+1),
' ');
3108 unsigned int posInParamsString = 0;
3112 "ScalarSequence<T>::unifiedReadContents()",
3113 "symbol ')' not found in first line of file");
3114 nParamsString[posInParamsString++] = tmpString[posInTmpString++];
3115 }
while (tmpString[posInTmpString] !=
')');
3116 nParamsString[posInParamsString] =
'\0';
3119 unsigned int sizeOfChainInFile = (
unsigned int) strtod(nPositionsString.c_str(),NULL);
3120 unsigned int numParamsInFile = (
unsigned int) strtod(nParamsString.c_str(), NULL);
3121 if (m_env.subDisplayFile()) {
3122 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedReadContents()"
3123 <<
": worldRank " << m_env.worldRank()
3124 <<
", fullRank " << m_env.fullRank()
3125 <<
", sizeOfChainInFile = " << sizeOfChainInFile
3126 <<
", numParamsInFile = " << numParamsInFile
3133 "ScalarSequence<T>::unifiedReadContents()",
3134 "size of chain in file is not big enough");
3139 "ScalarSequence<T>::unifiedReadContents()",
3140 "number of parameters of chain in file is different than number of parameters in this chain object");
3144 unsigned int maxCharsPerLine = 64*numParams;
3146 unsigned int lineId = 0;
3147 while (lineId < idOfMyFirstLine) {
3148 unifiedFilePtrSet.
ifsVar->ignore(maxCharsPerLine,
'\n');
3155 std::string tmpString;
3158 *unifiedFilePtrSet.
ifsVar >> tmpString;
3162 *unifiedFilePtrSet.
ifsVar >> tmpString;
3166 "ScalarSequence<T>::unifiedReadContents()",
3167 "in core 0, string should be the '=' sign");
3170 std::streampos tmpPos = unifiedFilePtrSet.
ifsVar->tellg();
3171 unifiedFilePtrSet.
ifsVar->seekg(tmpPos+(std::streampos)2);
3175 while (lineId <= idOfMyLastLine) {
3176 for (
unsigned int i = 0; i < numParams; ++i) {
3177 *unifiedFilePtrSet.
ifsVar >> tmpScalar;
3179 m_seq[lineId - idOfMyFirstLine] = tmpScalar;
3183 #ifdef QUESO_HAS_HDF5
3186 hid_t dataset = H5Dopen2(unifiedFilePtrSet.h5Var,
3189 hid_t datatype = H5Dget_type(dataset);
3190 H5T_class_t t_class = H5Tget_class(datatype);
3193 "ScalarSequence<T>::unifiedReadContents()",
3194 "t_class is not H5T_DOUBLE");
3195 hid_t dataspace = H5Dget_space(dataset);
3196 int rank = H5Sget_simple_extent_ndims(dataspace);
3199 "ScalarSequence<T>::unifiedReadContents()",
3200 "hdf rank is not 2");
3203 status_n = H5Sget_simple_extent_dims(dataspace, dims_in, NULL);
3211 "ScalarSequence<T>::unifiedReadContents()",
3212 "dims_in[0] is not equal to 'numParams'");
3215 "ScalarSequence<T>::unifiedReadContents()",
3216 "dims_in[1] is smaller that requested 'subReadSize'");
3218 struct timeval timevalBegin;
3220 iRC = gettimeofday(&timevalBegin,NULL);
3223 unsigned int chainSizeIn = (
unsigned int) dims_in[1];
3225 std::vector<double*> dataIn((
size_t) numParams,NULL);
3226 dataIn[0] = (
double*) malloc(numParams*chainSizeIn*
sizeof(
double));
3227 for (
unsigned int i = 1; i < numParams; ++i) {
3228 dataIn[i] = dataIn[i-1] + chainSizeIn;
3232 status = H5Dread(dataset,
3241 for (
unsigned int j = 0; j < subReadSize; ++j) {
3242 for (
unsigned int i = 0; i < numParams; ++i) {
3243 tmpScalar = dataIn[i][j];
3245 m_seq[j] = tmpScalar;
3249 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
3250 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::unifiedReadContents()"
3251 <<
": worldRank " << m_env.worldRank()
3252 <<
", fullRank " << m_env.fullRank()
3253 <<
", subEnvironment " << m_env.subId()
3254 <<
", subRank " << m_env.subRank()
3255 <<
", inter0Rank " << m_env.inter0Rank()
3256 <<
", fileName = " << fileName
3257 <<
", numParams = " << numParams
3258 <<
", chainSizeIn = " << chainSizeIn
3259 <<
", subReadSize = " << subReadSize
3260 <<
", readTime = " << readTime <<
" seconds"
3264 H5Sclose(dataspace);
3268 for (
unsigned int tmpIndex = 0; tmpIndex < dataIn.size(); tmpIndex++) {
3269 free (dataIn[tmpIndex]);
3275 "ScalarSequence<T>::unifiedReadContents()",
3276 "hdf file type not supported for multiple sub-environments yet");
3283 "ScalarSequence<T>::unifiedReadContents()",
3284 "invalid file type");
3286 m_env.closeFile(unifiedFilePtrSet,fileType);
3289 m_env.inter0Comm().Barrier();
3294 for (
unsigned int i = 1; i < subReadSize; ++i) {
3295 m_seq[i] = tmpScalar;
3299 if (m_env.subDisplayFile()) {
3300 *m_env.subDisplayFile() <<
"Leaving ScalarSequence<T>::unifiedReadContents()"
3301 <<
", fileName = " << fileName
3316 for (
unsigned int i = 0; i < m_seq.size(); ++i) {
3317 m_seq[i] = src.
m_seq[i];
3319 deleteStoredScalars();
3327 unsigned int initialPos,
3328 unsigned int spacing,
3329 unsigned int numPos,
3334 for (
unsigned int j = 0; j < numPos; ++j) {
3344 scalarSeq[j] = m_seq[initialPos+j ];
3348 for (
unsigned int j = 0; j < numPos; ++j) {
3358 scalarSeq[j] = m_seq[initialPos+j*spacing];
3368 unsigned int initialPos,
3369 unsigned int spacing,
3370 unsigned int numPos,
3371 std::vector<double>& rawDataVec)
const
3373 rawDataVec.resize(numPos);
3375 for (
unsigned int j = 0; j < numPos; ++j) {
3376 rawDataVec[j] = m_seq[initialPos+j ];
3380 for (
unsigned int j = 0; j < numPos; ++j) {
3381 rawDataVec[j] = m_seq[initialPos+j*spacing];
3400 std::sort(m_seq.begin(), m_seq.end());
3409 std::vector<T>& sortedBuffer,
3410 const std::vector<T>& leafData,
3411 unsigned int currentTreeLevel)
const
3413 int parentNode = m_env.inter0Rank() & ~(1 << currentTreeLevel);
3415 if (m_env.inter0Rank() >= 0) {
3416 if (currentTreeLevel == 0) {
3418 unsigned int leafDataSize = leafData.size();
3419 sortedBuffer.resize(leafDataSize,0.);
3420 for (
unsigned int i = 0; i < leafDataSize; ++i) {
3421 sortedBuffer[i] = leafData[i];
3423 std::sort(sortedBuffer.begin(), sortedBuffer.end());
3424 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
3425 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
3426 <<
": tree node " << m_env.inter0Rank()
3427 <<
", leaf sortedBuffer[0] = " << sortedBuffer[0]
3428 <<
", leaf sortedBuffer[" << sortedBuffer.size()-1 <<
"] = " << sortedBuffer[sortedBuffer.size()-1]
3433 int nextTreeLevel = currentTreeLevel - 1;
3434 int rightChildNode = m_env.inter0Rank() | (1 << nextTreeLevel);
3436 if (rightChildNode >= m_env.inter0Comm().NumProc()) {
3437 this->parallelMerge(sortedBuffer,
3442 unsigned int uintBuffer[1];
3443 uintBuffer[0] = nextTreeLevel;
3445 "ScalarSequence<T>::parallelMerge()",
3446 "failed MPI.Send() for init");
3448 this->parallelMerge(sortedBuffer,
3453 unsigned int leftSize = sortedBuffer.size();
3454 std::vector<T> leftSortedBuffer(leftSize,0.);
3455 for (
unsigned int i = 0; i < leftSize; ++i) {
3456 leftSortedBuffer[i] = sortedBuffer[i];
3462 "ScalarSequence<T>::parallelMerge()",
3463 "failed MPI.Recv() for size");
3466 unsigned int rightSize = uintBuffer[0];
3467 std::vector<T> rightSortedBuffer(rightSize,0.);
3469 "ScalarSequence<T>::parallelMerge()",
3470 "failed MPI.Recv() for data");
3473 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
3474 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
3475 <<
": tree node " << m_env.inter0Rank()
3476 <<
" is combining " << leftSortedBuffer.size()
3477 <<
" left doubles with " << rightSortedBuffer.size()
3482 sortedBuffer.clear();
3483 sortedBuffer.resize(leftSortedBuffer.size()+rightSortedBuffer.size(),0.);
3487 while ((i < leftSize ) &&
3489 if (leftSortedBuffer[i] > rightSortedBuffer[j]) sortedBuffer[k++] = rightSortedBuffer[j++];
3490 else sortedBuffer[k++] = leftSortedBuffer [i++];
3492 while (i < leftSize ) sortedBuffer[k++] = leftSortedBuffer [i++];
3493 while (j < rightSize) sortedBuffer[k++] = rightSortedBuffer[j++];
3494 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 0)) {
3495 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
3496 <<
": tree node " << m_env.inter0Rank()
3497 <<
", merged sortedBuffer[0] = " << sortedBuffer[0]
3498 <<
", merged sortedBuffer[" << sortedBuffer.size()-1 <<
"] = " << sortedBuffer[sortedBuffer.size()-1]
3504 if (parentNode != m_env.inter0Rank()) {
3506 unsigned int uintBuffer[1];
3507 uintBuffer[0] = sortedBuffer.size();
3509 "ScalarSequence<T>::parallelMerge()",
3510 "failed MPI.Send() for size");
3512 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 10)) {
3513 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::parallelMerge()"
3514 <<
": tree node " << m_env.inter0Rank()
3515 <<
" is sending " << sortedBuffer.size()
3516 <<
" doubles to tree node " << parentNode
3517 <<
", with sortedBuffer[0] = " << sortedBuffer[0]
3518 <<
" and sortedBuffer[" << sortedBuffer.size()-1 <<
"] = " << sortedBuffer[sortedBuffer.size()-1]
3523 "ScalarSequence<T>::parallelMerge()",
3524 "failed MPI.Send() for data");
3536 #ifdef QUESO_COMPUTES_EXTRA_POST_PROCESSING_STATISTICS
3540 unsigned int numEvaluationPoints,
3543 std::vector<T>& mdfValues)
const
3547 std::vector<T> centers(numEvaluationPoints,0.);
3548 std::vector<unsigned int> bins (numEvaluationPoints,0);
3551 this->subSequenceSize(),
3560 minDomainValue = centers[0];
3561 maxDomainValue = centers[centers.size()-1];
3562 T binSize = (maxDomainValue - minDomainValue)/((
double)(centers.size() - 1));
3564 unsigned int totalCount = 0;
3565 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
3566 totalCount += bins[i];
3570 mdfValues.resize(numEvaluationPoints);
3571 for (
unsigned int i = 0; i < numEvaluationPoints; ++i) {
3572 mdfValues[i] = ((T) bins[i])/((T) totalCount)/binSize;
3580 ScalarSequence<T>::subMeanCltStd(
3581 unsigned int initialPos,
3582 unsigned int numPos,
3583 const T& meanValue)
const
3585 if (this->subSequenceSize() == 0)
return 0.;
3587 bool bRC = ((initialPos < this->subSequenceSize()) &&
3589 ((initialPos+numPos) <= this->subSequenceSize()));
3592 "ScalarSequence<T>::subMeanCltStd()",
3593 "invalid input data");
3595 unsigned int finalPosPlus1 = initialPos + numPos;
3598 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
3599 diff = m_seq[j] - meanValue;
3600 stdValue += diff*diff;
3603 stdValue /= (((T) numPos) - 1.);
3604 stdValue /= (((T) numPos) - 1.);
3605 stdValue = sqrt(stdValue);
3612 ScalarSequence<T>::unifiedMeanCltStd(
3613 bool useOnlyInter0Comm,
3614 unsigned int initialPos,
3615 unsigned int numPos,
3616 const T& unifiedMeanValue)
const
3618 if (m_env.numSubEnvironments() == 1) {
3619 return this->subMeanCltStd(initialPos,
3626 T unifiedStdValue = 0.;
3627 if (useOnlyInter0Comm) {
3628 if (m_env.inter0Rank() >= 0) {
3629 bool bRC = ((initialPos < this->subSequenceSize()) &&
3631 ((initialPos+numPos) <= this->subSequenceSize()));
3634 "ScalarSequence<T>::unifiedMeanCltStd()",
3635 "invalid input data");
3637 unsigned int finalPosPlus1 = initialPos + numPos;
3639 T localStdValue = 0.;
3640 for (
unsigned int j = initialPos; j < finalPosPlus1; ++j) {
3641 diff = m_seq[j] - unifiedMeanValue;
3642 localStdValue += diff*diff;
3645 unsigned int unifiedNumPos = 0;
3647 "ScalarSequence<T>::unifiedMeanCltStd()",
3648 "failed MPI.Allreduce() for numPos");
3651 "ScalarSequence<T>::unifiedMeanCltStd()",
3652 "failed MPI.Allreduce() for stdValue");
3654 unifiedStdValue /= (((T) unifiedNumPos) - 1.);
3655 unifiedStdValue /= (((T) unifiedNumPos) - 1.);
3656 unifiedStdValue /= sqrt(unifiedStdValue);
3660 this->subMeanCltStd(initialPos,
3668 "ScalarSequence<T>::unifiedMeanCltStd()",
3669 "parallel vectors not supported yet");
3673 return unifiedStdValue;
3678 ScalarSequence<T>::bmm(
3679 unsigned int initialPos,
3680 unsigned int batchLength)
const
3682 bool bRC = ((initialPos < this->subSequenceSize() ) &&
3683 (batchLength < (this->subSequenceSize()-initialPos)));
3686 "ScalarSequences<T>::bmm()",
3687 "invalid input data");
3689 unsigned int numberOfBatches = (this->subSequenceSize() - initialPos)/batchLength;
3690 ScalarSequence<T> batchMeans(m_env,numberOfBatches,
"");
3692 for (
unsigned int batchId = 0; batchId < numberOfBatches; batchId++) {
3693 batchMeans[batchId] = this->subMeanExtra(initialPos + batchId*batchLength,
3697 T meanOfBatchMeans = batchMeans.subMeanExtra(0,
3698 batchMeans.subSequenceSize());
3705 T bmmValue = batchMeans.subSampleVarianceExtra(0,
3706 batchMeans.subSequenceSize(),
3709 bmmValue /= (T) batchMeans.subSequenceSize();
3717 ScalarSequence<T>::psd(
3718 unsigned int initialPos,
3719 unsigned int numBlocks,
3720 double hopSizeRatio,
3721 std::vector<double>& psdResult)
const
3723 bool bRC = ((initialPos < this->subSequenceSize() ) &&
3724 (hopSizeRatio != 0. ) &&
3725 (numBlocks < (this->subSequenceSize() - initialPos)) &&
3726 (fabs(hopSizeRatio) < (double) (this->subSequenceSize() - initialPos)));
3729 "ScalarSequence<T>::psd()",
3730 "invalid input data");
3732 unsigned int dataSize = this->subSequenceSize() - initialPos;
3734 T meanValue = this->subMeanExtra(initialPos,
3738 unsigned int hopSize = 0;
3739 unsigned int blockSize = 0;
3740 if (hopSizeRatio <= -1.) {
3741 double overlapSize = -hopSizeRatio;
3742 double tmp = ((double) (dataSize + (numBlocks - 1)*overlapSize))/((double) numBlocks);
3743 blockSize = (
unsigned int) tmp;
3745 else if (hopSizeRatio < 0.) {
3746 double tmp = ((double) dataSize)/(( ((double) numBlocks) - 1. )*(-hopSizeRatio) + 1.);
3747 blockSize = (
unsigned int) tmp;
3748 hopSize = (
unsigned int) ( ((
double) blockSize) * (-hopSizeRatio) );
3750 else if (hopSizeRatio == 0.) {
3753 "ScalarSequence<T>::psd()",
3754 "hopSizeRatio == 0");
3756 else if (hopSizeRatio < 1.) {
3757 double tmp = ((double) dataSize)/(( ((double) numBlocks) - 1. )*hopSizeRatio + 1.);
3758 blockSize = (
unsigned int) tmp;
3759 hopSize = (
unsigned int) ( ((
double) blockSize) * hopSizeRatio );
3762 hopSize = (
unsigned int) hopSizeRatio;
3763 blockSize = dataSize - (numBlocks - 1)*hopSize;
3766 int numberOfDiscardedDataElements = dataSize - (numBlocks-1)*hopSize - blockSize;
3780 "ScalarSequence<T>::psd()",
3781 "eventual extra space for last block should not be negative");
3783 double tmp = log((
double) blockSize)/log(2.);
3784 double fractionalPart = tmp - ((double) ((
unsigned int) tmp));
3785 if (fractionalPart > 0.) tmp += (1. - fractionalPart);
3786 unsigned int fftSize = (
unsigned int) std::pow(2.,tmp);
3794 double modificationScale = 0.;
3795 for (
unsigned int j = 0; j < blockSize; ++j) {
3797 modificationScale += tmpValue*tmpValue;
3799 modificationScale = 1./modificationScale;
3801 std::vector<double> blockData(blockSize,0.);
3802 Fft<T> fftObj(m_env);
3803 std::vector<std::complex<double> > fftResult(0,std::complex<double>(0.,0.));
3806 unsigned int halfFFTSize = fftSize/2;
3808 psdResult.resize(1+halfFFTSize,0.);
3809 double factor = 1./M_PI/((double) numBlocks);
3812 psdResult.resize(fftSize,0.);
3813 double factor = 1./2./M_PI/((double) numBlocks);
3816 for (
unsigned int blockId = 0; blockId < numBlocks; blockId++) {
3818 unsigned int initialDataPos = initialPos + blockId*hopSize;
3819 for (
unsigned int j = 0; j < blockSize; ++j) {
3820 unsigned int dataPos = initialDataPos + j;
3823 "ScalarSequence<T>::psd()",
3824 "too large position to be accessed in data");
3825 blockData[j] =
MiscHammingWindow(blockSize-1,j) * ( m_seq[dataPos] - meanValue );
3828 fftObj.forward(blockData,fftSize,fftResult);
3838 for (
unsigned int j = 0; j < psdResult.size(); ++j) {
3839 psdResult[j] += norm(fftResult[j])*modificationScale;
3843 for (
unsigned int j = 0; j < psdResult.size(); ++j) {
3844 psdResult[j] *= factor;
3852 ScalarSequence<T>::geweke(
3853 unsigned int initialPos,
3855 double ratioNb)
const
3857 double doubleFullDataSize = (double) (this->subSequenceSize() - initialPos);
3858 ScalarSequence<T> tmpSeq(m_env,0,
"");
3859 std::vector<double> psdResult(0,0.);
3861 unsigned int dataSizeA = (
unsigned int) (doubleFullDataSize * ratioNa);
3862 double doubleDataSizeA = (double) dataSizeA;
3863 unsigned int initialPosA = initialPos;
3864 this->extractScalarSeq(initialPosA,
3868 double meanA = tmpSeq.subMeanExtra(0,
3871 (
unsigned int) std::sqrt((
double) dataSizeA),
3874 double psdA = psdResult[0];
3875 double varOfMeanA = 2.*M_PI*psdA/doubleDataSizeA;
3877 unsigned int dataSizeB = (
unsigned int) (doubleFullDataSize * ratioNb);
3878 double doubleDataSizeB = (double) dataSizeB;
3879 unsigned int initialPosB = this->subSequenceSize() - dataSizeB;
3880 this->extractScalarSeq(initialPosB,
3884 double meanB = tmpSeq.subMeanExtra(0,
3887 (
unsigned int) std::sqrt((
double) dataSizeB),
3890 double psdB = psdResult[0];
3891 double varOfMeanB = 2.*M_PI*psdB/doubleDataSizeB;
3893 if (m_env.subDisplayFile()) {
3894 *m_env.subDisplayFile() <<
"In ScalarSequence<T>::geweke()"
3895 <<
", before computation of gewCoef"
3897 <<
", dataSizeA = " << dataSizeA
3898 <<
", numBlocksA = " << (
unsigned int) std::sqrt((
double) dataSizeA)
3899 << ", meanA = " << meanA
3900 << ", psdA = " << psdA
3901 << ", varOfMeanA = " << varOfMeanA
3903 << ", dataSizeB = " << dataSizeB
3904 << ", numBlocksB = " << (
unsigned int) std::sqrt((
double) dataSizeB)
3905 << ", meanB = " << meanB
3906 << ", psdB = " << psdB
3907 << ", varOfMeanB = " << varOfMeanB
3910 double gewCoef = (meanA - meanB)/std::sqrt(varOfMeanA + varOfMeanB);
3917 ScalarSequence<T>::meanStacc(
3918 unsigned int initialPos)
const
3922 "ScalarSequence<T>::meanStacc()",
3923 "not implemented yet");
3932 ScalarSequence<T>::subCdfPercentageRange(
3933 unsigned int initialPos,
3934 unsigned int numPos,
3937 T& upperValue)
const
3941 "ScalarSequence<T>::subCdfPercetangeRange()",
3946 "ScalarSequence<T>::subCdfPercetangeRange()",
3947 "invalid 'range' value");
3949 ScalarSequence<T> sortedSequence(m_env,0,
"");;
3950 sortedSequence.resizeSequence(numPos);
3951 this->extractScalarSeq(initialPos,
3955 sortedSequence.subSort();
3957 unsigned int lowerId = (
unsigned int) round( 0.5*(1.-range)*((double) numPos) );
3958 lowerValue = sortedSequence[lowerId];
3960 unsigned int upperId = (
unsigned int) round( 0.5*(1.+range)*((double) numPos) );
3961 if (upperId == numPos) {
3962 upperId = upperId-1;
3966 "ScalarSequence<T>::subCdfPercetangeRange()",
3967 "'upperId' got too big");
3968 upperValue = sortedSequence[upperId];
3975 ScalarSequence<T>::unifiedCdfPercentageRange(
3976 bool useOnlyInter0Comm,
3977 unsigned int initialPos,
3978 unsigned int numPos,
3980 T& unifiedLowerValue,
3981 T& unifiedUpperValue)
const
3983 if (m_env.numSubEnvironments() == 1) {
3984 return this->subCdfPercentageRange(initialPos,
3995 "ScalarSequence<T>::unifiedCdfPercetangeRange()",
4000 "ScalarSequence<T>::unifiedCdfPercetangeRange()",
4001 "invalid 'range' value");
4003 if (useOnlyInter0Comm) {
4004 if (m_env.inter0Rank() >= 0) {
4007 "ScalarSequence<T>::unifiedCdfPercentageRange()",
4008 "code not implemented yet");
4012 this->subCdfPercentageRange(initialPos,
4021 "ScalarSequence<T>::unifiedCdfPercentageRange()",
4022 "parallel vectors not supported yet");
4031 ScalarSequence<T>::subCdfStacc(
4032 unsigned int initialPos,
4033 std::vector<double>& cdfStaccValues,
4034 std::vector<double>& cdfStaccValuesUp,
4035 std::vector<double>& cdfStaccValuesLow,
4036 const ScalarSequence<T>& sortedDataValues)
const
4040 "ScalarSequence<T>::subCdfStacc()",
4041 "not implemented yet");
4042 bool bRC = (initialPos < this->subSequenceSize() );
4045 "ScalarSequence<V>::subGaussianKDE()",
4046 "invalid input data");
4048 unsigned int numPoints = subSequenceSize()-initialPos;
4049 double auxNumPoints = numPoints;
4050 double maxLamb = 0.;
4051 std::vector<double> ro (numPoints,0.);
4052 std::vector<double> Isam_mat(numPoints,0.);
4054 for (
unsigned int pointId = 0; pointId < numPoints; pointId++) {
4055 double p = ( ((double) pointId) + 1.0 )/auxNumPoints;
4056 double ro0 = p*(1.0-p);
4057 cdfStaccValues[pointId] = p;
4062 for (
unsigned int k = 0; k < numPoints; k++) {
4063 if (m_seq[k] <= sortedDataValues[pointId]) {
4071 for (
unsigned int tau = 0; tau < (numPoints-1); tau++) {
4073 for (
unsigned int kk = 0; kk < numPoints-(tau+1); kk++) {
4074 ro[tau] += (Isam_mat[kk+tau+1]-p)*(Isam_mat[kk]-p);
4076 ro[tau] *= 1.0/auxNumPoints;
4079 for (
unsigned int tau = 0; tau < (numPoints-1); tau++) {
4080 double auxTau = tau;
4081 lamb += (1.-(auxTau+1.)/auxNumPoints)*ro[tau]/ro0;
4082 if (lamb > maxLamb) maxLamb = lamb;
4087 cdfStaccValuesUp [pointId] = cdfStaccValues[pointId]+1.96*sqrt(ro0/auxNumPoints*(1.+lamb));
4088 cdfStaccValuesLow[pointId] = cdfStaccValues[pointId]-1.96*sqrt(ro0/auxNumPoints*(1.+lamb));
4089 if (cdfStaccValuesLow[pointId] < 0.) cdfStaccValuesLow[pointId] = 0.;
4090 if (cdfStaccValuesUp [pointId] > 1.) cdfStaccValuesUp [pointId] = 1.;
4098 unsigned int dataSize = this->subSequenceSize() - initialPos;
4099 unsigned int numEvals = evaluationPositions.size();
4101 for (
unsigned int j = 0; j < numEvals; ++j) {
4102 double x = evaluationPositions[j];
4104 for (
unsigned int k = 0; k < dataSize; ++k) {
4105 double xk = m_seq[initialPos+k];
4108 cdfStaccValues[j] = value/(double) dataSize;
4117 ScalarSequence<T>::subCdfStacc(
4118 unsigned int initialPos,
4119 const std::vector<T>& evaluationPositions,
4120 std::vector<double>& cdfStaccValues)
const
4124 "ScalarSequence<T>::subCdfStacc()",
4125 "not implemented yet");
4127 bool bRC = ((initialPos < this->subSequenceSize() ) &&
4128 (0 < evaluationPositions.size()) &&
4129 (evaluationPositions.size() == cdfStaccValues.size() ));
4132 "ScalarSequence<V>::subCdfStacc()",
4133 "invalid input data");
4142 unsigned int dataSize = this->subSequenceSize() - initialPos;
4143 unsigned int numEvals = evaluationPositions.size();
4145 for (
unsigned int j = 0; j < numEvals; ++j) {
4148 for (
unsigned int k = 0; k < dataSize; ++k) {
4152 cdfStaccValues[j] = value/(double) dataSize;
4158 #endif // #ifdef QUESO_COMPUTES_EXTRA_POST_PROCESSING_STATISTICS
4168 unsigned int initialPos,
4171 const std::vector<T>& evaluationPositions1,
4172 const std::vector<T>& evaluationPositions2,
4173 std::vector<double>& densityValues)
4177 "ComputeSubGaussian2dKde()",
4178 "not implemented yet for initialPos != 0");
4180 double covValue = 0.;
4181 double corrValue = 0.;
4190 (0 < evaluationPositions1.size() ) &&
4191 (evaluationPositions1.size() == evaluationPositions2.size() ) &&
4192 (evaluationPositions1.size() == densityValues.size() ));
4195 "ComputeSubGaussian2dKde()",
4196 "invalid input data");
4199 unsigned int numEvals = evaluationPositions1.size();
4201 double scale1Inv = 1./scaleValue1;
4202 double scale2Inv = 1./scaleValue2;
4204 double r = 1. - corrValue*corrValue;
4206 std::cerr <<
"In ComputeSubGaussian2dKde()"
4207 <<
": WARNING, r = " << r
4214 for (
unsigned int j = 0; j < numEvals; ++j) {
4215 double x1 = evaluationPositions1[j];
4216 double x2 = evaluationPositions2[j];
4218 for (
unsigned int k = 0; k < dataSize; ++k) {
4219 double d1k = scale1Inv*(x1 - scalarSeq1[initialPos+k]);
4220 double d2k = scale2Inv*(x2 - scalarSeq2[initialPos+k]);
4221 value += exp(-.5*( d1k*d1k + 2*corrValue*d1k*d2k + d2k*d2k )/r);
4223 densityValues[j] = scale1Inv * scale2Inv * (value/(double) dataSize) / 2. / M_PI / sqrt(r);
4234 unsigned int initialPos,
4235 double unifiedScaleValue1,
4236 double unifiedScaleValue2,
4237 const std::vector<T>& unifiedEvaluationPositions1,
4238 const std::vector<T>& unifiedEvaluationPositions2,
4239 std::vector<double>& unifiedDensityValues)
4247 unifiedEvaluationPositions1,
4248 unifiedEvaluationPositions2,
4249 unifiedDensityValues);
4254 if (useOnlyInter0Comm) {
4258 "ComputeUnifiedGaussian2dKde()",
4259 "inter0 case not supported yet");
4268 unifiedEvaluationPositions1,
4269 unifiedEvaluationPositions2,
4270 unifiedDensityValues);
4276 "ComputeUnifiedGaussian2dKde()",
4277 "parallel vectors not supported yet");
4290 unsigned int subNumSamples,
4299 "ComputeCovCorrBetweenScalarSequences()",
4300 "subNumSamples is too large");
4312 for (
unsigned k = 0; k < subNumSamples; ++k) {
4314 tmpP = subPSeq[k] - unifiedMeanP;
4315 tmpQ = subQSeq[k] - unifiedMeanQ;
4316 covValue += tmpP*tmpQ;
4332 unsigned int unifiedNumSamples = 0;
4334 "ComputeCovCorrBetweenScalarSequences()",
4335 "failed MPI.Allreduce() for subNumSamples");
4339 "ComputeCovCorrBetweenScalarSequences()",
4340 "failed MPI.Allreduce() for a matrix position");
4341 covValue = aux/((double) (unifiedNumSamples-1));
4343 corrValue = covValue/std::sqrt(unifiedSampleVarianceP)/std::sqrt(unifiedSampleVarianceQ);
4345 if ((corrValue < -1.) || (corrValue > 1.)) {
4346 std::cerr <<
"In ComputeCovCorrBetweenScalarSequences()"
4347 <<
": computed correlation is out of range, corrValue = " << corrValue
T subInterQuantileRange(unsigned int initialPos) const
Returns the interquartile range of the values 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.
std::vector< T > & rawData()
The sequence of scalars. Access to private attribute m_seq.
void resetValues(unsigned int initialPos, unsigned int)
Sets numPos values of the sequence to zero, starting at position initialPos.
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.
ScalarSequence< T > & operator=(const ScalarSequence< T > &rhs)
Assignment operator; it copies rhs to this.
void extractRawData(unsigned int initialPos, unsigned int spacing, unsigned int numPos, std::vector< double > &rawData) const
Extracts the raw data.
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...
T subPositionsOfMaximum(const ScalarSequence< T > &subCorrespondingScalarValues, ScalarSequence< T > &subPositionsOfMaximum)
Finds the positions where the maximum element occurs in the sub-sequence.
void parallelMerge(std::vector< T > &sortedBuffer, const std::vector< T > &leafData, unsigned int treeLevel) const
Sorts/merges data in parallel using MPI.
void erasePositions(unsigned int initialPos, unsigned int numPos)
Erases numPos values of the sequence, starting at position initialPos.
void clear()
Clears the sequence of scalars.
#define RawValue_MPI_IN_PLACE
int inter0Rank() const
Returns the process inter0 rank.
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 deleteStoredScalars()
Deletes all stored scalars.
Struct for handling data input and output from files.
int worldRank() const
Returns the process world rank.
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.
#define RawValue_MPI_DOUBLE
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...
#define RawValue_MPI_UNSIGNED
unsigned int unifiedSequenceSize(bool useOnlyInter0Comm) const
Size of the unified sequence of scalars.
const T & unifiedMaxPlain(bool useOnlyInter0Comm) const
Finds the maximum value of the unified sequence of scalars.
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)
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.
Class for handling scalar samples.
void extractScalarSeq(unsigned int initialPos, unsigned int spacing, unsigned int numPos, ScalarSequence< T > &scalarSeq) const
Extracts a sequence of scalars.
T autoCorrViaDef(unsigned int initialPos, unsigned int numPos, unsigned int lag) const
Calculates the autocorrelation via definition.
const T & unifiedMeanPlain(bool useOnlyInter0Comm) const
Finds the mean value of the unified sequence of scalars.
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...
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.
const std::string & name() const
Access to the name of the sequence of scalars.
This (virtual) class sets up the environment underlying the use of the QUESO library by an executable...
std::ofstream * ofsVar
Provides a stream interface to write data to files.
#define UQ_FILE_EXTENSION_FOR_MATLAB_FORMAT
const T & subMaxPlain() const
Finds the maximum value of the sub-sequence of scalars.
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...
const T & operator[](unsigned int posId) const
Access position posId of the sequence of scalars (const).
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...
void copy(const ScalarSequence< T > &src)
Copies the scalar sequence src to this.
ScalarSequence(const BaseEnvironment &env, unsigned int subSequenceSize, const std::string &name)
Default constructor.
void resizeSequence(unsigned int newSequenceSize)
Resizes the size of the sequence of scalars.
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
void Allreduce(void *sendbuf, void *recvbuf, int count, RawType_MPI_Datatype datatype, RawType_MPI_Op op, const char *whereMsg, const char *whatMsg) const
Combines values from all processes and distributes the result back to all processes.
T subMedianExtra(unsigned int initialPos, unsigned int numPos) const
Finds the median value of the sub-sequence, considering numPos positions starting at position initial...
const T & subMinPlain() const
Finds the minimum value of the sub-sequence of scalars.
void append(const ScalarSequence< T > &src, unsigned int srcInitialPos, unsigned int srcNumPos)
Appends the scalar sequence src to this sequence.
T autoCovariance(unsigned int initialPos, unsigned int numPos, const T &meanValue, unsigned int lag) const
Calculates the autocovariance.
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...
void filter(unsigned int initialPos, unsigned int spacing)
Filters positions in the sequence of vectors.
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 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 ...
std::ifstream * ifsVar
Provides a stream interface to read data from files.
T unifiedInterQuantileRange(bool useOnlyInter0Comm, unsigned int initialPos) const
Returns the interquartile range of the values in the unified sequence.
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 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.
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 unifiedWriteContents(const std::string &fileName, const std::string &fileType) const
Writes the unified sequence to a file.
double MiscHammingWindow(unsigned int N, unsigned int j)
const T & unifiedSampleVariancePlain(bool useOnlyInter0Comm) const
Finds the variance of a sample of the unified sequence of scalars.
const T & unifiedMinPlain(bool useOnlyInter0Comm) const
Finds the minimum value of the unified sequence of scalars.
const T & subSampleVariancePlain() const
Finds the variance of a sample of the sub-sequence of scalars.
#define SCALAR_SEQUENCE_INIT_MPI_MSG
unsigned int subSequenceSize() const
Size of the sub-sequence of scalars.
unsigned int numSubEnvironments() const
Access function to the number of sub-environments.
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 brooksGelmanConvMeasure(bool useOnlyInter0Comm, unsigned int initialPos, unsigned int spacing) const
Estimates convergence rate using Brooks & Gelman method.
T unifiedPositionsOfMaximum(const ScalarSequence< T > &subCorrespondingScalarValues, ScalarSequence< T > &unifiedPositionsOfMaximum)
Finds the positions where the maximum element occurs in the unified sequence.
void subSort(unsigned int initialPos, ScalarSequence< T > &sortedSequence) const
Sorts the sub-sequence of scalars.
#define UQ_FILE_EXTENSION_FOR_HDF_FORMAT
Class for accommodating uniform one-dimensional grids.
const BaseEnvironment & env() const
Access to QUESO environment.
Class for a Fast Fourier Transform (FFT) algorithm.
double MiscGaussianDensity(double x, double mu, double sigma)
std::vector< T >::const_iterator seqScalarPositionConstIteratorTypedef
void getUnifiedContentsAtProc0Only(bool useOnlyInter0Comm, std::vector< T > &outputVec) const
Gets the unified contents of processor of rank equals to 0.
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...
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.
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.
#define SCALAR_SEQUENCE_SIZE_MPI_MSG
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.
const MpiComm & inter0Comm() const
Access function for MpiComm inter0-communicator.
#define SCALAR_SEQUENCE_DATA_MPI_MSG
#define RawValue_MPI_ANY_SOURCE
void unifiedReadContents(const std::string &fileName, const std::string &fileType, const unsigned int subSequenceSize)
Reads the unified sequence from a file.
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.
void unifiedSort(bool useOnlyInter0Comm, unsigned int initialPos, ScalarSequence< T > &unifiedSortedSequence) const
Sorts the unified sequence of scalars.
MPI_Status RawType_MPI_Status
void subSort()
Sorts the sequence of scalars in the private attribute m_seq.
const T & subMedianPlain() const
Finds the median value of the sub-sequence of scalars.
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...
std::vector< T >::iterator seqScalarPositionIteratorTypedef
void setName(const std::string &newName)
Sets a new name to the sequence of scalars.
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...
const T & subMeanPlain() const
Finds the mean value of the sub-sequence of scalars.
const T & unifiedMedianPlain(bool useOnlyInter0Comm) const
Finds the median 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).
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.
~ScalarSequence()
Destructor.
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)
void ComputeCovCorrBetweenScalarSequences(const ScalarSequence< T > &subPSeq, const ScalarSequence< T > &subQSeq, unsigned int subNumSamples, T &covValue, T &corrValue)
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...