File indexing completed on 2025-08-05 08:19:19
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include "JetScapeTaskSupport.h"
0017 #include "JetScapeLogger.h"
0018 #include <stdlib.h>
0019
0020 using namespace std;
0021
0022 namespace Jetscape {
0023
0024
0025 JetScapeTaskSupport *JetScapeTaskSupport::m_pInstance = nullptr;
0026 shared_ptr<std::mt19937> JetScapeTaskSupport::one_for_all_ = nullptr;
0027 unsigned int JetScapeTaskSupport::random_seed_ = 0;
0028 bool JetScapeTaskSupport::initialized_ = false;
0029 bool JetScapeTaskSupport::one_generator_per_task_ = false;
0030
0031
0032 JetScapeTaskSupport *JetScapeTaskSupport::Instance() {
0033 if (!m_pInstance) {
0034 m_pInstance = new JetScapeTaskSupport;
0035 VERBOSE(1) << "Created JetScapeTaskSupport Instance";
0036 }
0037 return m_pInstance;
0038 }
0039
0040
0041 int JetScapeTaskSupport::RegisterTask() {
0042 VERBOSE(1) << "JetScapeTaskSupport::RegisterTask called, answering "
0043 << CurrentTaskNumber;
0044 CurrentTaskNumber++;
0045 return CurrentTaskNumber - 1;
0046 }
0047
0048
0049 void JetScapeTaskSupport::ReadSeedFromXML() {
0050 VERBOSE(1) << "JetScapeTaskSupport::ReadSeedFromXML called. ";
0051
0052
0053 tinyxml2::XMLElement *RandomXmlDescription =
0054 JetScapeXML::Instance()->GetElement({"Random"});
0055 tinyxml2::XMLElement *xmle = 0;
0056 if (RandomXmlDescription) {
0057 xmle = RandomXmlDescription->FirstChildElement("seed");
0058 if (!xmle)
0059 throw std::runtime_error("Cannot parse xml");
0060 xmle->QueryUnsignedText(&random_seed_);
0061 } else {
0062 JSWARN << "No <Random> element found in xml, seeding to 0";
0063 }
0064
0065 VERBOSE(7) << "Seeding JetScapeTaskSupport to " << random_seed_;
0066 if (random_seed_ == 0) {
0067
0068 random_seed_ = std::chrono::system_clock::now().time_since_epoch().count();
0069 JSINFO << "JetScapeTaskSupport found seed 0, using one engine for all and "
0070 "reseeding to "
0071 << random_seed_;
0072 one_generator_per_task_ = false;
0073 } else {
0074 JSINFO << "JetScapeTaskSupport found seed " << random_seed_
0075 << ", using individual engines with seeds created from "
0076 << random_seed_;
0077 one_generator_per_task_ = true;
0078 }
0079
0080 one_for_all_ = make_shared<std::mt19937>(random_seed_);
0081
0082
0083
0084
0085
0086 initialized_ = true;
0087 }
0088
0089
0090 shared_ptr<std::mt19937> JetScapeTaskSupport::GetMt19937Generator(int TaskId) {
0091 if (!initialized_) {
0092 JSWARN << "Trying to use JetScapeTaskSupport::GetMt19937Generator before "
0093 "initialization";
0094 throw std::runtime_error(
0095 "Trying to use JetScapeTaskSupport::GetMt19937Generator before "
0096 "initialization");
0097 }
0098
0099 if (!one_for_all_) {
0100 throw std::runtime_error("generator not initialized?");
0101 }
0102
0103
0104
0105 if (one_generator_per_task_) {
0106 if (random_seed_ == 0)
0107 throw std::runtime_error("This should never happen");
0108
0109 one_for_all_->seed(random_seed_);
0110
0111
0112
0113 one_for_all_->discard(TaskId);
0114
0115 unsigned int localseed = (*one_for_all_)();
0116 JSDEBUG << "Asked by " << TaskId
0117 << " for an individual generator, returning one seeded with "
0118 << localseed;
0119 return make_shared<std::mt19937>(localseed);
0120 }
0121
0122
0123 JSDEBUG << "Asked by " << TaskId
0124 << " for the static generator, returning one originally seeded with "
0125 << random_seed_;
0126 return one_for_all_;
0127 }
0128
0129
0130
0131 }