QMCPACK
TraceBuffer< T > Struct Template Reference
+ Inheritance diagram for TraceBuffer< T >:
+ Collaboration diagram for TraceBuffer< T >:

Public Member Functions

 TraceBuffer ()
 
void set_verbose (bool v)
 
void set_type (std::string stype)
 
void reset ()
 
void set_samples (TraceSamples< T > &s)
 
void set_samples (TraceSamples< std::complex< T >> &s)
 
void make_combined_trace (const std::string &name, std::vector< std::string > &names, std::vector< TraceReal > &weights)
 
void order_and_resize ()
 
bool same_as (TraceBuffer< T > &ref)
 
void collect_sample ()
 
void write ()
 
void write_summary (std::string pad=" ")
 
void user_report (const std::string &pad=" ")
 
void register_hdf_data (hdf_archive &f)
 
void write_hdf (hdf_archive &f)
 
void write_hdf (hdf_archive &f, hsize_t &file_pointer)
 
void test_buffer_write (int sample_size)
 
void test_buffer_collect (int current_row)
 

Public Attributes

bool has_complex
 
TraceSamples< T > * samples
 
TraceSamples< std::complex< T > > * complex_samples
 
std::string type
 
Array< T, 2 > buffer
 
bool verbose
 
std::string top
 
hsize_t dims [2]
 
hsize_t hdf_file_pointer
 

Detailed Description

template<typename T>
struct qmcplusplus::TraceBuffer< T >

Definition at line 1086 of file TraceManager.h.

Constructor & Destructor Documentation

◆ TraceBuffer()

TraceBuffer ( )
inline

Definition at line 1101 of file TraceManager.h.

1101  : samples(0), complex_samples(0), verbose(false)
1102  {
1103  type = "?";
1104  has_complex = false;
1105  reset();
1106  }
TraceSamples< std::complex< T > > * complex_samples
TraceSamples< T > * samples

Member Function Documentation

◆ collect_sample()

void collect_sample ( )
inline

Definition at line 1176 of file TraceManager.h.

Referenced by TraceManager::buffer_sample().

1177  {
1178  if (verbose)
1179  app_log() << " TraceBuffer<" << type << ">::collect_sample()" << std::endl;
1180  //make more room, if necessary
1181  int nrows = buffer.size(0);
1182  int row_size = buffer.size(1);
1183  if (row_size > 0)
1184  {
1185  //make space for the row, if necessary
1186  int current_row = nrows;
1187  nrows++;
1188  // resizing buffer(type Array) doesn't preserve data. Thus keep old data and copy over
1189  auto buffer_old(buffer);
1190  buffer.resize(nrows, row_size);
1191  std::copy_n(buffer_old.data(), buffer_old.size(), buffer.data());
1192  if (verbose)
1193  app_log() << " increasing # of rows to " << nrows << std::endl;
1194  //combine samples
1195  samples->combine_samples();
1196  if (has_complex)
1198  //collect data from all samples into the buffer row
1199  {
1200  std::vector<TraceSample<T>*>& ordered_samples = samples->ordered_samples;
1201  for (int s = 0; s < ordered_samples.size(); s++)
1202  {
1203  TraceSample<T>& tsample = *ordered_samples[s];
1204  if (tsample.write)
1205  {
1206  auto& sample = tsample.sample;
1207  for (int i = 0; i < sample.size(); ++i)
1208  buffer(current_row, tsample.buffer_start + i) = sample[i];
1209  }
1210  }
1211  }
1212  if (has_complex)
1213  {
1214  std::vector<TraceSample<std::complex<T>>*>& ordered_samples = complex_samples->ordered_samples;
1215  for (int s = 0; s < ordered_samples.size(); s++)
1216  {
1217  TraceSample<std::complex<T>>& tsample = *ordered_samples[s];
1218  if (tsample.write)
1219  {
1220  auto& sample = tsample.sample;
1221  for (int i = 0, ib = 0; i < sample.size(); ++i, ib += 2)
1222  {
1223  buffer(current_row, tsample.buffer_start + ib) = sample[i].real();
1224  buffer(current_row, tsample.buffer_start + ib + 1) = sample[i].imag();
1225  }
1226  }
1227  }
1228  }
1229  //reset combined samples so they can be recombined on the next step
1230  samples->reset_combined_samples();
1231  if (has_complex)
1233 #if defined(TRACE_CHECK)
1234  test_buffer_collect(current_row);
1235 #endif
1236  }
1237  }
std::ostream & app_log()
Definition: OutputManager.h:65
Type_t * data()
Definition: OhmmsArray.h:87
std::vector< TraceSample< T > * > ordered_samples
Definition: TraceManager.h:755
void resize(const std::array< SIZET, D > &dims)
Resize the container.
Definition: OhmmsArray.h:65
void test_buffer_collect(int current_row)
size_t size() const
Definition: OhmmsArray.h:57
TraceSamples< std::complex< T > > * complex_samples
sycl::event copy_n(sycl::queue &aq, const T1 *restrict VA, size_t array_size, T2 *restrict VC, const std::vector< sycl::event > &events)
Definition: syclBLAS.cpp:548
TraceSamples< T > * samples

