The Gaudi Framework  master (d98a2936)
HiveNumbers.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #pragma once
12 
13 // Framework include files
14 #include <GaudiKernel/IRndmGen.h>
15 #include <GaudiKernel/SmartIF.h>
16 
17 // STL includes
18 #include <memory>
19 #include <vector>
20 
21 #include <tbb/spin_rw_mutex.h>
22 
23 // Forward declarations
24 class IRndmGen;
25 class IRndmGenSvc;
26 
27 /*
28  * This is a first solution to the problem of the thread safe random generation.
29  * It is locking, but the locking is "diluted" by a caching mechanism of the
30  * random numbers.
31  */
32 
33 namespace HiveRndm {
34 
35  typedef tbb::spin_rw_mutex HiveNumbersMutex;
36 
38  private:
39  unsigned int m_buffer_index;
40  const unsigned int m_buffer_size;
41  std::vector<double> m_buffer;
43 
44  protected:
47 
48  public:
50  HiveNumbers();
52  HiveNumbers( const HiveNumbers& copy );
56  virtual ~HiveNumbers();
58  virtual StatusCode initialize( const SmartIF<IRndmGenSvc>& svc, const IRndmGen::Param& par );
60  virtual StatusCode finalize();
62  operator bool() const { return m_generator != 0; }
64  double operator()() { return this->shoot(); }
66  double pop() { return this->shoot(); }
68  double shoot() {
69  if ( 0 != m_generator ) {
70  if ( m_buffer_index == 0 ) { // we are out of numbers
71  this->shootArray( m_buffer, m_buffer_size ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ );
72  m_buffer_index = m_buffer_size - 1;
73  }
74  const double number = m_buffer[m_buffer_index];
75  m_buffer_index--;
76  return number;
77  }
78  return -1;
79  }
81  StatusCode shootArray( std::vector<double>& array, long num, long start = 0 ) {
82  if ( 0 != m_generator ) {
83  StatusCode status;
84  {
85  HiveNumbersMutex::scoped_lock lock( m_genMutex );
86  status = m_generator->shootArray( array, num, start );
87  }
88  return status;
89  }
90  return StatusCode::FAILURE;
91  }
92  };
93 
94 } // namespace HiveRndm
HiveRndm
Definition: HiveNumbers.h:33
HiveRndm::HiveNumbers::m_genMutex
static HiveNumbersMutex m_genMutex
Definition: HiveNumbers.h:42
HiveRndm::HiveNumbersMutex
tbb::spin_rw_mutex HiveNumbersMutex
Definition: HiveNumbers.h:35
IOTest.start
start
Definition: IOTest.py:110
HiveRndm::HiveNumbers::operator()
double operator()()
Operator () for the use within STL.
Definition: HiveNumbers.h:64
HiveRndm::HiveNumbers::pop
double pop()
Pop a new number from the buffer.
Definition: HiveNumbers.h:66
compareOutputFiles.par
par
Definition: compareOutputFiles.py:477
SmartIF.h
IRndmGen.h
HiveRndm::HiveNumbers::m_buffer_index
unsigned int m_buffer_index
Definition: HiveNumbers.h:39
HiveRndm::HiveNumbers::m_generator
IRndmGen * m_generator
Pointer to random number generator.
Definition: HiveNumbers.h:46
StatusCode
Definition: StatusCode.h:64
HiveRndm::HiveNumbers::shootArray
StatusCode shootArray(std::vector< double > &array, long num, long start=0)
Pop a new number from the buffer.
Definition: HiveNumbers.h:81
HiveRndm::HiveNumbers::m_buffer
std::vector< double > m_buffer
Definition: HiveNumbers.h:41
IRndmGen::Param
Definition: IRndmGen.h:45
IRndmGenSvc
Definition: IRndmGenSvc.h:40
SmartIF< IRndmGenSvc >
HiveRndm::HiveNumbers::m_buffer_size
const unsigned int m_buffer_size
Definition: HiveNumbers.h:40
IRndmGen::shootArray
virtual StatusCode shootArray(std::vector< double > &array, long howmany, long start=0) const =0
Multiple shots returning vector with random number according to specified distribution.
IRndmGen
Definition: IRndmGen.h:40
Containers::array
struct GAUDI_API array
Parametrisation class for redirection array - like implementation.
Definition: KeyedObjectManager.h:29
HiveRndm::HiveNumbers::shoot
double shoot()
Pop a new number from the buffer.
Definition: HiveNumbers.h:68
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:100
HiveRndm::HiveNumbers
Definition: HiveNumbers.h:37
GAUDI_API
#define GAUDI_API
Definition: Kernel.h:49