MADNESS 0.10.1
cloud.h
Go to the documentation of this file.
1
2/**
3 \file cloud.h
4 \brief Declares the \c Cloud class for storing data and transfering them between worlds
5 \ingroup world
6
7*/
8
9/**
10 * TODO: - delete container record upon caching if container is replicated
11 * - set read-only option upon replicating
12 */
13
14#ifndef SRC_MADNESS_WORLD_CLOUD_H_
15#define SRC_MADNESS_WORLD_CLOUD_H_
16
17
19#include<any>
20#include<iomanip>
21
22
23/*!
24 \file cloud.h
25 \brief Defines and implements most of madness cloud storage
26
27 TODO: check use of preprocessor directives
28 TODO: clear cache in destructor won't work because no subworld is present -> must be explicitly called, error prone/
29*/
30
31namespace madness {
32
33template<typename keyT>
34struct Recordlist {
35 std::list<keyT> list;
36
37 Recordlist() : list() {};
38
39 explicit Recordlist(const keyT &key) : list{key} {};
40
41 Recordlist(const Recordlist &other) : list(other.list) {};
42
44 for (auto &l2 : list2.list) list.push_back(l2);
45 return *this;
46 }
47
48 Recordlist &operator+=(const keyT &key) {
49 list.push_back(key);
50 return *this;
51 }
52
54 keyT key = list.front();
55 list.pop_front();
56 return key;
57 }
58
59 std::size_t size() const {
60 return list.size();
61 }
62
63 // if type provides id() member function (i.e. WorldObject) use that for hashing, otherwise use hash_value() for
64 // fundamental types (see worldhash.h)
65 template <typename T>
66 using member_id_t = decltype(std::declval<T>().id());
67
68 template <typename T>
70
71 // if type provides a hashing function use that, intrusive hashing, see worldhash.h
72 template <typename T>
73 using member_hash_t = decltype(std::declval<T>().hash());
74
75 template <typename T>
77
78 template<typename T, std::size_t NDIM>
79 static keyT compute_record(const Function<T,NDIM>& arg) {return hash_value(arg.get_impl()->id());}
80
81 template<typename T, std::size_t NDIM>
82 static keyT compute_record(const FunctionImpl<T,NDIM>* arg) {return hash_value(arg->id());}
83
84 template<typename keyQ, typename valueT>
85 static keyT compute_record(const WorldContainer<keyQ,valueT>& arg) {return hash_value(arg.id());}
86
87 template<typename keyQ, typename valueT>
88 static keyT compute_record(const std::shared_ptr<WorldContainer<keyQ,valueT>>& arg) {return hash_value(arg->id());}
89
90 template<typename T, std::size_t NDIM>
91 static keyT compute_record(const std::shared_ptr<madness::FunctionImpl<T, NDIM>>& arg) {return hash_value(arg->id());}
92
93 template<typename T>
94 static keyT compute_record(const std::vector<T>& arg) {return hash_range(arg.begin(), arg.end());}
95
96 template<typename T>
97 static keyT compute_record(const Tensor<T>& arg) {return hash_value(arg.normf());}
98
99 template<typename T>
100 static keyT compute_record(const std::shared_ptr<T>& arg) {return compute_record(*arg);}
101
102 template<typename T>
103 static keyT compute_record(const T& arg) {
104 if constexpr (has_member_id<T>::value) {
105 return hash_value(arg.id());
106 } else if constexpr (std::is_pointer_v<T> && has_member_id<std::remove_pointer_t<T>>::value) {
107 return hash_value(arg->id());
108 } else {
109 // compute hash_code for fundamental types
110 std::size_t hashtype = typeid(T).hash_code();
111 hash_combine(hashtype,hash_value(arg));
112 return hashtype;
113 }
114 }
115
116
117 friend std::ostream &operator<<(std::ostream &os, const Recordlist &arg) {
118 using namespace madness::operators;
119 os << arg.list;
120 return os;
121 }
122
123};
124
125/// cloud class
126
127/// store and load data to/from the cloud into arbitrary worlds
128///
129/// Distributed data is always bound to a certain world. If it needs to be
130/// present in another world it can be serialized to the cloud and deserialized
131/// from there again. For an example see test_cloud.cc
132///
133/// Data is stored into a distributed container living in the universe.
134/// During storing a (replicated) list of records is returned that can be used to find the data
135/// in the container. If a combined object (a vector, tuple, etc) is stored a list of records
136/// will be generated. When loading the data from the world the record list will be used to
137/// deserialize all stored objects.
138///
139/// Note that there must be a fence after the destruction of subworld containers, as in:
140///
141/// create subworlds
142/// {
143/// dcT(subworld)
144/// do work
145/// }
146/// subworld.gop.fence();
147class Cloud {
148
149 bool debug = false; ///< prints debug output
150 bool is_replicated=false; ///< if contents of the container are replicated
151 bool dofence = true; ///< fences after load/store
152 bool force_load_from_cache = false; ///< forces load from cache (mainly for debugging)
153
154public:
155
156 typedef std::any cached_objT;
158 using valueT = std::vector<unsigned char>;
159 typedef std::map<keyT, cached_objT> cacheT;
161
162private:
165 recordlistT local_list_of_container_keys; // a world-local list of keys occupied in container
166
167public:
168 template <typename T>
169 using member_cloud_serialize_t = decltype(std::declval<T>().cloud_store(std::declval<World&>(), std::declval<Cloud&>()));
170
171 template <typename T>
173
174public:
175
176 /// @param[in] universe the universe world
177 Cloud(madness::World &universe) : container(universe), reading_time(0l), writing_time(0l),
178 cache_reads(0l), cache_stores(0l) {
179 }
180
181 void set_debug(bool value) {
182 debug = value;
183 }
184
185 void set_fence(bool value) {
186 dofence = value;
187 }
188
189 void set_force_load_from_cache(bool value) {
190 force_load_from_cache = value;
191 }
192
193 void print_size(World& universe) {
194
195 std::size_t memsize=0;
196 std::size_t max_record_size=0;
197 for (auto& item : container) {
198 memsize+=item.second.size();
199 max_record_size=std::max(max_record_size,item.second.size());
200 }
201 std::size_t global_memsize=memsize;
202 std::size_t max_memsize=memsize;
203 std::size_t min_memsize=memsize;
204 universe.gop.sum(global_memsize);
205 universe.gop.max(max_memsize);
206 universe.gop.max(max_record_size);
207 universe.gop.min(min_memsize);
208
209 auto local_size=container.size();
210 auto global_size=local_size;
211 universe.gop.sum(global_size);
212 double byte2gbyte=1.0/(1024*1024*1024);
213
214 if (universe.rank()==0) {
215 print("Cloud memory:");
216 print(" replicated:",is_replicated);
217 print("size of cloud (total)");
218 print(" number of records: ",global_size);
219 print(" memory in GBytes: ",global_memsize*byte2gbyte);
220 print("size of cloud (average per node)");
221 print(" number of records: ",double(global_size)/universe.size());
222 print(" memory in GBytes: ",global_memsize*byte2gbyte/universe.size());
223 print("min/max of node");
224 print(" memory in GBytes: ",min_memsize*byte2gbyte,max_memsize*byte2gbyte);
225 print(" max record size in GBytes:",max_record_size*byte2gbyte);
226
227 }
228 }
229
230 void print_timings(World &universe) const {
231 double rtime = double(reading_time);
232 double wtime = double(writing_time);
233 double ptime = double(replication_time);
234 universe.gop.sum(rtime);
235 universe.gop.sum(wtime);
236 universe.gop.sum(ptime);
237 long creads = long(cache_reads);
238 long cstores = long(cache_stores);
239 universe.gop.sum(creads);
240 universe.gop.sum(cstores);
241 if (universe.rank() == 0) {
242 auto precision = std::cout.precision();
243 std::cout << std::fixed << std::setprecision(1);
244 print("cloud storing cpu time", wtime * 0.001);
245 print("cloud replication cpu time", ptime * 0.001);
246 print("cloud reading cpu time", rtime * 0.001, std::defaultfloat);
247 std::cout << std::setprecision(precision) << std::scientific;
248 print("cloud cache stores ", long(cstores));
249 print("cloud cache loads ", long(creads));
250 }
251 }
252 void clear_cache(World &subworld) {
253 cached_objects.clear();
254 local_list_of_container_keys.list.clear();
255 subworld.gop.fence();
256 }
257
258 void clear() {
259 container.clear();
260 }
261
263 reading_time=0l;
264 writing_time=0l;
265 writing_time1=0l;
267 cache_stores=0l;
268 cache_reads=0l;
269 }
270
271 /// @param[in] world the subworld the objects are loaded to
272 /// @param[in] recordlist the list of records where the objects are stored
273 template<typename T>
274 T load(madness::World &world, const recordlistT recordlist) const {
275 recordlistT rlist = recordlist;
276 cloudtimer t(world, reading_time);
277
278 // forward_load will consume the recordlist while loading elements
279 return forward_load<T>(world, rlist);
280 }
281
282 /// similar to load, but will consume the recordlist
283
284 /// @param[in] world the subworld the objects are loaded to
285 /// @param[in] recordlist the list of records where the objects are stored
286 template<typename T>
287 T consuming_load(madness::World &world, recordlistT& recordlist) const {
288 cloudtimer t(world, reading_time);
289
290 // forward_load will consume the recordlist while loading elements
291 return forward_load<T>(world, recordlist);
292 }
293
294 /// load a single object from the cloud, recordlist is consumed while loading elements
295 template<typename T>
296 T forward_load(madness::World &world, recordlistT& recordlist) const {
297 // different objects are stored in different ways
298 // - tuples are split up into their components
299 // - classes with their own cloud serialization are stored using that
300 // - everything else is stored using their usual serialization
301 if constexpr (is_tuple<T>::value) {
302 return load_tuple<T>(world, recordlist);
303 } else if constexpr (has_cloud_serialize<T>::value) {
304 T target = allocator<T>(world);
305 target.cloud_load(world, *this, recordlist);
306 return target;
307 } else {
308 return do_load<T>(world, recordlist);
309 }
310 }
311
312 /// @param[in] world presumably the universe
313 template<typename T>
315 if (is_replicated) {
316 print("Cloud contents are replicated and read-only!");
317 MADNESS_EXCEPTION("cloud error",1);
318 }
319 cloudtimer t(world,writing_time);
320
321 // different objects are stored in different ways
322 // - tuples are split up into their components
323 // - classes with their own cloud serialization are stored using that
324 // - everything else is stored using their usual serialization
325 recordlistT recordlist;
326 if constexpr (is_tuple<T>::value) {
327 recordlist+=store_tuple(world,source);
328 } else if constexpr (has_cloud_serialize<T>::value) {
329 recordlist+=source.cloud_store(world,*this);
330 } else {
331 recordlist+=store_other(world,source);
332 }
333 if (dofence) world.gop.fence();
334 return recordlist;
335 }
336
337 void replicate(const std::size_t chunk_size=INT_MAX) {
338
339 double cpu0=cpu_time();
340 World& world=container.get_world();
341 world.gop.fence();
343 container.reset_pmap_to_local();
344 is_replicated=true;
345
346 std::list<keyT> keylist;
347 for (auto it=container.begin(); it!=container.end(); ++it) {
348 keylist.push_back(it->first);
349 }
350
351 for (ProcessID rank=0; rank<world.size(); rank++) {
352 if (rank == world.rank()) {
353 std::size_t keylistsize = keylist.size();
354 world.mpi.Bcast(&keylistsize,sizeof(keylistsize),MPI_BYTE,rank);
355
356 for (auto key : keylist) {
358 bool found=container.find(acc,key);
359 MADNESS_CHECK(found);
360 auto data = acc->second;
361 std::size_t sz=data.size();
362
363 world.mpi.Bcast(&key,sizeof(key),MPI_BYTE,rank);
364 world.mpi.Bcast(&sz,sizeof(sz),MPI_BYTE,rank);
365
366 // if data is too large for MPI_INT break it into pieces to avoid integer overflow
367 for (std::size_t start=0; start<sz; start+=chunk_size) {
368 std::size_t remainder = std::min(sz - start, chunk_size);
369 world.mpi.Bcast(&data[start], remainder, MPI_BYTE, rank);
370 }
371
372 }
373 }
374 else {
375 std::size_t keylistsize;
376 world.mpi.Bcast(&keylistsize,sizeof(keylistsize),MPI_BYTE,rank);
377 for (size_t i=0; i<keylistsize; i++) {
378 keyT key;
379 world.mpi.Bcast(&key,sizeof(key),MPI_BYTE,rank);
380 std::size_t sz;
381 world.mpi.Bcast(&sz,sizeof(sz),MPI_BYTE,rank);
382 valueT data(sz);
383// world.mpi.Bcast(&data[0],sz,MPI_BYTE,rank);
384 for (std::size_t start=0; start<sz; start+=chunk_size) {
385 std::size_t remainder=std::min(sz-start,chunk_size);
386 world.mpi.Bcast(&data[start],remainder,MPI_BYTE,rank);
387 }
388
389 container.replace(key,data);
390 }
391 }
392 }
393 world.gop.fence();
394 double cpu1=cpu_time();
395 if (world.rank()==0) print("replication ended after ",cpu1-cpu0," seconds at time",cpu1);
396 }
397
398private:
399
400 mutable std::atomic<long> reading_time=0l; // in ms
401 mutable std::atomic<long> writing_time=0l; // in ms
402 mutable std::atomic<long> writing_time1=0l; // in ms
403 mutable std::atomic<long> replication_time=0l; // in ms
404 mutable std::atomic<long> cache_reads=0l;
405 mutable std::atomic<long> cache_stores=0l;
406
407 template<typename> struct is_tuple : std::false_type { };
408 template<typename ...T> struct is_tuple<std::tuple<T...>> : std::true_type { };
409
410 template<typename Q> struct is_vector : std::false_type { };
411 template<typename Q> struct is_vector<std::vector<Q>> : std::true_type { };
412
413 template<typename>
414 struct is_madness_function_vector : std::false_type {
415 };
416 template<typename T, std::size_t NDIM>
417 struct is_madness_function_vector<std::vector<Function<T, NDIM>>> : std::true_type {
418 };
419
420 template<typename T> using is_parallel_serializable_object = std::is_base_of<archive::ParallelSerializableObject,T>;
421
422 template<typename T> using is_world_constructible = std::is_constructible<T, World &>;
423
424 struct cloudtimer {
426 double wall0;
427 std::atomic<long> &rtime;
428
429 cloudtimer(World& world, std::atomic<long> &readtime) : world(world), wall0(wall_time()), rtime(readtime) {}
430
432 long deltatime=long((wall_time() - wall0) * 1000l);
433 rtime += deltatime;
434 }
435 };
436
437 template<typename T>
438 void cache(madness::World &world, const T &obj, const keyT &record) const {
439 const_cast<cacheT &>(cached_objects).insert({record,std::make_any<T>(obj)});
440 }
441
442 /// load an object from the cache, record is unchanged
443 template<typename T>
444 T load_from_cache(madness::World &world, const keyT &record) const {
445 if (world.rank()==0) cache_reads++;
446 if (debug) print("loading", typeid(T).name(), "from cache record", record, "to world", world.id());
447 if (auto obj = std::any_cast<T>(&cached_objects.find(record)->second)) return *obj;
448 MADNESS_EXCEPTION("failed to load from cloud-cache", 1);
449 T target = allocator<T>(world);
450 return target;
451 }
452
453 bool is_cached(const keyT &key) const {
454 return (cached_objects.count(key) == 1);
455 }
456
457 /// checks if a (universe) container record is used
458
459 /// currently implemented with a local copy of the recordlist, might be
460 /// reimplemented with container.find(), which would include blocking communication.
461 bool is_in_container(const keyT &key) const {
462 auto it = std::find(local_list_of_container_keys.list.begin(),
463 local_list_of_container_keys.list.end(), key);
464 return it!=local_list_of_container_keys.list.end();
465 }
466
467 template<typename T>
468 T allocator(World &world) const {
469 if constexpr (is_world_constructible<T>::value) {
470 return T(world);
471 } else {
472 return T();
473 }
474 }
475
476 template<typename T>
479 bool is_already_present= is_in_container(record);
480 if (debug) {
481 if (is_already_present) std::cout << "skipping ";
482 if constexpr (Recordlist<keyT>::has_member_id<T>::value) {
483 std::cout << "storing world object of " << typeid(T).name() << "id " << source.id() << " to record " << record << std::endl;
484 }
485 std::cout << "storing object of " << typeid(T).name() << " to record " << record << std::endl;
486 }
487 if constexpr (is_madness_function<T>::value) {
488 if (source.is_compressed() and T::dimT>3) print("WARNING: storing compressed hi-dim `function");
489 }
490
491 // scope is important because of destruction ordering of world objects and fence
492 if (is_already_present) {
493 if (world.rank()==0) cache_stores++;
494 } else {
495 cloudtimer t(world,writing_time1);
498 par & source;
500 }
501 if (dofence) world.gop.fence();
502 return recordlistT{record};
503 }
504
505public:
506 /// load a vector from the cloud, pop records from recordlist
507 ///
508 /// @param[inout] world destination world
509 /// @param[inout] recordlist list of records to load from (reduced by the first few elements)
510 template<typename T>
511 typename std::enable_if<is_vector<T>::value, T>::type
512 do_load(World &world, recordlistT &recordlist) const {
513 std::size_t sz = do_load<std::size_t>(world, recordlist);
514 T target(sz);
515 for (std::size_t i = 0; i < sz; ++i) {
516 target[i] = do_load<typename T::value_type>(world, recordlist);
517 }
518 return target;
519 }
520
521 /// load a single object from the cloud, pop record from recordlist
522 ///
523 /// @param[inout] world destination world
524 /// @param[inout] recordlist list of records to load from (reduced by the first element)
525 template<typename T>
526 typename std::enable_if<!is_vector<T>::value, T>::type
527 do_load(World &world, recordlistT &recordlist) const {
528 keyT record = recordlist.pop_front_and_return();
530
531 if (is_cached(record)) return load_from_cache<T>(world, record);
532 if (debug) print("loading", typeid(T).name(), "from container record", record, "to world", world.id());
533 T target = allocator<T>(world);
536 par & target;
537 cache(world, target, record);
538 return target;
539 }
540
541public:
542
543 // overloaded
544 template<typename T>
545 recordlistT store_other(madness::World& world, const std::vector<T>& source) {
546 if (debug)
547 std::cout << "storing " << typeid(source).name() << " of size " << source.size() << std::endl;
548 recordlistT l = store_other(world, source.size());
549 for (const auto& s : source) l += store_other(world, s);
550 if (dofence) world.gop.fence();
551 if (debug) std::cout << "done with vector storing; container size " << container.size() << std::endl;
552 return l;
553 }
554
555 /// store a tuple in multiple records
556 template<typename... Ts>
557 recordlistT store_tuple(World &world, const std::tuple<Ts...> &input) {
559 auto storeaway = [&](const auto &arg) {
560 v += this->store(world, arg);
561 };
562 auto l = [&](Ts const &... arg) {
563 ((storeaway(arg)), ...);
564 };
565 std::apply(l, input);
566 return v;
567 }
568
569 /// load a tuple from the cloud, pop records from recordlist
570 ///
571 /// @param[inout] world destination world
572 /// @param[inout] recordlist list of records to load from (reduced by the first few elements)
573 template<typename T>
574 T load_tuple(madness::World &world, recordlistT &recordlist) const {
575 if (debug) std::cout << "loading tuple of type " << typeid(T).name() << " to world " << world.id() << std::endl;
576 T target;
577 std::apply([&](auto &&... args) {
578 ((args = forward_load<typename std::remove_reference<decltype(args)>::type>(world, recordlist)), ...);
579 }, target);
580 return target;
581 }
582};
583
584} /* namespace madness */
585
586#endif /* SRC_MADNESS_WORLD_CLOUD_H_ */
cloud class
Definition cloud.h:147
bool is_cached(const keyT &key) const
Definition cloud.h:453
void clear()
Definition cloud.h:258
bool is_in_container(const keyT &key) const
checks if a (universe) container record is used
Definition cloud.h:461
bool force_load_from_cache
forces load from cache (mainly for debugging)
Definition cloud.h:152
bool debug
prints debug output
Definition cloud.h:149
std::atomic< long > writing_time1
Definition cloud.h:402
std::enable_if< is_vector< T >::value, T >::type do_load(World &world, recordlistT &recordlist) const
Definition cloud.h:512
recordlistT store_other(madness::World &world, const std::vector< T > &source)
Definition cloud.h:545
std::any cached_objT
Definition cloud.h:156
recordlistT store(madness::World &world, const T &source)
Definition cloud.h:314
T load_tuple(madness::World &world, recordlistT &recordlist) const
Definition cloud.h:574
std::is_base_of< archive::ParallelSerializableObject, T > is_parallel_serializable_object
Definition cloud.h:420
madness::archive::ContainerRecordOutputArchive::keyT keyT
Definition cloud.h:157
std::atomic< long > replication_time
Definition cloud.h:403
Recordlist< keyT > recordlistT
Definition cloud.h:160
std::is_constructible< T, World & > is_world_constructible
Definition cloud.h:422
recordlistT store_other(madness::World &world, const T &source)
Definition cloud.h:477
bool is_replicated
if contents of the container are replicated
Definition cloud.h:150
void set_force_load_from_cache(bool value)
Definition cloud.h:189
decltype(std::declval< T >().cloud_store(std::declval< World & >(), std::declval< Cloud & >())) member_cloud_serialize_t
Definition cloud.h:169
void replicate(const std::size_t chunk_size=INT_MAX)
Definition cloud.h:337
recordlistT local_list_of_container_keys
Definition cloud.h:165
void print_size(World &universe)
Definition cloud.h:193
std::atomic< long > reading_time
Definition cloud.h:400
void clear_timings()
Definition cloud.h:262
recordlistT store_tuple(World &world, const std::tuple< Ts... > &input)
store a tuple in multiple records
Definition cloud.h:557
void set_debug(bool value)
Definition cloud.h:181
std::enable_if<!is_vector< T >::value, T >::type do_load(World &world, recordlistT &recordlist) const
Definition cloud.h:527
T load(madness::World &world, const recordlistT recordlist) const
Definition cloud.h:274
void cache(madness::World &world, const T &obj, const keyT &record) const
Definition cloud.h:438
void set_fence(bool value)
Definition cloud.h:185
std::atomic< long > cache_reads
Definition cloud.h:404
Cloud(madness::World &universe)
Definition cloud.h:177
cacheT cached_objects
Definition cloud.h:164
void clear_cache(World &subworld)
Definition cloud.h:252
T load_from_cache(madness::World &world, const keyT &record) const
load an object from the cache, record is unchanged
Definition cloud.h:444
madness::meta::is_detected< member_cloud_serialize_t, T > has_cloud_serialize
Definition cloud.h:172
std::vector< unsigned char > valueT
Definition cloud.h:158
bool dofence
fences after load/store
Definition cloud.h:151
void print_timings(World &universe) const
Definition cloud.h:230
T allocator(World &world) const
Definition cloud.h:468
std::atomic< long > writing_time
Definition cloud.h:401
madness::WorldContainer< keyT, valueT > container
Definition cloud.h:163
T forward_load(madness::World &world, recordlistT &recordlist) const
load a single object from the cloud, recordlist is consumed while loading elements
Definition cloud.h:296
std::map< keyT, cached_objT > cacheT
Definition cloud.h:159
T consuming_load(madness::World &world, recordlistT &recordlist) const
similar to load, but will consume the recordlist
Definition cloud.h:287
std::atomic< long > cache_stores
Definition cloud.h:405
FunctionImpl holds all Function state to facilitate shallow copy semantics.
Definition funcimpl.h:945
A multiresolution adaptive numerical function.
Definition mra.h:139
A tensor is a multidimensional array.
Definition tensor.h:317
Makes a distributed container with specified attributes.
Definition worlddc.h:866
bool find(accessor &acc, const keyT &key)
Write access to LOCAL value by key. Returns true if found, false otherwise (always false for remote).
Definition worlddc.h:987
void max(T *buf, size_t nelem)
Inplace global max while still processing AM & tasks.
Definition worldgop.h:882
void fence(bool debug=false)
Synchronizes all processes in communicator AND globally ensures no pending AM or tasks.
Definition worldgop.cc:161
void min(T *buf, size_t nelem)
Inplace global min while still processing AM & tasks.
Definition worldgop.h:876
void sum(T *buf, size_t nelem)
Inplace global sum while still processing AM & tasks.
Definition worldgop.h:870
void Bcast(T *buffer, int count, int root) const
MPI broadcast an array of count elements.
Definition worldmpi.h:416
A parallel world class.
Definition world.h:132
ProcessID rank() const
Returns the process rank in this World (same as MPI_Comm_rank()).
Definition world.h:320
WorldMpiInterface & mpi
MPI interface.
Definition world.h:204
ProcessID size() const
Returns the number of processes in this World (same as MPI_Comm_size()).
Definition world.h:330
unsigned long id() const
Definition world.h:315
WorldGopInterface & gop
Global operations.
Definition world.h:207
Definition parallel_dc_archive.h:60
Definition parallel_dc_archive.h:14
long keyT
Definition parallel_dc_archive.h:16
An archive for storing local or parallel data, wrapping a BinaryFstreamInputArchive.
Definition parallel_archive.h:366
An archive for storing local or parallel data wrapping a BinaryFstreamOutputArchive.
Definition parallel_archive.h:321
auto T(World &world, response_space &f) -> response_space
Definition global_functions.cc:34
Tensor< typename Tensor< T >::scalar_type > arg(const Tensor< T > &t)
Return a new tensor holding the argument of each element of t (complex types only)
Definition tensor.h:2503
static const double v
Definition hatom_sf_dirac.cc:20
#define MADNESS_CHECK(condition)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:182
#define MADNESS_EXCEPTION(msg, value)
Macro for throwing a MADNESS exception.
Definition madness_exception.h:119
typename detail::detector< nonesuch, void, Op, Args... >::value_t is_detected
Definition meta.h:169
Definition array_addons.h:50
Namespace for all elements and tools of MADNESS.
Definition DFParameters.h:10
void hash_range(hashT &seed, It first, It last)
Definition worldhash.h:280
static double cpu_time()
Returns the cpu time in seconds relative to an arbitrary origin.
Definition timers.h:127
void hash_combine(hashT &seed, const T &v)
Combine hash values.
Definition worldhash.h:260
static class madness::twoscale_cache_class cache[kmax+1]
void print(const T &t, const Ts &... ts)
Print items to std::cout (items separated by spaces) and terminate with a new line.
Definition print.h:225
double wall_time()
Returns the wall time in seconds relative to an arbitrary origin.
Definition timers.cc:48
std::string type(const PairType &n)
Definition PNOParameters.h:18
std::string name(const FuncType &type, const int ex=-1)
Definition ccpairfunction.h:28
madness::hashT hash_value(const std::array< T, N > &a)
Hash std::array with madness hash.
Definition array_addons.h:78
Definition mraimpl.h:50
Definition hatom_sf_dirac.cc:91
Definition test_ccpairfunction.cc:22
Definition cloud.h:424
std::atomic< long > & rtime
Definition cloud.h:427
World & world
Definition cloud.h:425
double wall0
Definition cloud.h:426
~cloudtimer()
Definition cloud.h:431
cloudtimer(World &world, std::atomic< long > &readtime)
Definition cloud.h:429
Definition cloud.h:407
Definition cloud.h:410
Definition cloud.h:34
static keyT compute_record(const std::vector< T > &arg)
Definition cloud.h:94
keyT pop_front_and_return()
Definition cloud.h:53
static keyT compute_record(const Function< T, NDIM > &arg)
Definition cloud.h:79
Recordlist(const Recordlist &other)
Definition cloud.h:41
Recordlist(const keyT &key)
Definition cloud.h:39
static keyT compute_record(const std::shared_ptr< T > &arg)
Definition cloud.h:100
static keyT compute_record(const T &arg)
Definition cloud.h:103
std::size_t size() const
Definition cloud.h:59
madness::meta::is_detected< member_id_t, T > has_member_id
Definition cloud.h:69
decltype(std::declval< T >().id()) member_id_t
Definition cloud.h:66
friend std::ostream & operator<<(std::ostream &os, const Recordlist &arg)
Definition cloud.h:117
Recordlist & operator+=(const Recordlist &list2)
Definition cloud.h:43
static keyT compute_record(const WorldContainer< keyQ, valueT > &arg)
Definition cloud.h:85
decltype(std::declval< T >().hash()) member_hash_t
Definition cloud.h:73
static keyT compute_record(const std::shared_ptr< WorldContainer< keyQ, valueT > > &arg)
Definition cloud.h:88
std::list< keyT > list
Definition cloud.h:35
Recordlist & operator+=(const keyT &key)
Definition cloud.h:48
static keyT compute_record(const FunctionImpl< T, NDIM > *arg)
Definition cloud.h:82
static keyT compute_record(const std::shared_ptr< madness::FunctionImpl< T, NDIM > > &arg)
Definition cloud.h:91
static keyT compute_record(const Tensor< T > &arg)
Definition cloud.h:97
madness::meta::is_detected< member_hash_t, T > has_member_hash
Definition cloud.h:76
Recordlist()
Definition cloud.h:37
Definition mra.h:2807
#define MPI_BYTE
Definition stubmpi.h:77
double source(const coordT &r)
Definition testperiodic.cc:48
int ProcessID
Used to clearly identify process number/rank.
Definition worldtypes.h:43
FLOAT target(const FLOAT &x)
Definition y.cc:295