◆ make_combined_trace()

void make_combined_trace ( const std::string &  name,
std::vector< std::string > &  names,
std::vector< TraceReal > &  weights 
)
inline

Definition at line 1132 of file TraceManager.h.

Referenced by TraceManager::make_combined_trace().

1135  {
1136  bool created_real = samples->make_combined_trace(name, names, weights);
1137  if (has_complex)
1138  {
1139  bool created_complex = complex_samples->make_combined_trace(name, names, weights);
1140  if (created_real && created_complex)
1141  APP_ABORT("TraceBuffer<" + type +
1142  ">::make_combined_trace\n cannot create real and complex combined traces for the same quantity\n "
1143  "attempted for quantity " +
1144  name);
1145  }
1146  }
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27
TraceSamples< std::complex< T > > * complex_samples
TraceSamples< T > * samples
bool make_combined_trace(const std::string &name, std::vector< std::string > &names, std::vector< TraceReal > &weights)
Definition: TraceManager.h:853

◆ order_and_resize()

void order_and_resize ( )
inline

Definition at line 1149 of file TraceManager.h.

Referenced by TraceManager::initialize_traces().

1150  {
1151  //put the sample data in size order
1152  samples->set_unit_size(1);
1153  samples->order_by_size();
1154  if (has_complex)
1155  {
1158  }
1159  //assign buffer ranges to each sample
1160  int sample_size = 0;
1161  samples->set_buffer_ranges(sample_size);
1162  if (has_complex)
1163  complex_samples->set_buffer_ranges(sample_size);
1164 #if defined(TRACE_CHECK)
1165  test_buffer_write(sample_size);
1166 #endif
1167  //resize the buffer
1168  int nsamples_init = 1;
1169  buffer.resize(nsamples_init, sample_size);
1170  }
void resize(const std::array< SIZET, D > &dims)
Resize the container.
Definition: OhmmsArray.h:65
void set_unit_size(int usize)
Definition: TraceManager.h:892
TraceSamples< std::complex< T > > * complex_samples
void set_buffer_ranges(int &starting_index)
Definition: TraceManager.h:926
void test_buffer_write(int sample_size)
TraceSamples< T > * samples

◆ register_hdf_data()

void register_hdf_data ( hdf_archive f)
inline

Definition at line 1264 of file TraceManager.h.

Referenced by TraceManager::open_hdf_file().

