Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches

Detailed Description

View in nbviewer Open in SWAN
Implement a custom action that evaluates a Kahan sum.

This tutorial shows how to implement a Kahan summation custom action.

template <typename T>
class KahanSum final : public ROOT::Detail::RDF::RActionImpl<class KahanSum<T>> {
public:
/// This type is a requirement for every helper.
using Result_t = T;
private:
std::vector<T> fPartialSums;
std::vector<T> fCompensations;
int fNSlots;
std::shared_ptr<T> fResultSum;
void KahanAlgorithm(const T &x, T &sum, T &compensation){
T y = x - compensation;
T t = sum + y;
compensation = (t - sum) - y;
sum = t;
}
public:
KahanSum(KahanSum &&) = default;
KahanSum(const KahanSum &) = delete;
KahanSum(const std::shared_ptr<T> &r) : fResultSum(r)
{
static_assert(std::is_floating_point<T>::value, "Kahan sum makes sense only on floating point numbers");
fPartialSums.resize(fNSlots, 0.);
fCompensations.resize(fNSlots, 0.);
}
std::shared_ptr<Result_t> GetResultPtr() const { return fResultSum; }
void Initialize() {}
void InitTask(TTreeReader *, unsigned int) {}
void Exec(unsigned int slot, T x)
{
}
void Exec(unsigned int slot, const T &vs)
{
for (auto &&v : vs) {
Exec(slot, v);
}
}
void Finalize()
{
T sum(0) ;
for (int i = 0; i < fNSlots; ++i) {
}
}
std::string GetActionName() { return "KahanSum"; }
};
{
// We enable implicit parallelism
auto dd = d.Define("x", "(rdfentry_ %2 == 0) ? 0.00000001 : 100000000.");
auto ptr = std::make_shared<double>();
auto kahanResult = dd.Book<double>(std::move(helper), {"x"});
auto plainResult = dd.Sum<double>({"x"});
std::cout << std::setprecision(24) << "Kahan: " << *kahanResult << " Classical: " << *plainResult << std::endl;
// Outputs: Kahan: 1000000000.00000011920929 Classical: 1000000000
}
#define d(i)
Definition RSha256.hxx:102
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Base class for action helpers, see RInterface::Book() for more information.
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
Definition TTreeReader.h:46
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
CPYCPPYY_EXTERN bool Exec(const std::string &cmd)
Definition API.cxx:455
void EnableImplicitMT(UInt_t numthreads=0)
Enable ROOT's implicit multi-threading for all objects and methods that provide an internal paralleli...
Definition TROOT.cxx:539
Bool_t IsImplicitMTEnabled()
Returns true if the implicit multi-threading in ROOT is enabled.
Definition TROOT.cxx:570
UInt_t GetThreadPoolSize()
Returns the size of ROOT's thread pool.
Definition TROOT.cxx:577
void Initialize(Bool_t useTMVAStyle=kTRUE)
Definition tmvaglob.cxx:176
static uint64_t sum(uint64_t i)
Definition Factory.cxx:2345
Kahan: 1000000000.00000011920929 Classical: 1000000000.00000011920929
Date
July 2018
Authors
Enrico Guiraud, Danilo Piparo (CERN), Massimo Tumolo (Politecnico di Torino)

Definition in file df022_useKahan.C.