The Gaudi Framework  v36r16 (ea80daf8)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Accumulators.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2021 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 
12 #pragma once
13 
14 #include <Gaudi/MonitoringHub.h>
15 
16 #include <chrono>
17 
18 namespace Gaudi::Accumulators {
19  template <class Rep, class Period>
21  template <class Rep1, class Rep2, class Period>
23 } // namespace Gaudi::Accumulators
24 
207 #include "boost/format.hpp"
208 #include <atomic>
209 #include <cmath>
210 #include <iostream>
211 #include <limits>
212 #include <nlohmann/json.hpp>
213 #include <sstream>
214 #include <tuple>
215 #include <type_traits>
216 #include <utility>
217 
219 #include "GaudiKernel/MsgStream.h"
220 #include "GaudiKernel/detected.h"
221 
222 // Json serialization for std::chrono::duration
223 namespace nlohmann {
224  template <class Rep, class Period>
225  struct adl_serializer<std::chrono::duration<Rep, Period>> {
226  static void to_json( json& j, const std::chrono::duration<Rep, Period>& d ) { j = d.count(); }
228  d = std::chrono::duration<Rep, Period>{ j.get<Rep>() };
229  }
230  };
231 } // namespace nlohmann
232 
233 namespace Gaudi::Accumulators {
234 
236  enum class atomicity { none, full };
237 
239  template <class T>
240  auto sqrt( T d );
241 
245  template <typename T, T N>
246  struct Constant {
247  template <typename U>
248  constexpr T operator()( U&& ) const noexcept {
249  return N;
250  }
251  };
252 
256  struct Identity {
257  template <typename U>
258  constexpr decltype( auto ) operator()( U&& v ) const noexcept {
259  return std::forward<U>( v );
260  }
261  };
262 
266  struct Square {
267  template <typename U>
268  constexpr decltype( auto ) operator()( U&& v ) const noexcept {
269  return v * v;
270  }
271  };
272 
276  template <typename T, typename = int>
277  using has_fetch_add_ = decltype( std::declval<T&>().fetch_add( 0 ) );
278  template <typename T>
279  inline constexpr bool has_fetch_add_v = Gaudi::cpp17::is_detected_v<has_fetch_add_, T>;
280 
284  template <typename Arithmetic, typename Result = double>
285  using fp_result_type = std::conditional_t<std::is_integral_v<Arithmetic>, Result, Arithmetic>;
286 
290  template <typename Arithmetic, atomicity Atomicity>
292 
296  template <typename Arithmetic>
297  struct BaseValueHandler<Arithmetic, atomicity::none> {
298  using OutputType = Arithmetic;
299  using InternalType = Arithmetic;
300  static constexpr OutputType getValue( const InternalType& v ) noexcept { return v; };
301  static Arithmetic exchange( InternalType& v, Arithmetic newv ) noexcept { return std::exchange( v, newv ); }
302  };
303 
307  template <typename Arithmetic>
308  struct BaseValueHandler<Arithmetic, atomicity::full> {
309  using OutputType = Arithmetic;
311  static constexpr OutputType getValue( const InternalType& v ) noexcept {
312  return v.load( std::memory_order_relaxed );
313  };
314  static Arithmetic exchange( InternalType& v, Arithmetic newv ) noexcept { return v.exchange( newv ); }
315  };
316 
321  template <typename Arithmetic, atomicity Atomicity>
322  struct Adder;
323 
327  template <typename Arithmetic>
328  struct Adder<Arithmetic, atomicity::none> : BaseValueHandler<Arithmetic, atomicity::none> {
331  static constexpr OutputType DefaultValue() { return Arithmetic{}; }
332  static void merge( InternalType& a, Arithmetic b ) noexcept { a += b; };
333  };
334 
338  template <typename Arithmetic>
339  struct Adder<Arithmetic, atomicity::full> : BaseValueHandler<Arithmetic, atomicity::full> {
342  static constexpr OutputType DefaultValue() { return Arithmetic{}; }
343  static void merge( InternalType& a, Arithmetic b ) noexcept {
344  if ( DefaultValue() == b ) return; // avoid atomic operation if b is "0"
345  if constexpr ( has_fetch_add_v<InternalType> ) {
346  a.fetch_add( b, std::memory_order_relaxed );
347  } else {
349  while ( !a.compare_exchange_weak( current, current + b ) )
350  ;
351  }
352  };
353  };
354 
359  template <typename Arithmetic, atomicity Atomicity, typename Compare, Arithmetic ( *Initial )()>
360  struct Extremum;
361 
365  template <typename Arithmetic, typename Compare, Arithmetic ( *Initial )()>
366  struct Extremum<Arithmetic, atomicity::none, Compare, Initial> : BaseValueHandler<Arithmetic, atomicity::none> {
369  static constexpr OutputType DefaultValue() { return Initial(); }
370  static void merge( InternalType& a, Arithmetic b ) noexcept {
371  if ( Compare{}( b, a ) ) a = b;
372  };
373  };
374 
378  template <typename Arithmetic, typename Compare, Arithmetic ( *Initial )()>
379  struct Extremum<Arithmetic, atomicity::full, Compare, Initial> : BaseValueHandler<Arithmetic, atomicity::full> {
382  static constexpr OutputType DefaultValue() { return Initial(); }
383  static void merge( InternalType& a, Arithmetic b ) noexcept {
384  Arithmetic prev_value = BaseValueHandler<Arithmetic, atomicity::full>::getValue( a );
385  while ( Compare{}( b, prev_value ) && !a.compare_exchange_weak( prev_value, b ) )
386  ;
387  };
388  };
389 
394  template <typename Arithmetic, atomicity Atomicity = atomicity::full>
396 
401  template <typename Arithmetic, atomicity Atomicity = atomicity::full>
403 
410  explicit construct_empty_t() = default;
411  };
413 
431  template <typename InputTypeT, typename InnerType, atomicity Atomicity = atomicity::full,
432  typename InputTransform = Identity, typename OutputTransform = Identity,
433  typename ValueHandler = Adder<InnerType, Atomicity>>
435  template <typename, typename, atomicity, typename, typename, typename>
436  friend class GenericAccumulator;
437 
438  public:
439  using InputType = InputTypeT;
440 #if __cplusplus >= 201703L
441  using OutputType = std::decay_t<std::invoke_result_t<OutputTransform, InnerType>>;
442 #else
443  using OutputType = std::decay_t<std::result_of_t<OutputTransform( InnerType )>>;
444 #endif
445  using InternalType = InnerType;
448  ValueHandler::merge( m_value, InputTransform{}( by ) );
449  return *this;
450  }
451  GenericAccumulator() = default;
453  template <atomicity ato, typename VH>
456  : GenericAccumulator() {}
457  template <typename... Args>
458  GenericAccumulator( std::in_place_t, Args&&... args ) : m_value( std::forward<Args>( args )... ) {}
459  GenericAccumulator( const GenericAccumulator& other ) : m_value( ValueHandler::getValue( other.m_value ) ) {}
461  m_value = ValueHandler::getValue( other.m_value );
462  return *this;
463  }
464  OutputType value() const { return OutputTransform{}( ValueHandler::getValue( m_value ) ); }
465  void reset() { reset( ValueHandler::DefaultValue() ); }
466  template <atomicity ato, typename VH>
468  ValueHandler::merge( m_value, VH::exchange( other.m_value, VH::DefaultValue() ) );
469  }
470  template <atomicity ato, typename VH>
472  ValueHandler::merge( m_value, other.m_value );
473  }
474 
475  protected:
476  GenericAccumulator( InnerType in ) : m_value( std::move( in ) ) {}
477  auto rawValue() const { return ValueHandler::getValue( m_value ); }
478  void reset( InnerType in ) { m_value = std::move( in ); }
479  static InnerType extractJSONData( const nlohmann::json& j, const JSONStringEntriesType& entries ) {
480  return j.at( entries ).get<InnerType>();
481  }
482 
483  private:
484  typename ValueHandler::InternalType m_value{ ValueHandler::DefaultValue() };
485  };
486 
492  template <typename Arithmetic, atomicity Atomicity, typename InputTypeT = Arithmetic,
493  template <atomicity, typename> class... Bases>
494  class AccumulatorSet : public Bases<Atomicity, Arithmetic>... {
495  public:
496  using InputType = InputTypeT;
500  constexpr AccumulatorSet() = default;
502  template <atomicity ato>
504  : AccumulatorSet() {}
506  ( Bases<Atomicity, Arithmetic>::operator+=( by ), ... );
507  return *this;
508  }
509  OutputType value() const { return std::make_tuple( Bases<Atomicity, Arithmetic>::value()... ); }
510  void reset() { ( Bases<Atomicity, Arithmetic>::reset(), ... ); }
511  template <atomicity Ato>
513  ( Bases<Atomicity, Arithmetic>::mergeAndReset( static_cast<Bases<Ato, Arithmetic>&&>( other ) ), ... );
514  }
515  template <atomicity Ato>
517  ( Bases<Atomicity, Arithmetic>::operator+( static_cast<Bases<Ato, Arithmetic>&&>( other ) ), ... );
518  }
519 
520  protected:
522  void reset( const InternalType& t ) {
523  std::apply( [this]( const auto&... i ) { ( this->Bases<Atomicity, Arithmetic>::reset( i ), ... ); }, t );
524  }
526  return extractJSONDataHelper( j, entries, std::index_sequence_for<Bases<Atomicity, Arithmetic>...>{} );
527  }
528 
529  private:
530  template <size_t... Is>
532  std::index_sequence<Is...> ) {
533  return extractJSONDataHelper( j, std::get<Is>( entries )... );
534  }
535  static InternalType
537  typename Bases<Atomicity, Arithmetic>::JSONStringEntriesType... entries ) {
538  return { Bases<Atomicity, Arithmetic>::extractJSONData( j, entries )... };
539  }
540  };
541 
546  template <atomicity Atomicity, typename Arithmetic = double>
548  : GenericAccumulator<Arithmetic, Arithmetic, Atomicity, Identity, Identity, Maximum<Arithmetic, Atomicity>> {
549  using GenericAccumulator<Arithmetic, Arithmetic, Atomicity, Identity, Identity,
551  Arithmetic max() const { return this->value(); }
552  };
553 
558  template <atomicity Atomicity, typename Arithmetic = double>
560  : GenericAccumulator<Arithmetic, Arithmetic, Atomicity, Identity, Identity, Minimum<Arithmetic, Atomicity>> {
561  using GenericAccumulator<Arithmetic, Arithmetic, Atomicity, Identity, Identity,
563  Arithmetic min() const { return this->value(); }
564  };
565 
572  template <atomicity Atomicity, typename Arithmetic = double>
573  struct CountAccumulator : GenericAccumulator<Arithmetic, unsigned long, Atomicity, Constant<unsigned long, 1UL>> {
576  ( *this ) += Arithmetic{};
577  return *this;
578  }
580  auto copy = *this;
581  ++( *this );
582  return copy;
583  }
584  unsigned long nEntries() const { return this->value(); }
585  };
586 
591  template <atomicity Atomicity, typename Arithmetic = double>
592  struct SumAccumulator : GenericAccumulator<Arithmetic, Arithmetic, Atomicity, Identity> {
594  Arithmetic sum() const { return this->value(); }
595  };
596 
602  template <atomicity Atomicity, typename Arithmetic = unsigned long>
603  struct IntegralAccumulator : GenericAccumulator<Arithmetic, Arithmetic, Atomicity, Identity> {
604  static_assert( std::is_integral_v<Arithmetic>,
605  "Invalid Arithmetic type for IntegralAccumulator. It must be an integral type" );
606 
609  ( *this ) += 1;
610  return *this;
611  }
613  auto copy = *this;
614  ++( *this );
615  return copy;
616  }
617  Arithmetic nEntries() const { return this->value(); }
618  Arithmetic sum() const { return this->value(); }
619  };
620 
625  template <atomicity Atomicity, typename Arithmetic = double>
626  struct SquareAccumulator : GenericAccumulator<Arithmetic, Arithmetic, Atomicity, Square> {
628  Arithmetic sum2() const { return this->value(); };
629  };
630 
632  struct TrueTo1 {
633  unsigned int operator()( bool v ) const { return v; }
634  };
635 
641  template <atomicity Atomicity, typename Arithmetic>
642  struct TrueAccumulator : GenericAccumulator<Arithmetic, unsigned long, Atomicity, TrueTo1> {
644  unsigned long nTrueEntries() const { return this->value(); };
645  };
646 
648  struct FalseTo1 {
649  unsigned int operator()( bool v ) const { return !v; }
650  };
651 
657  template <atomicity Atomicity, typename Arithmetic>
658  struct FalseAccumulator : GenericAccumulator<Arithmetic, unsigned long, Atomicity, FalseTo1> {
660  unsigned long nFalseEntries() const { return this->value(); };
661  };
662 
668  template <atomicity Atomicity, typename Arithmetic>
669  struct BinomialAccumulator : AccumulatorSet<bool, Atomicity, bool, TrueAccumulator, FalseAccumulator> {
671  unsigned long nEntries() const { return this->nTrueEntries() + this->nFalseEntries(); };
672 
673  template <typename Result = fp_result_type<Arithmetic>>
674  auto efficiency() const {
675  auto nbEntries = nEntries();
676  if ( 1 > nbEntries ) return Result{ -1 };
677  return static_cast<Result>( this->nTrueEntries() ) / nbEntries;
678  }
679  auto eff() const { return efficiency(); }
680 
681  template <typename Result = fp_result_type<Arithmetic>>
682  auto efficiencyErr() const {
683  // Note the usage of using, aiming at using the std version of sqrt by default, without preventing
684  // more specialized versions to be used via ADL (see http://en.cppreference.com/w/cpp/language/adl)
686  using std::sqrt;
687  auto nbEntries = nEntries();
688  if ( 1 > nbEntries ) return Result{ -1 };
689  return sqrt( static_cast<Result>( this->nTrueEntries() * this->nFalseEntries() ) / nbEntries ) / nbEntries;
690  }
691  auto effErr() const { return efficiencyErr(); }
693  struct binomial_t {
694  unsigned long nPass;
695  unsigned long nTotal;
696  };
697  BinomialAccumulator& operator+=( binomial_t b ) {
698  assert( b.nPass <= b.nTotal );
700  TrueAccumulator<atomicity::none, bool>{ std::in_place, b.nPass } );
702  FalseAccumulator<atomicity::none, bool>{ std::in_place, b.nTotal - b.nPass } );
703  return *this;
704  }
705  };
706 
712  template <atomicity Atomicity, typename Arithmetic, template <atomicity, typename> typename CountAcc,
713  template <atomicity, typename> typename SumAcc>
715  : AccumulatorSet<Arithmetic, Atomicity, typename CountAcc<Atomicity, Arithmetic>::InputType, CountAcc, SumAcc> {
716  static_assert( std::is_same_v<typename CountAcc<Atomicity, Arithmetic>::InputType,
717  typename SumAcc<Atomicity, Arithmetic>::InputType>,
718  "Incompatible Counters in definition of AveragingAccumulator. Both should have identical Input" );
720  SumAcc>::AccumulatorSet;
721  template <typename Result = fp_result_type<Arithmetic>>
722  auto mean() const {
723  auto n = this->nEntries();
724  Result sum = this->sum();
725  return ( n > 0 ) ? static_cast<Result>( sum / n ) : Result{};
726  }
727  };
728 
733  template <atomicity Atomicity, typename Arithmetic>
735 
741  template <atomicity Atomicity, typename Arithmetic, template <atomicity, typename> typename AvgAcc,
742  template <atomicity, typename> typename SquareAcc>
744  : AccumulatorSet<Arithmetic, Atomicity, typename AvgAcc<Atomicity, Arithmetic>::InputType, AvgAcc, SquareAcc> {
745  static_assert( std::is_same_v<typename AvgAcc<Atomicity, Arithmetic>::InputType,
746  typename SquareAcc<Atomicity, Arithmetic>::InputType>,
747  "Incompatible Counters in definition of SigmaAccumulator. Both should have identical Input" );
749  SquareAcc>::AccumulatorSet;
750  template <typename Result = fp_result_type<Arithmetic>>
751  auto biased_sample_variance() const {
752  auto n = this->nEntries();
753  Result sum = this->sum();
754  return ( n > 0 ) ? static_cast<Result>( ( this->sum2() - sum * ( sum / n ) ) / n ) : Result{};
755  }
756 
757  template <typename Result = fp_result_type<Arithmetic>>
759  auto n = this->nEntries();
760  Result sum = this->sum();
761  return ( n > 1 ) ? static_cast<Result>( ( this->sum2() - sum * ( sum / n ) ) / ( n - 1 ) ) : Result{};
762  }
763 
764  template <typename Result = fp_result_type<Arithmetic>>
765  auto standard_deviation() const {
766  // Note the usage of using, aiming at using the std version of sqrt by default, without preventing
767  // more specialized versions to be used via ADL (see http://en.cppreference.com/w/cpp/language/adl)
769  using std::sqrt;
770  Result v = biased_sample_variance();
771  return ( Result{ 0 } > v ) ? Result{} : static_cast<Result>( sqrt( v ) );
772  }
773  [[deprecated( "The name 'rms' has changed to standard_deviation" )]] Arithmetic rms() const {
774  return standard_deviation();
775  }
776 
777  template <typename Result = fp_result_type<Arithmetic>>
778  auto meanErr() const {
779  auto n = this->nEntries();
780  if ( 0 == n ) return Result{};
781  // Note the usage of using, aiming at using the std version of sqrt by default, without preventing
782  // more specialized versions to be used via ADL (see http://en.cppreference.com/w/cpp/language/adl)
784  using std::sqrt;
785  Result v = biased_sample_variance();
786  return ( Result{ 0 } > v ) ? Result{} : static_cast<Result>( sqrt( v / n ) );
787  }
788  };
789 
794  template <atomicity Atomicity, typename Arithmetic>
796 
801  template <atomicity Atomicity, typename Arithmetic>
804 
811  template <template <atomicity Ato, typename... Int> class ContainedAccumulator, atomicity Atomicity, typename... Args>
812  class Buffer : public ContainedAccumulator<atomicity::none, Args...> {
813  using prime_type = ContainedAccumulator<Atomicity, Args...>;
814  using base_type = ContainedAccumulator<atomicity::none, Args...>;
815 
816  public:
817  Buffer() = delete;
818  Buffer( prime_type& p ) : base_type( construct_empty, p ), m_prime( p ) {}
819  Buffer( const Buffer& ) = delete;
820  void operator=( const Buffer& ) = delete;
821  Buffer( Buffer&& other ) : base_type( other ), m_prime( other.m_prime ) { other.reset(); }
822  void push() { m_prime.mergeAndReset( static_cast<base_type&&>( *this ) ); }
823  ~Buffer() { push(); }
824 
825  private:
827  };
828 
834  PrintableCounter() = default;
836  virtual ~PrintableCounter() = default;
837  // add tag to printout
838  template <typename stream>
839  stream& printImpl( stream& s, std::string_view tag ) const {
840  s << boost::format{ " | %|-48.48s|%|50t|" } % ( std::string{ '\"' }.append( tag ).append( "\"" ) );
841  return print( s, true );
842  }
844  virtual std::ostream& print( std::ostream&, bool tableFormat = false ) const = 0;
845  virtual MsgStream& print( MsgStream&, bool tableFormat = true ) const = 0;
847  virtual std::ostream& print( std::ostream& o, std::string_view tag ) const { return printImpl( o, tag ); }
848  virtual MsgStream& print( MsgStream& o, std::string_view tag ) const { return printImpl( o, tag ); }
851  virtual bool toBePrinted() const { return true; }
854  std::ostringstream ost;
855  print( ost );
856  return ost.str();
857  }
859  virtual nlohmann::json toJSON() const = 0;
860  };
861 
865  inline std::ostream& operator<<( std::ostream& s, const PrintableCounter& counter ) { return counter.print( s ); }
866  inline MsgStream& operator<<( MsgStream& s, const PrintableCounter& counter ) { return counter.print( s ); }
873  template <atomicity Atomicity, template <atomicity Ato, typename... Int> class Accumulator, typename... Args>
874  class BufferableCounter : public PrintableCounter, public Accumulator<Atomicity, Args...> {
875  public:
876  using Accumulator<Atomicity, Args...>::Accumulator;
877  BufferableCounter() = default;
878  template <typename OWNER>
879  BufferableCounter( OWNER* o, std::string const& name ) : BufferableCounter( o, name, *this ) {}
880  Buffer<Accumulator, Atomicity, Args...> buffer() { return { *this }; }
884  if ( m_monitoringHub ) { m_monitoringHub->removeEntity( *this ); }
885  }
886 
887  inline static const std::string typeString{ "counter" };
888 
889  protected:
890  template <typename OWNER, typename SELF, typename... CARGS>
891  BufferableCounter( OWNER* o, std::string const& name, SELF& self, CARGS... args )
892  : Accumulator<Atomicity, Args...>( args... ), m_monitoringHub( &o->serviceLocator()->monitoringHub() ) {
893  m_monitoringHub->registerEntity( o->name(), name, self.typeString, self );
894  }
895 
896  private:
897  Monitoring::Hub* m_monitoringHub{ nullptr };
898  };
899 
904  template <atomicity Atomicity = atomicity::full, typename Arithmetic = unsigned long>
905  struct Counter : BufferableCounter<Atomicity, IntegralAccumulator, Arithmetic> {
906  inline static const std::string typeString{ std::string{ "counter:Counter:" } + typeid( Arithmetic ).name() };
908  template <typename OWNER>
909  Counter( OWNER* o, std::string const& name )
910  : BufferableCounter<Atomicity, IntegralAccumulator, Arithmetic>( o, name, *this ) {}
911  Counter& operator++() { return ( *this ) += 1; }
912  Counter& operator+=( const Arithmetic v ) {
914  return *this;
915  }
917 
918  template <typename stream>
919  stream& printImpl( stream& o, bool tableFormat ) const {
920  // Avoid printing empty counters in non DEBUG mode
921  auto fmt = ( tableFormat ? "|%|10d| |" : "#=%|-7lu|" );
922  return o << boost::format{ fmt } % this->nEntries();
923  }
924 
925  std::ostream& print( std::ostream& o, bool tableFormat = false ) const override {
926  return printImpl( o, tableFormat );
927  }
928  MsgStream& print( MsgStream& o, bool tableFormat = false ) const override { return printImpl( o, tableFormat ); }
929  bool toBePrinted() const override { return this->nEntries() > 0; }
930  virtual nlohmann::json toJSON() const override {
931  return { { "type", typeString }, { "empty", this->nEntries() == 0 }, { "nEntries", this->nEntries() } };
932  }
933  static Counter fromJSON( const nlohmann::json& j ) {
935  }
936  };
937 
942  template <typename Arithmetic = double, atomicity Atomicity = atomicity::full>
943  struct AveragingCounter : BufferableCounter<Atomicity, AveragingAccumulator, Arithmetic> {
944  inline static const std::string typeString{ std::string{ "counter:AveragingCounter:" } +
945  typeid( Arithmetic ).name() };
947  template <typename OWNER>
948  AveragingCounter( OWNER* o, std::string const& name )
949  : BufferableCounter<Atomicity, AveragingAccumulator, Arithmetic>( o, name, *this ) {}
951 
952  template <typename stream>
953  stream& printImpl( stream& o, bool tableFormat ) const {
954  auto fmt = ( tableFormat ? "|%|10d| |%|11.7g| |%|#11.5g| |" : "#=%|-7lu| Sum=%|-11.5g| Mean=%|#10.4g|" );
955  return o << boost::format{ fmt } % this->nEntries() % this->sum() % this->mean();
956  }
957 
958  std::ostream& print( std::ostream& o, bool tableFormat = false ) const override {
959  return printImpl( o, tableFormat );
960  }
961  MsgStream& print( MsgStream& o, bool tableFormat = false ) const override { return printImpl( o, tableFormat ); }
962 
963  bool toBePrinted() const override { return this->nEntries() > 0; }
964  virtual nlohmann::json toJSON() const override {
965  return { { "type", typeString },
966  { "empty", this->nEntries() == 0 },
967  { "nEntries", this->nEntries() },
968  { "sum", this->sum() },
969  { "mean", this->mean() } };
970  }
972  return AveragingAccumulator<Atomicity, Arithmetic>::extractJSONData( j, { "nEntries", "sum" } );
973  }
974  };
975  template <typename Arithmetic = double, atomicity Atomicity = atomicity::full>
977 
982  template <typename Arithmetic = double, atomicity Atomicity = atomicity::full>
983  struct SigmaCounter : BufferableCounter<Atomicity, SigmaAccumulator, Arithmetic> {
984  inline static const std::string typeString{ std::string{ "counter:SigmaCounter:" } + typeid( Arithmetic ).name() };
986  template <typename OWNER>
987  SigmaCounter( OWNER* o, std::string const& name )
988  : BufferableCounter<Atomicity, SigmaAccumulator, Arithmetic>( o, name, *this ) {}
990 
991  template <typename stream>
992  stream& printImpl( stream& o, bool tableFormat ) const {
993  auto fmt = ( tableFormat ? "|%|10d| |%|11.7g| |%|#11.5g| |%|#11.5g| |"
994  : "#=%|-7lu| Sum=%|-11.5g| Mean=%|#10.4g| +- %|-#10.5g|" );
995  return o << boost::format{ fmt } % this->nEntries() % this->sum() % this->mean() % this->standard_deviation();
996  }
997 
998  std::ostream& print( std::ostream& o, bool tableFormat = false ) const override {
999  return printImpl( o, tableFormat );
1000  }
1001  MsgStream& print( MsgStream& o, bool tableFormat = false ) const override { return printImpl( o, tableFormat ); }
1002  bool toBePrinted() const override { return this->nEntries() > 0; }
1003  virtual nlohmann::json toJSON() const override {
1004  return { { "type", typeString },
1005  { "empty", this->nEntries() == 0 },
1006  { "nEntries", this->nEntries() },
1007  { "sum", this->sum() },
1008  { "mean", this->mean() },
1009  { "sum2", this->sum2() },
1010  { "standard_deviation", this->standard_deviation() } };
1011  }
1013  return SigmaAccumulator<Atomicity, Arithmetic>::extractJSONData( j, { { "nEntries", "sum" }, "sum2" } );
1014  }
1015  };
1016 
1021  template <typename Arithmetic = double, atomicity Atomicity = atomicity::full>
1022  struct StatCounter : BufferableCounter<Atomicity, StatAccumulator, Arithmetic> {
1023  inline static const std::string typeString{ std::string{ "counter:StatCounter:" } + typeid( Arithmetic ).name() };
1025  template <typename OWNER>
1026  StatCounter( OWNER* o, std::string const& name )
1027  : BufferableCounter<Atomicity, StatAccumulator, Arithmetic>( o, name, *this ) {}
1029 
1030  template <typename stream>
1031  stream& printImpl( stream& o, bool tableFormat ) const {
1032  auto fmt = ( tableFormat ? "|%|10d| |%|11.7g| |%|#11.5g| |%|#11.5g| |%|#12.5g| |%|#12.5g| |"
1033  : "#=%|-7lu| Sum=%|-11.5g| Mean=%|#10.4g| +- %|-#10.5g| Min/Max=%|#10.4g|/%|-#10.4g|" );
1034  return o << boost::format{ fmt } % this->nEntries() % this->sum() % this->mean() % this->standard_deviation() %
1035  this->min() % this->max();
1036  }
1037 
1038  std::ostream& print( std::ostream& o, bool tableFormat = false ) const override {
1039  return printImpl( o, tableFormat );
1040  }
1041  MsgStream& print( MsgStream& o, bool tableFormat = false ) const override { return printImpl( o, tableFormat ); }
1042  bool toBePrinted() const override { return this->nEntries() > 0; }
1043  virtual nlohmann::json toJSON() const override {
1044  return { { "type", typeString },
1045  { "empty", this->nEntries() == 0 },
1046  { "nEntries", this->nEntries() },
1047  { "sum", this->sum() },
1048  { "mean", this->mean() },
1049  { "sum2", this->sum2() },
1050  { "standard_deviation", this->standard_deviation() },
1051  { "min", this->min() },
1052  { "max", this->max() } };
1053  }
1056  j, { { { "nEntries", "sum" }, "sum2" }, "min", "max" } );
1057  }
1058  };
1059 
1064  template <typename Arithmetic = double, atomicity Atomicity = atomicity::full>
1065  struct BinomialCounter : BufferableCounter<Atomicity, BinomialAccumulator, Arithmetic> {
1066  inline static const std::string typeString{ std::string{ "counter:BinomialCounter:" } +
1067  typeid( Arithmetic ).name() };
1069  template <typename OWNER>
1070  BinomialCounter( OWNER* o, std::string const& name )
1071  : BufferableCounter<Atomicity, BinomialAccumulator, Arithmetic>( o, name, *this ) {}
1072 
1073  template <typename stream>
1074  stream& printImpl( stream& o, bool tableFormat ) const {
1075  auto fmt = ( tableFormat ? "|%|10d| |%|11.5g| |(%|#9.7g| +- %|-#8.7g|)%% |"
1076  : "#=%|-7lu| Sum=%|-11.5g| Eff=|(%|#9.7g| +- %|-#8.6g|)%%|" );
1077  return o << boost::format{ fmt } % this->nEntries() % this->nTrueEntries() % ( this->efficiency() * 100 ) %
1078  ( this->efficiencyErr() * 100 );
1079  }
1080 
1081  std::ostream& print( std::ostream& o, bool tableFormat = false ) const override {
1082  return printImpl( o, tableFormat );
1083  }
1084  MsgStream& print( MsgStream& o, bool tableFormat = false ) const override { return printImpl( o, tableFormat ); }
1085 
1086  template <typename stream>
1087  stream& printImpl( stream& o, std::string_view tag ) const {
1088  // override default print to add a '*' in from of the name
1089  o << boost::format{ " |*%|-48.48s|%|50t|" } % ( std::string{ "\"" }.append( tag ).append( "\"" ) );
1090  return print( o, true );
1091  }
1093  std::ostream& print( std::ostream& o, std::string_view tag ) const override { return printImpl( o, tag ); }
1094  MsgStream& print( MsgStream& o, std::string_view tag ) const override { return printImpl( o, tag ); }
1095  bool toBePrinted() const override { return this->nEntries() > 0; }
1096  virtual nlohmann::json toJSON() const override {
1097  return { { "type", typeString },
1098  { "empty", this->nEntries() == 0 },
1099  { "nEntries", this->nTrueEntries() + this->nFalseEntries() },
1100  { "nTrueEntries", this->nTrueEntries() },
1101  { "nFalseEntries", this->nFalseEntries() },
1102  { "efficiency", this->efficiency() },
1103  { "efficiencyErr", this->efficiencyErr() } };
1104  }
1106  return BinomialAccumulator<Atomicity, Arithmetic>::extractJSONData( j, { "nTrueEntries", "nFalseEntries" } );
1107  }
1108  };
1109 
1110  namespace details::MsgCounter {
1111  template <atomicity Atomicity>
1112  struct Handler : Adder<unsigned long, Atomicity> {
1114  static void merge( typename Base::InternalType& orig, bool b ) {
1115  if ( b ) Base::merge( orig, 1 );
1116  }
1117  };
1118  // note that Arithmetic type is unused in this case but needs to be there in case
1119  // we want to create AccumulatorSets with this Accumulator
1120  template <atomicity Atomicity, typename Arithmetic = double>
1122  } // namespace details::MsgCounter
1123 
1124  template <MSG::Level level, atomicity Atomicity = atomicity::full>
1126  public:
1127  inline static const std::string typeString{ "counter:MsgCounter" };
1128  template <typename OWNER>
1129  MsgCounter( OWNER* o, std::string const& ms, unsigned long nMax = 10 )
1130  : m_monitoringHub{ &o->serviceLocator()->monitoringHub() }, logger( o ), msg( ms ), max( nMax ) {
1131  m_monitoringHub->registerEntity( o->name(), ms, typeString, *this );
1132  }
1133  template <typename OWNER>
1134  MsgCounter( OWNER* o, std::string const& ms, int nMax ) : MsgCounter( o, ms, static_cast<unsigned long>( nMax ) ) {}
1136  ( *this ) += true;
1137  return *this;
1138  }
1139  MsgCounter& operator+=( const bool by ) {
1141  if ( by ) log();
1142  return *this;
1143  }
1144  MsgCounter( MsgCounter const& ) = delete;
1145  MsgCounter& operator=( MsgCounter const& ) = delete;
1147  if ( m_monitoringHub ) m_monitoringHub->removeEntity( *this );
1148  }
1149  template <typename stream>
1150  stream& printImpl( stream& o, bool tableFormat ) const {
1151  return o << boost::format{ tableFormat ? "|%|10d| |" : "#=%|-7lu|" } % this->value();
1152  }
1154  std::ostream& print( std::ostream& os, bool tableFormat ) const override { return printImpl( os, tableFormat ); }
1155  MsgStream& print( MsgStream& os, bool tableFormat ) const override { return printImpl( os, tableFormat ); }
1156  bool toBePrinted() const override { return this->value() > 0; }
1157  virtual nlohmann::json toJSON() const override {
1158  return { { "type", typeString },
1159  { "empty", this->value() == 0 },
1160  { "nEntries", this->value() },
1161  { "level", level },
1162  { "max", max },
1163  { "msg", msg } };
1164  }
1166  return { j.at( "msg" ).get<std::string>(), j.at( "max" ).get<unsigned long>(),
1167  j.at( "nEntries" ).get<unsigned long>() };
1168  }
1169 
1170  private:
1171  MsgCounter( std::string const& ms, unsigned long nMax, unsigned long count )
1172  : details::MsgCounter::MsgAccumulator<Atomicity>{ count }, msg( ms ), max( nMax ) {}
1173 
1175  const CommonMessagingBase* logger{ nullptr };
1177  unsigned long max;
1178  void log() {
1179  if ( this->value() <= max && logger ) {
1180  if ( this->value() == max ) {
1181  logger->msgStream( level ) << "Suppressing message: " << std::quoted( msg, '\'' ) << endmsg;
1182  } else {
1183  logger->msgStream( level ) << msg << endmsg;
1184  }
1185  }
1186  }
1187  };
1188 
1194  template <typename Counter, typename Container, typename Fun>
1195  void accumulate( Counter& counter, const Container& container, Fun f = Identity{} ) {
1196  auto b = counter.buffer();
1197  for ( const auto& elem : container ) b += f( elem );
1198  }
1199 
1200 } // namespace Gaudi::Accumulators
Gaudi::Accumulators::MsgCounter::MsgCounter
MsgCounter(std::string const &ms, unsigned long nMax, unsigned long count)
Definition: Accumulators.h:1171
Gaudi::Accumulators::BaseValueHandler< Arithmetic, atomicity::full >::OutputType
Arithmetic OutputType
Definition: Accumulators.h:309
Gaudi::Accumulators::PrintableCounter
An empty ancester of all counters that knows how to print themselves.
Definition: Accumulators.h:833
Gaudi::Accumulators::BufferableCounter::buffer
Buffer< Accumulator, Atomicity, Args... > buffer()
Definition: Accumulators.h:880
Gaudi::Accumulators::PrintableCounter::printImpl
stream & printImpl(stream &s, std::string_view tag) const
Definition: Accumulators.h:839
Gaudi::Accumulators::sqrt
auto sqrt(std::chrono::duration< Rep, Period > d)
sqrt for std::chrono::duration
Definition: Counters.h:34
Gaudi::Accumulators::GenericAccumulator< bool, unsigned long, Atomicity, TrueTo1 >::InternalType
unsigned long InternalType
Definition: Accumulators.h:445
Gaudi::Accumulators::BinomialCounter::typeString
static const std::string typeString
Definition: Accumulators.h:1066
Gaudi::Accumulators::Buffer::m_prime
prime_type & m_prime
Definition: Accumulators.h:826
Gaudi::Accumulators::AccumulatorSet::extractJSONData
static InternalType extractJSONData(const nlohmann::json &j, const JSONStringEntriesType &entries)
Definition: Accumulators.h:525
std::make_tuple
T make_tuple(T... args)
Gaudi::Accumulators::SigmaCounter::toJSON
virtual nlohmann::json toJSON() const override
Basic JSON export for Gaudi::Monitoring::Hub support.
Definition: Accumulators.h:1003
Gaudi::Accumulators::MsgCounter::logger
const CommonMessagingBase * logger
Definition: Accumulators.h:1175
Gaudi::Accumulators::StatCounter::printImpl
stream & printImpl(stream &o, bool tableFormat) const
Definition: Accumulators.h:1031
Gaudi::Accumulators::CountAccumulator::operator++
CountAccumulator & operator++()
Definition: Accumulators.h:575
Gaudi::Accumulators::MsgCounter::log
void log()
Definition: Accumulators.h:1178
Write.stream
stream
Definition: Write.py:32
Gaudi::Accumulators::BaseValueHandler< Arithmetic, atomicity::none >::InternalType
Arithmetic InternalType
Definition: Accumulators.h:299
Gaudi::Accumulators::Buffer::prime_type
ContainedAccumulator< Atomicity, Args... > prime_type
Definition: Accumulators.h:813
std::string
STL class.
Gaudi::Accumulators::Buffer::push
void push()
Definition: Accumulators.h:822
GaudiPython.HistoUtils.nEntries
nEntries
Definition: HistoUtils.py:939
Gaudi::Accumulators::TrueAccumulator
TrueAccumulator.
Definition: Accumulators.h:642
IOTest.N
N
Definition: IOTest.py:110
Gaudi::Accumulators::BinomialCounter::print
std::ostream & print(std::ostream &o, std::string_view tag) const override
prints the counter to a stream in table format, with the given tag
Definition: Accumulators.h:1093
Gaudi::Accumulators::BaseValueHandler
Base type for all functors used as ValuesHandler.
Definition: Accumulators.h:291
Gaudi::Accumulators::BufferableCounter::BufferableCounter
BufferableCounter(BufferableCounter const &)=delete
Gaudi::Accumulators::AccumulatorSet::operator+=
AccumulatorSet & operator+=(const InputType by)
Definition: Accumulators.h:505
Gaudi::Accumulators::operator*
auto operator*(const std::chrono::duration< Rep1, Period > &lhs, const std::chrono::duration< Rep2, Period > &rhs)
Multiplication of two std::chrono::duration objects with same Period.
Definition: Counters.h:40
Gaudi::Accumulators::GenericAccumulator::m_value
ValueHandler::InternalType m_value
Definition: Accumulators.h:484
Gaudi::Accumulators::MsgCounter::MsgCounter
MsgCounter(MsgCounter const &)=delete
Gaudi::Accumulators::MsgCounter::m_monitoringHub
Monitoring::Hub * m_monitoringHub
Definition: Accumulators.h:1174
std::move
T move(T... args)
Gaudi::Accumulators::SigmaCounter
A counter aiming at computing average and sum2 / variance / standard deviation.
Definition: Accumulators.h:983
Gaudi::Accumulators::Adder< Arithmetic, atomicity::full >::DefaultValue
static constexpr OutputType DefaultValue()
Definition: Accumulators.h:342
Gaudi::Accumulators::BaseValueHandler< Arithmetic, atomicity::full >::getValue
static constexpr OutputType getValue(const InternalType &v) noexcept
Definition: Accumulators.h:311
Gaudi::Accumulators::PrintableCounter::toBePrinted
virtual bool toBePrinted() const
hint whether we should print that counter or not.
Definition: Accumulators.h:851
Gaudi::Accumulators::BufferableCounter::operator=
BufferableCounter & operator=(BufferableCounter const &)=delete
MonitoringHub.h
Gaudi::Accumulators::GenericAccumulator::GenericAccumulator
GenericAccumulator(InnerType in)
Definition: Accumulators.h:476
Gaudi::Accumulators::GenericAccumulator::rawValue
auto rawValue() const
Definition: Accumulators.h:477
Gaudi::Accumulators::AccumulatorSet
AccumulatorSet is an Accumulator that holds a set of Accumulators templated by same Arithmetic and At...
Definition: Accumulators.h:494
Gaudi::Accumulators::SumAccumulator
SumAccumulator.
Definition: Accumulators.h:592
Gaudi::Accumulators::MsgCounter::MsgCounter
MsgCounter(OWNER *o, std::string const &ms, unsigned long nMax=10)
Definition: Accumulators.h:1129
Gaudi::Accumulators::AveragingCounter::AveragingCounter
AveragingCounter(OWNER *o, std::string const &name)
Definition: Accumulators.h:948
Gaudi::Accumulators::atomicity::full
@ full
Gaudi::Accumulators::BaseValueHandler< Arithmetic, atomicity::none >::exchange
static Arithmetic exchange(InternalType &v, Arithmetic newv) noexcept
Definition: Accumulators.h:301
Properties.long
long
(c) Copyright 1998-2020 CERN for the benefit of the LHCb and ATLAS collaborations # # This software i...
Definition: Properties.py:15
gaudirun.s
string s
Definition: gaudirun.py:348
Gaudi::Accumulators::StatCounter::fromJSON
static StatCounter fromJSON(const nlohmann::json &j)
Definition: Accumulators.h:1054
Gaudi::Accumulators::MsgCounter::print
MsgStream & print(MsgStream &os, bool tableFormat) const override
Definition: Accumulators.h:1155
Gaudi::Accumulators::SigmaCounter::print
std::ostream & print(std::ostream &o, bool tableFormat=false) const override
prints the counter to a stream
Definition: Accumulators.h:998
Gaudi::Accumulators::PrintableCounter::~PrintableCounter
virtual ~PrintableCounter()=default
destructor
Gaudi::Accumulators::BaseValueHandler< Arithmetic, atomicity::none >::getValue
static constexpr OutputType getValue(const InternalType &v) noexcept
Definition: Accumulators.h:300
Gaudi::Accumulators::PrintableCounter::toString
std::string toString() const
get a string representation
Definition: Accumulators.h:853
Gaudi::Accumulators::BufferableCounter::BufferableCounter
BufferableCounter()=default
Gaudi::Accumulators::details::MsgCounter::Handler
Definition: Accumulators.h:1112
Gaudi::Accumulators::MsgCounter::msg
std::string msg
Definition: Accumulators.h:1176
Gaudi::Accumulators::IntegralAccumulator
IntegralAccumulator.
Definition: Accumulators.h:603
jsonFromLHCbLog.json
json
Definition: jsonFromLHCbLog.py:87
Gaudi::Accumulators::BinomialCounter::toBePrinted
bool toBePrinted() const override
hint whether we should print that counter or not.
Definition: Accumulators.h:1095
Gaudi::Accumulators::AveragingCounter::print
std::ostream & print(std::ostream &o, bool tableFormat=false) const override
prints the counter to a stream
Definition: Accumulators.h:958
Gaudi::Accumulators::Extremum< Arithmetic, atomicity::none, Compare, Initial >::merge
static void merge(InternalType &a, Arithmetic b) noexcept
Definition: Accumulators.h:370
Gaudi::Accumulators::GenericAccumulator::GenericAccumulator
GenericAccumulator(std::in_place_t, Args &&... args)
Definition: Accumulators.h:458
Gaudi::Accumulators::SquareAccumulator
SquareAccumulator.
Definition: Accumulators.h:626
std::chrono::duration
Gaudi::Accumulators::GenericAccumulator::reset
void reset()
Definition: Accumulators.h:465
Gaudi::Accumulators::Counter::fromJSON
static Counter fromJSON(const nlohmann::json &j)
Definition: Accumulators.h:933
Gaudi::Accumulators::BaseValueHandler< Arithmetic, atomicity::none >::OutputType
Arithmetic OutputType
Definition: Accumulators.h:298
Gaudi::Accumulators::PrintableCounter::print
virtual MsgStream & print(MsgStream &, bool tableFormat=true) const =0
nlohmann
Definition: Accumulators.h:223
Gaudi::Accumulators::MsgCounter::operator++
MsgCounter & operator++()
Definition: Accumulators.h:1135
Gaudi::Accumulators::MsgCounter::~MsgCounter
~MsgCounter()
Definition: Accumulators.h:1146
CommonMessagingBase
Definition: CommonMessaging.h:68
Gaudi::Accumulators::MinAccumulator
MinAccumulator.
Definition: Accumulators.h:560
Gaudi::Accumulators::AveragingCounter
A counter aiming at computing sum and average.
Definition: Accumulators.h:943
Gaudi::Accumulators::PrintableCounter::PrintableCounter
PrintableCounter()=default
Gaudi::Accumulators::AccumulatorSet::reset
void reset()
Definition: Accumulators.h:510
Gaudi::Accumulators::Buffer::Buffer
Buffer(const Buffer &)=delete
Gaudi::Accumulators::BinomialCounter::print
MsgStream & print(MsgStream &o, bool tableFormat=false) const override
Definition: Accumulators.h:1084
Gaudi::Accumulators::AccumulatorSet::AccumulatorSet
AccumulatorSet(construct_empty_t, const AccumulatorSet< Arithmetic, ato, InputType, Bases... > &)
constructor of an empty AccumulatorSet, copying the (non existent) config from another GenericAccumul...
Definition: Accumulators.h:503
Gaudi::Accumulators::BinomialCounter::print
std::ostream & print(std::ostream &o, bool tableFormat=false) const override
prints the counter to a stream
Definition: Accumulators.h:1081
std::tuple
Gaudi::Accumulators::MinAccumulator::min
Arithmetic min() const
Definition: Accumulators.h:563
max
EventIDBase max(const EventIDBase &lhs, const EventIDBase &rhs)
Definition: EventIDBase.h:225
Gaudi::Accumulators::PrintableCounter::print
virtual std::ostream & print(std::ostream &o, std::string_view tag) const
prints the counter to a stream in table format, with the given tag
Definition: Accumulators.h:847
Gaudi::Accumulators::SigmaAccumulatorBase::meanErr
auto meanErr() const
Definition: Accumulators.h:778
class
#define class
Definition: HistogramPersistencySvc.cpp:54
Gaudi::Accumulators::BinomialAccumulator::operator+=
BinomialAccumulator & operator+=(binomial_t b)
Definition: Accumulators.h:697
Gaudi::Accumulators::BinomialCounter::BinomialCounter
BinomialCounter(OWNER *o, std::string const &name)
Definition: Accumulators.h:1070
Counter
Definition: Counter.py:1
Gaudi::Accumulators::AccumulatorSet::operator+
void operator+(AccumulatorSet< Arithmetic, Ato, InputType, Bases... > &&other)
Definition: Accumulators.h:516
Gaudi::Accumulators::MsgCounter::operator=
MsgCounter & operator=(MsgCounter const &)=delete
Gaudi::Accumulators::Counter::printImpl
stream & printImpl(stream &o, bool tableFormat) const
Definition: Accumulators.h:919
Gaudi::Accumulators::TrueTo1
helper functor for the TrueAccumulator
Definition: Accumulators.h:632
Gaudi::Accumulators::MsgCounter::MsgCounter
MsgCounter(OWNER *o, std::string const &ms, int nMax)
Definition: Accumulators.h:1134
Gaudi::Accumulators::AveragingAccumulatorBase
AveragingAccumulatorBase.
Definition: Accumulators.h:715
Gaudi::Accumulators::BaseValueHandler< Arithmetic, atomicity::full >::exchange
static Arithmetic exchange(InternalType &v, Arithmetic newv) noexcept
Definition: Accumulators.h:314
Gaudi::Accumulators::Buffer::base_type
ContainedAccumulator< atomicity::none, Args... > base_type
Definition: Accumulators.h:814
Gaudi::Accumulators::SigmaCounter::SigmaCounter
SigmaCounter(OWNER *o, std::string const &name)
Definition: Accumulators.h:987
Gaudi::Accumulators::BinomialAccumulator::binomial_t
Definition: Accumulators.h:693
std::sqrt
T sqrt(T... args)
Gaudi::Accumulators::Counter::operator+=
Counter & operator+=(const Arithmetic v)
Definition: Accumulators.h:912
Gaudi::Accumulators::BufferableCounter::BufferableCounter
BufferableCounter(OWNER *o, std::string const &name)
Definition: Accumulators.h:879
Gaudi::Accumulators::AccumulatorSet::extractJSONDataHelper
static InternalType extractJSONDataHelper(const nlohmann::json &j, typename Bases< Atomicity, Arithmetic >::JSONStringEntriesType... entries)
Definition: Accumulators.h:536
Gaudi::Accumulators::Square
A Square functor.
Definition: Accumulators.h:266
Gaudi::Accumulators::Counter::operator++
Counter & operator++()
Definition: Accumulators.h:911
Gaudi::Units::ms
constexpr double ms
Definition: SystemOfUnits.h:154
Gaudi::Accumulators::GenericAccumulator< bool, unsigned long, Atomicity, TrueTo1 >::InputType
bool InputType
Definition: Accumulators.h:439
Gaudi::Accumulators::MsgCounter::operator+=
MsgCounter & operator+=(const bool by)
Definition: Accumulators.h:1139
Gaudi::Accumulators::AccumulatorSet::mergeAndReset
void mergeAndReset(AccumulatorSet< Arithmetic, Ato, InputType, Bases... > &&other)
Definition: Accumulators.h:512
Gaudi::Accumulators::Counter::print
MsgStream & print(MsgStream &o, bool tableFormat=false) const override
Definition: Accumulators.h:928
Gaudi::Accumulators::GenericAccumulator::operator+=
GenericAccumulator operator+=(const InputType by)
Definition: Accumulators.h:447
Gaudi::Accumulators::StatCounter::StatCounter
StatCounter(OWNER *o, std::string const &name)
Definition: Accumulators.h:1026
Gaudi::Accumulators::StatCounter::print
std::ostream & print(std::ostream &o, bool tableFormat=false) const override
prints the counter to a stream
Definition: Accumulators.h:1038
bug_34121.t
t
Definition: bug_34121.py:30
Gaudi::Accumulators::BinomialAccumulator
BinomialAccumulator.
Definition: Accumulators.h:669
Gaudi::Accumulators::BinomialAccumulator::eff
auto eff() const
Definition: Accumulators.h:679
Gaudi::Accumulators::IntegralAccumulator::nEntries
Arithmetic nEntries() const
Definition: Accumulators.h:617
Gaudi::Accumulators::Extremum
An Extremum ValueHandler, to be reused for Minimum and Maximum operator(a, b) means if (Compare(b,...
Definition: Accumulators.h:360
Gaudi::Accumulators::IntegralAccumulator::operator++
IntegralAccumulator & operator++()
Definition: Accumulators.h:608
Gaudi::Accumulators::AveragingCounter::printImpl
stream & printImpl(stream &o, bool tableFormat) const
Definition: Accumulators.h:953
Gaudi::Accumulators::Adder
An Adder ValueHandler operator(a, b) means a += b.
Definition: Accumulators.h:322
Gaudi::Accumulators::CountAccumulator::operator++
CountAccumulator operator++(int)
Definition: Accumulators.h:579
Gaudi::Accumulators::has_fetch_add_v
constexpr bool has_fetch_add_v
Definition: Accumulators.h:279
Gaudi::Accumulators::SigmaAccumulatorBase::unbiased_sample_variance
auto unbiased_sample_variance() const
Definition: Accumulators.h:758
TimingHistograms.name
name
Definition: TimingHistograms.py:25
details
Definition: AnyDataWrapper.h:18
Gaudi::Accumulators::BinomialAccumulator::efficiencyErr
auto efficiencyErr() const
Definition: Accumulators.h:682
ProduceConsume.j
j
Definition: ProduceConsume.py:101
std::ostream
STL class.
Gaudi::Accumulators::StatCounter::print
MsgStream & print(MsgStream &o, bool tableFormat=false) const override
Definition: Accumulators.h:1041
Gaudi::Accumulators::PrintableCounter::toJSON
virtual nlohmann::json toJSON() const =0
Basic JSON export for Gaudi::Monitoring::Hub support.
nlohmann::adl_serializer< std::chrono::duration< Rep, Period > >::from_json
static void from_json(const json &j, std::chrono::duration< Rep, Period > &d)
Definition: Accumulators.h:227
Gaudi::Accumulators::Extremum< Arithmetic, atomicity::full, Compare, Initial >::DefaultValue
static constexpr OutputType DefaultValue()
Definition: Accumulators.h:382
Gaudi::Accumulators::BinomialCounter::printImpl
stream & printImpl(stream &o, std::string_view tag) const
Definition: Accumulators.h:1087
Gaudi::Accumulators::AccumulatorSet::InternalType
std::tuple< typename Bases< Atomicity, Arithmetic >::InternalType... > InternalType
Definition: Accumulators.h:498
Gaudi::Accumulators::AveragingAccumulatorBase::mean
auto mean() const
Definition: Accumulators.h:722
Gaudi::Accumulators::Buffer::Buffer
Buffer(prime_type &p)
Definition: Accumulators.h:818
Gaudi::Accumulators::Extremum< Arithmetic, atomicity::none, Compare, Initial >::DefaultValue
static constexpr OutputType DefaultValue()
Definition: Accumulators.h:369
Gaudi::Accumulators::Buffer::Buffer
Buffer(Buffer &&other)
Definition: Accumulators.h:821
Gaudi::Accumulators::GenericAccumulator::GenericAccumulator
GenericAccumulator(construct_empty_t, const GenericAccumulator< InputType, InnerType, ato, InputTransform, OutputTransform, VH > &)
constructor of an empty GenericAccumulator, copying the (non existent) config from another GenericAcc...
Definition: Accumulators.h:454
Gaudi::Accumulators::GenericAccumulator< double, double, Atomicity, Identity, Identity, Maximum< double, Atomicity > >::GenericAccumulator
friend class GenericAccumulator
Definition: Accumulators.h:436
Gaudi::Accumulators::Counter::typeString
static const std::string typeString
Definition: Accumulators.h:906
Gaudi::Accumulators::AccumulatorSet::value
OutputType value() const
Definition: Accumulators.h:509
Gaudi::Accumulators::GenericAccumulator< bool, unsigned long, Atomicity, TrueTo1 >::OutputType
std::decay_t< std::result_of_t< Identity(unsigned long)> > OutputType
Definition: Accumulators.h:443
Gaudi::Accumulators::GenericAccumulator::operator=
GenericAccumulator & operator=(const GenericAccumulator &other)
Definition: Accumulators.h:460
Gaudi::Accumulators::details::MsgCounter::MsgAccumulator
GenericAccumulator< bool, unsigned long, Atomicity, Identity, Identity, Handler< Atomicity > > MsgAccumulator
Definition: Accumulators.h:1121
Gaudi::Accumulators::BinomialCounter
A counter dealing with binomial data.
Definition: Accumulators.h:1065
AlgTools.Int
Int
Definition: AlgTools.py:21
Gaudi::Accumulators::details::MsgCounter::Handler::merge
static void merge(typename Base::InternalType &orig, bool b)
Definition: Accumulators.h:1114
Gaudi::Accumulators::Buffer::~Buffer
~Buffer()
Definition: Accumulators.h:823
Gaudi::Monitoring::Hub::registerEntity
void registerEntity(std::string c, std::string n, std::string t, T &ent)
Definition: MonitoringHub.h:167
Gaudi::Accumulators::Adder< Arithmetic, atomicity::none >::merge
static void merge(InternalType &a, Arithmetic b) noexcept
Definition: Accumulators.h:332
Gaudi::Accumulators::AccumulatorSet::extractJSONDataHelper
static InternalType extractJSONDataHelper(const nlohmann::json &j, const JSONStringEntriesType &entries, std::index_sequence< Is... >)
Definition: Accumulators.h:531
Gaudi::Accumulators::BinomialAccumulator::binomial_t::nPass
unsigned long nPass
Definition: Accumulators.h:694
CommonMessaging.h
Gaudi::Accumulators::Buffer::operator=
void operator=(const Buffer &)=delete
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
Gaudi::Accumulators::MsgCounter::print
std::ostream & print(std::ostream &os, bool tableFormat) const override
prints the counter to a stream
Definition: Accumulators.h:1154
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
Gaudi::Monitoring::Hub::removeEntity
void removeEntity(T &ent)
Definition: MonitoringHub.h:175
Gaudi::Accumulators::MsgCounter
Definition: Accumulators.h:1125
std::atomic
STL class.
Gaudi::Accumulators::AccumulatorSet< Arithmetic, Atomicity, CountAcc< Atomicity, Arithmetic >::InputType, CountAcc, SumAcc >::InputType
CountAcc< Atomicity, Arithmetic >::InputType InputType
Definition: Accumulators.h:496
Gaudi::Accumulators::FalseAccumulator::nFalseEntries
unsigned long nFalseEntries() const
Definition: Accumulators.h:660
Gaudi::Accumulators::BinomialCounter::toJSON
virtual nlohmann::json toJSON() const override
Basic JSON export for Gaudi::Monitoring::Hub support.
Definition: Accumulators.h:1096
Gaudi::Accumulators::BinomialAccumulator::efficiency
auto efficiency() const
Definition: Accumulators.h:674
min
EventIDBase min(const EventIDBase &lhs, const EventIDBase &rhs)
Definition: EventIDBase.h:212
Gaudi::Accumulators::AccumulatorSet::AccumulatorSet
constexpr AccumulatorSet()=default
Gaudi::Accumulators::GenericAccumulator
Generic Accumulator, templated by.
Definition: Accumulators.h:434
gaudirun.level
level
Definition: gaudirun.py:366
GaudiPython.HistoUtils.mean
mean
Definition: HistoUtils.py:904
Gaudi::Accumulators::BufferableCounter::BufferableCounter
BufferableCounter(OWNER *o, std::string const &name, SELF &self, CARGS... args)
Definition: Accumulators.h:891
Gaudi::Accumulators::Constant
A functor always returning the value N.
Definition: Accumulators.h:246
MsgStream
Definition: MsgStream.h:34
nlohmann::adl_serializer< std::chrono::duration< Rep, Period > >::to_json
static void to_json(json &j, const std::chrono::duration< Rep, Period > &d)
Definition: Accumulators.h:226
GaudiPluginService.cpluginsvc.n
n
Definition: cpluginsvc.py:235
Gaudi::Accumulators::GenericAccumulator::value
OutputType value() const
Definition: Accumulators.h:464
std::string::append
T append(T... args)
Gaudi::Accumulators::GenericAccumulator::reset
void reset(InnerType in)
Definition: Accumulators.h:478
CommonMessagingBase::msgStream
MsgStream & msgStream() const
Return an uninitialized MsgStream.
Definition: CommonMessaging.h:81
Gaudi::Accumulators::StatCounter::toBePrinted
bool toBePrinted() const override
hint whether we should print that counter or not.
Definition: Accumulators.h:1042
Gaudi::Accumulators::BufferableCounter
An empty ancester of all counters that provides a buffer method that returns a buffer on itself Also ...
Definition: Accumulators.h:874
HistoDumpEx.v
v
Definition: HistoDumpEx.py:27
Gaudi::Accumulators::StatCounter::typeString
static const std::string typeString
Definition: Accumulators.h:1023
std::ostringstream
STL class.
Gaudi::Accumulators::Identity
An Identity functor.
Definition: Accumulators.h:256
Gaudi::Accumulators::BinomialAccumulator::effErr
auto effErr() const
Definition: Accumulators.h:691
Gaudi::Accumulators
Definition: HistogramsTests.cpp:19
Gaudi::Accumulators::GenericAccumulator::GenericAccumulator
GenericAccumulator()=default
merge
int merge(const char *target, const char *source, bool fixup=false, bool dbg=true)
Definition: merge.C:430
Gaudi::Accumulators::MsgCounter::printImpl
stream & printImpl(stream &o, bool tableFormat) const
Definition: Accumulators.h:1150
Gaudi::Accumulators::Buffer::Buffer
Buffer()=delete
Gaudi::Accumulators::SigmaCounter::typeString
static const std::string typeString
Definition: Accumulators.h:984
Gaudi::Accumulators::fp_result_type
std::conditional_t< std::is_integral_v< Arithmetic >, Result, Arithmetic > fp_result_type
type_trait for the result type of a floating point operation on the type Arithmetic
Definition: Accumulators.h:285
Gaudi::Accumulators::MaxAccumulator
MaxAccumulator.
Definition: Accumulators.h:548
Gaudi::Accumulators::MsgCounter::max
unsigned long max
Definition: Accumulators.h:1177
Gaudi::Accumulators::SigmaAccumulatorBase::rms
Arithmetic rms() const
Definition: Accumulators.h:773
Gaudi::Accumulators::CountAccumulator
CountAccumulator.
Definition: Accumulators.h:573
Gaudi::Accumulators::AveragingCounter::toJSON
virtual nlohmann::json toJSON() const override
Basic JSON export for Gaudi::Monitoring::Hub support.
Definition: Accumulators.h:964
Gaudi::Accumulators::AccumulatorSet::AccumulatorSet
AccumulatorSet(const InternalType &t)
Definition: Accumulators.h:521
Gaudi::Accumulators::PrintableCounter::print
virtual MsgStream & print(MsgStream &o, std::string_view tag) const
Definition: Accumulators.h:848
gaudirun.args
args
Definition: gaudirun.py:338
Gaudi::Accumulators::GenericAccumulator::extractJSONData
static InnerType extractJSONData(const nlohmann::json &j, const JSONStringEntriesType &entries)
Definition: Accumulators.h:479
Gaudi::Accumulators::MsgCounter::toBePrinted
bool toBePrinted() const override
hint whether we should print that counter or not.
Definition: Accumulators.h:1156
Gaudi::Accumulators::FalseAccumulator
FalseAccumulator.
Definition: Accumulators.h:658
Gaudi::Accumulators::MaxAccumulator::max
Arithmetic max() const
Definition: Accumulators.h:551
Gaudi::Accumulators::SigmaAccumulatorBase::standard_deviation
auto standard_deviation() const
Definition: Accumulators.h:765
Gaudi::Accumulators::construct_empty_t::construct_empty_t
construct_empty_t()=default
std
STL namespace.
Gaudi::Accumulators::construct_empty
constexpr construct_empty_t construct_empty
Definition: Accumulators.h:412
fmt
Definition: MessageSvcSink.cpp:25
Gaudi::Accumulators::GenericAccumulator::mergeAndReset
void mergeAndReset(GenericAccumulator< InputType, InnerType, ato, InputTransform, OutputTransform, VH > &&other)
Definition: Accumulators.h:467
Gaudi::Accumulators::FalseTo1
helper functor for the FalseAccumulator
Definition: Accumulators.h:648
Gaudi::Accumulators::BinomialCounter::fromJSON
static BinomialCounter fromJSON(const nlohmann::json &j)
Definition: Accumulators.h:1105
detected.h
Gaudi::Accumulators::AccumulatorSet::reset
void reset(const InternalType &t)
Definition: Accumulators.h:522
Gaudi::Accumulators::SigmaAccumulatorBase
SigmaAccumulatorBase.
Definition: Accumulators.h:744
Gaudi::Accumulators::Buffer
Buffer is a non atomic Accumulator which, when it goes out-of-scope, updates the underlying thread-sa...
Definition: Accumulators.h:812
Gaudi::Accumulators::CountAccumulator::nEntries
unsigned long nEntries() const
Definition: Accumulators.h:584
Gaudi::Accumulators::GenericAccumulator::operator+
void operator+(GenericAccumulator< InputType, InnerType, ato, InputTransform, OutputTransform, VH > &&other)
Definition: Accumulators.h:471
Gaudi::Accumulators::SigmaCounter::printImpl
stream & printImpl(stream &o, bool tableFormat) const
Definition: Accumulators.h:992
std::chrono::duration::count
T count(T... args)
Gaudi::Accumulators::MsgCounter::toJSON
virtual nlohmann::json toJSON() const override
Basic JSON export for Gaudi::Monitoring::Hub support.
Definition: Accumulators.h:1157
Gaudi::Accumulators::AveragingCounter::toBePrinted
bool toBePrinted() const override
hint whether we should print that counter or not.
Definition: Accumulators.h:963
Gaudi::Accumulators::atomicity
atomicity
Defines atomicity of the accumulators.
Definition: Accumulators.h:236
Gaudi::Accumulators::IntegralAccumulator::sum
Arithmetic sum() const
Definition: Accumulators.h:618
Gaudi::Accumulators::Adder< Arithmetic, atomicity::full >::merge
static void merge(InternalType &a, Arithmetic b) noexcept
Definition: Accumulators.h:343
Gaudi::Accumulators::GenericAccumulator::GenericAccumulator
GenericAccumulator(const GenericAccumulator &other)
Definition: Accumulators.h:459
Gaudi::Accumulators::Adder< Arithmetic, atomicity::none >::DefaultValue
static constexpr OutputType DefaultValue()
Definition: Accumulators.h:331
Gaudi::Accumulators::StatCounter
A counter aiming at computing average and sum2 / variance / standard deviation.
Definition: Accumulators.h:1022
Gaudi::Accumulators::construct_empty_t
constant used to disambiguate construction of an empty Accumulator versus the copy constructor.
Definition: Accumulators.h:409
std::ostringstream::str
T str(T... args)
Gaudi::Accumulators::AveragingCounter::print
MsgStream & print(MsgStream &o, bool tableFormat=false) const override
Definition: Accumulators.h:961
Gaudi::Accumulators::BinomialAccumulator::nEntries
unsigned long nEntries() const
Definition: Accumulators.h:671
Gaudi::Accumulators::BinomialCounter::printImpl
stream & printImpl(stream &o, bool tableFormat) const
Definition: Accumulators.h:1074
plotSpeedupsPyRoot.counter
counter
Definition: plotSpeedupsPyRoot.py:175
Gaudi::Accumulators::SigmaCounter::fromJSON
static SigmaCounter fromJSON(const nlohmann::json &j)
Definition: Accumulators.h:1012
Gaudi::Accumulators::SigmaAccumulatorBase::biased_sample_variance
auto biased_sample_variance() const
Definition: Accumulators.h:751
Gaudi::Accumulators::TrueAccumulator::nTrueEntries
unsigned long nTrueEntries() const
Definition: Accumulators.h:644
Gaudi::Accumulators::StatCounter::toJSON
virtual nlohmann::json toJSON() const override
Basic JSON export for Gaudi::Monitoring::Hub support.
Definition: Accumulators.h:1043
Gaudi::Accumulators::PrintableCounter::print
virtual std::ostream & print(std::ostream &, bool tableFormat=false) const =0
prints the counter to a stream
Gaudi::Monitoring::Hub
Central entity in a Gaudi application that manages monitoring objects (i.e.
Definition: MonitoringHub.h:73
Gaudi::Accumulators::FalseTo1::operator()
unsigned int operator()(bool v) const
Definition: Accumulators.h:649
Gaudi::Accumulators::Counter::Counter
Counter(OWNER *o, std::string const &name)
Definition: Accumulators.h:909
Gaudi::Accumulators::atomicity::none
@ none
Gaudi::Accumulators::IntegralAccumulator::operator++
IntegralAccumulator operator++(int)
Definition: Accumulators.h:612
Gaudi::Accumulators::Extremum< Arithmetic, atomicity::full, Compare, Initial >::merge
static void merge(InternalType &a, Arithmetic b) noexcept
Definition: Accumulators.h:383
Gaudi::Accumulators::TrueTo1::operator()
unsigned int operator()(bool v) const
Definition: Accumulators.h:633
Gaudi::Accumulators::MsgCounter::typeString
static const std::string typeString
Definition: Accumulators.h:1127
Gaudi::Accumulators::BinomialCounter::print
MsgStream & print(MsgStream &o, std::string_view tag) const override
Definition: Accumulators.h:1094
Gaudi::Accumulators::SigmaCounter::toBePrinted
bool toBePrinted() const override
hint whether we should print that counter or not.
Definition: Accumulators.h:1002
Gaudi::Accumulators::SumAccumulator::sum
Arithmetic sum() const
Definition: Accumulators.h:594
Gaudi::Accumulators::MsgCounter::fromJSON
static MsgCounter fromJSON(const nlohmann::json &j)
Definition: Accumulators.h:1165
Gaudi::Accumulators::AveragingCounter::fromJSON
static AveragingCounter fromJSON(const nlohmann::json &j)
Definition: Accumulators.h:971
Gaudi::Accumulators::Counter::toBePrinted
bool toBePrinted() const override
hint whether we should print that counter or not.
Definition: Accumulators.h:929
Gaudi::Accumulators::Constant::operator()
constexpr T operator()(U &&) const noexcept
Definition: Accumulators.h:248
Gaudi::Accumulators::accumulate
void accumulate(Counter &counter, const Container &container, Fun f=Identity{})
A helper function for accumulating data from a container into a counter This is internally using buff...
Definition: Accumulators.h:1195
std::numeric_limits
Gaudi::operator+
decltype(auto) operator+(const T &v, const Property< TP, V, H > &p)
implemantation of (value + property)
Definition: Property.h:443
Gaudi::Accumulators::AveragingCounter::typeString
static const std::string typeString
Definition: Accumulators.h:944
Gaudi::Accumulators::operator<<
std::ostream & operator<<(std::ostream &s, const PrintableCounter &counter)
external printout operator to a stream type
Definition: Accumulators.h:865
Gaudi::Accumulators::SigmaCounter::print
MsgStream & print(MsgStream &o, bool tableFormat=false) const override
Definition: Accumulators.h:1001
Gaudi::Accumulators::BufferableCounter::~BufferableCounter
~BufferableCounter()
Definition: Accumulators.h:883
MsgStream.h
Gaudi::Accumulators::Counter::print
std::ostream & print(std::ostream &o, bool tableFormat=false) const override
prints the counter to a stream
Definition: Accumulators.h:925
Gaudi::Accumulators::BinomialAccumulator::binomial_t::nTotal
unsigned long nTotal
Definition: Accumulators.h:695
Gaudi::Accumulators::has_fetch_add_
decltype(std::declval< T & >().fetch_add(0)) has_fetch_add_
type_traits for checking the presence of fetch_add
Definition: Accumulators.h:277
Gaudi::Accumulators::SquareAccumulator::sum2
Arithmetic sum2() const
Definition: Accumulators.h:628
Gaudi::Accumulators::Counter::toJSON
virtual nlohmann::json toJSON() const override
Basic JSON export for Gaudi::Monitoring::Hub support.
Definition: Accumulators.h:930