1265  {
1266  f.push(top);
1267  f.push("layout");
1268  samples->register_hdf_data(f);
1269  if (has_complex)
1271  f.pop();
1272  f.pop();
1273  if (!f.open_groups())
1274  APP_ABORT("TraceBuffer<" + type +
1275  ">::register_hdf_data() some hdf groups are still open at the end of registration");
1276  hdf_file_pointer = 0;
1277  }
void register_hdf_data(hdf_archive &f)
Definition: TraceManager.h:991
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27
TraceSamples< std::complex< T > > * complex_samples
TraceSamples< T > * samples

◆ reset()

void reset ( )
inline

Definition at line 1119 of file TraceManager.h.

Referenced by TraceManager::reset_buffers(), and TraceBuffer< TraceInt >::TraceBuffer().

1119 { buffer.resize(0, buffer.size(1)); }
void resize(const std::array< SIZET, D > &dims)
Resize the container.
Definition: OhmmsArray.h:65
size_t size() const
Definition: OhmmsArray.h:57

◆ same_as()

bool same_as ( TraceBuffer< T > &  ref)
inline

Definition at line 1173 of file TraceManager.h.

Referenced by TraceManager::check_clones().

1173 { return buffer.size(1) == ref.buffer.size(1); }
size_t size() const
Definition: OhmmsArray.h:57

◆ set_samples() [1/2]

void set_samples ( TraceSamples< T > &  s)
inline

Definition at line 1122 of file TraceManager.h.

Referenced by TraceManager::TraceManager().

1122 { samples = &s; }
TraceSamples< T > * samples

◆ set_samples() [2/2]

void set_samples ( TraceSamples< std::complex< T >> &  s)
inline

Definition at line 1125 of file TraceManager.h.

1126  {
1127  complex_samples = &s;
1128  has_complex = true;
1129  }
TraceSamples< std::complex< T > > * complex_samples

◆ set_type()

void set_type ( std::string  stype)
inline

Definition at line 1112 of file TraceManager.h.

Referenced by TraceManager::TraceManager().

1113  {
1114  type = stype;
1115  top = type + "_data";
1116  }

◆ set_verbose()

void set_verbose ( bool  v)
inline

Definition at line 1109 of file TraceManager.h.

Referenced by TraceManager::distribute().

1109 { verbose = v; }

◆ test_buffer_collect()

void test_buffer_collect ( int  current_row)
inline

Definition at line 1376 of file TraceManager.h.

Referenced by TraceBuffer< TraceInt >::collect_sample().

1377  {
1378  if (verbose)
1379  app_log() << "TraceBuffer::test_buffer_collect" << std::endl;
1380  std::string scalars = "scalars";
1381  std::map<std::string, std::map<std::string, int>>::iterator dom;
1382  std::map<std::string, int>::iterator var;
1383  std::map<std::string, std::map<std::string, int>>& domains = samples->sample_indices;
1384  std::vector<TraceSample<T>*>& tsamples = samples->samples;
1385  std::map<std::string, int>& scalar_vars = domains[scalars];
1386  for (var = scalar_vars.begin(); var != scalar_vars.end(); var++)
1387  {
1388  const std::string& name = var->first;
1389  TraceSample<T>& sample = *tsamples[var->second];
1390  T value = buffer(current_row, sample.buffer_start);
1391  T svalue = 0;
1392  bool any_present = false;
1393  for (dom = domains.begin(); dom != domains.end(); dom++)
1394  {
1395  const std::string& domain = dom->first;
1396  if (domain != scalars)
1397  {
1398  std::map<std::string, int>& vars = dom->second;
1399  if (vars.count(name) > 0)
1400  {
1401  any_present = true;
1402  TraceSample<T>& ssample = *tsamples[vars[name]];
1403  int start = ssample.buffer_start;
1404  int end = ssample.buffer_end;
1405  for (int i = start; i < end; i++)
1406  svalue += buffer(current_row, i);
1407  }
1408  }
1409  }
1410  if (any_present)
1411  {
1412  if (verbose)
1413  app_log() << " " << name << " " << value << " " << svalue << std::endl;
1414  }
1415  }
1416  }
std::ostream & app_log()
Definition: OutputManager.h:65
TraceSamples< T > * samples

◆ test_buffer_write()

void test_buffer_write ( int  sample_size)
inline

Definition at line 1300 of file TraceManager.h.

Referenced by TraceBuffer< TraceInt >::order_and_resize().

1301  {
1302  //check that the size is correct
1303  int ssize = samples->total_size();
1304  if (has_complex)
1305  ssize += complex_samples->total_size();
1306  if (sample_size != ssize)
1307  {
1308  app_log() << "sample_size = " << sample_size << "\ntotal_size = " << ssize << std::endl;
1309  APP_ABORT("TraceBuffer::test_buffer_write sample_size and total_size do not match");
1310  }
1311  //check that buffer indices fall in the expected range
1312  int nsamples = samples->size();
1313  int min_index = samples->min_buffer_index();
1314  int max_index = samples->max_buffer_index();
1315  if (has_complex)
1316  {
1317  nsamples += complex_samples->size();
1318  min_index = std::min(min_index, complex_samples->min_buffer_index());
1319  max_index = std::max(max_index, complex_samples->max_buffer_index());
1320  }
1321  if (nsamples > 0)
1322  {
1323  if (min_index != 0)
1324  APP_ABORT("TraceBuffer::test_buffer_write min_index!=0\n min_index=" << min_index);
1325  if (max_index != sample_size)
1326  APP_ABORT("TraceBuffer::test_buffer_write max_index!=sample_size");
1327  //check that no overlap exists in writes to buffer
1328  Array<int, 2> test_buffer;
1329  test_buffer.resize(1, sample_size);
1330  std::fill(test_buffer.begin(), test_buffer.end(), 0);
1331  int row = 0;
1332  int row_size = test_buffer.size(1);
1333  int offset = row * row_size;
1334  int* loc1 = &test_buffer(offset);
1335  int* loc2 = &test_buffer(row, 0);
1336  if (loc1 != loc2)
1337  APP_ABORT("TraceBuffer::test_buffer_write serialized buffer offset improperly computed");
1338  {
1339  int boffset;
1340  std::vector<TraceSample<T>*>& ordered_samples = samples->ordered_samples;
1341  for (int s = 0; s < ordered_samples.size(); s++)
1342  {
1343  TraceSample<T>& tsample = *ordered_samples[s];
1344  std::vector<T>& sample = tsample.sample;
1345  boffset = offset + tsample.buffer_start;
1346  for (int i = 0; i < sample.size(); ++i)
1347  test_buffer(boffset + i) = 1;
1348  }
1349  }
1350  if (has_complex)
1351  {
1352  int boffset;
1353  std::vector<TraceSample<std::complex<T>>*>& ordered_samples = complex_samples->ordered_samples;
1354  for (int s = 0; s < ordered_samples.size(); s++)
1355  {
1356  TraceSample<std::complex<T>>& tsample = *ordered_samples[s];
1357  std::vector<std::complex<T>>& sample = tsample.sample;
1358  boffset = offset + tsample.buffer_start;
1359  for (int i = 0, ib = 0; i < sample.size(); ++i, ib += tsample.unit_size)
1360  {
1361  test_buffer(boffset + ib) = 1;
1362  test_buffer(boffset + ib + 1) = 1;
1363  }
1364  }
1365  }
1366  //app_log()<<"test_buffer:"<< std::endl;
1367  //for(int i=0;i<row_size;++i)
1368  // app_log()<<" "<<i<<" "<<test_buffer(row,i)<< std::endl;
1369  for (int i = 0; i < row_size; ++i)
1370  if (!test_buffer(row, i))
1371  APP_ABORT("TraceBuffer::test_buffer_write write to row is not contiguous");
1372  }
1373  }
std::ostream & app_log()
Definition: OutputManager.h:65
std::vector< TraceSample< T > * > ordered_samples
Definition: TraceManager.h:755
void resize(const std::array< SIZET, D > &dims)
Resize the container.
Definition: OhmmsArray.h:65
T min(T a, T b)
size_t size() const
Definition: OhmmsArray.h:57
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27
TraceSamples< std::complex< T > > * complex_samples
Container_t::iterator begin()
Definition: OhmmsArray.h:80
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25
TraceSamples< T > * samples
Container_t::iterator end()
Definition: OhmmsArray.h:81

◆ user_report()

void user_report ( const std::string &  pad = "  ")
inline

Definition at line 1257 of file TraceManager.h.

Referenced by TraceManager::user_report().

1258  {
1259  samples->user_report(type, pad);
1260  if (has_complex)
1261  complex_samples->user_report("complex " + type, pad);
1262  }
void user_report(const std::string &type, const std::string &pad=" ")
TraceSamples< std::complex< T > > * complex_samples
TraceSamples< T > * samples

◆ write()

void write ( )
inline

Definition at line 1240 of file TraceManager.h.

1240 { APP_ABORT("TraceBuffer::write has not yet been implemented"); }
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27

◆ write_hdf() [1/2]

void write_hdf ( hdf_archive f)
inline

◆ write_hdf() [2/2]

void write_hdf ( hdf_archive f,
hsize_t &  file_pointer 
)
inline

Definition at line 1283 of file TraceManager.h.

1284  {
1285  if (verbose)
1286  app_log() << "TraceBuffer<" << type << ">::write_hdf() " << file_pointer << " " << buffer.size(0) << " "
1287  << buffer.size(1) << std::endl;
1288  dims[0] = buffer.size(0);
1289  dims[1] = buffer.size(1);
1290  if (dims[0] > 0)
1291  {
1292  f.push(top);
1293  h5d_append(f.top(), "traces", file_pointer, buffer.dim(), dims, buffer.data());
1294  f.pop();
1295  }
1296  f.flush();
1297  }
bool h5d_append(hid_t grp, const std::string &aname, hsize_t &current, hsize_t ndims, const hsize_t *const dims, const T *const first, hsize_t chunk_size=1, hid_t xfer_plist=H5P_DEFAULT)
std::ostream & app_log()
Definition: OutputManager.h:65
Type_t * data()
Definition: OhmmsArray.h:87
size_t size() const
Definition: OhmmsArray.h:57
unsigned dim() const
Definition: OhmmsArray.h:55

◆ write_summary()

void write_summary ( std::string  pad = "  ")
inline

Definition at line 1243 of file TraceManager.h.

Referenced by TraceManager::write_summary().

1244  {
1245  std::string pad2 = pad + " ";
1246  app_log() << pad << "TraceBuffer<" << type << ">" << std::endl;
1247  app_log() << pad2 << "nrows = " << buffer.size(0) << std::endl;
1248  app_log() << pad2 << "row_size = " << buffer.size(1) << std::endl;
1249  app_log() << pad2 << "has_complex = " << has_complex << std::endl;
1250  samples->write_summary(type, pad2);
1251  if (has_complex)
1252  complex_samples->write_summary("complex " + type, pad2);
1253  app_log() << pad << "end TraceBuffer<" << type << ">" << std::endl;
1254  }
std::ostream & app_log()
Definition: OutputManager.h:65
void write_summary(std::string type, std::string pad=" ")
size_t size() const
Definition: OhmmsArray.h:57
TraceSamples< std::complex< T > > * complex_samples
TraceSamples< T > * samples

Member Data Documentation

◆ buffer

◆ complex_samples

◆ dims

hsize_t dims[2]

Definition at line 1097 of file TraceManager.h.

Referenced by TraceBuffer< TraceInt >::write_hdf().

◆ has_complex

◆ hdf_file_pointer

◆ samples

◆ top

◆ type

◆ verbose


The documentation for this struct was generated from the following file: