37 DemoFloat16() =
default;
38 void Set(
float ref) { fF32 = fF16 = fI16 = fI14 = fI10 = fI8 = fI6 = fI4 = fR8 = fR6 = fR4 = fR2 = ref; }
43 const auto nEntries = 200000;
44 const auto xmax = TMath::Pi();
45 const auto xmin = -xmax;
48 TFile::Open(
"DemoFloat16.root",
"recreate");
49 TTree tree(
"tree",
"DemoFloat16");
50 DemoFloat16 demoInstance;
51 auto demoInstanceBranch = tree.Branch(
"d",
"DemoFloat16", &demoInstance, 4000);
53 for (
auto i : ROOT::TSeqI(nEntries)) {
54 demoInstance.Set(r.Uniform(xmin, xmax));
62 auto branches = demoInstanceBranch->GetListOfBranches();
63 const auto nb = branches->GetEntries();
64 auto br =
static_cast<TBranch *
>(branches->At(0));
65 const Long64_t zip64 = br->GetZipBytes();
67 auto h =
new TH1F(
"h",
"Float16_t compression and precision", nb, 0, nb);
71 auto gcx =
new TGraph();
73 gcx->SetMarkerStyle(kFullSquare);
74 gcx->SetMarkerColor(kBlue);
76 auto gdrange =
new TGraph();
77 gdrange->SetName(
"gdrange");
78 gdrange->SetMarkerStyle(kFullCircle);
79 gdrange->SetMarkerColor(kRed);
81 auto gdval =
new TGraph();
82 gdval->SetName(
"gdval");
83 gdval->SetMarkerStyle(kFullTriangleUp);
84 gdval->SetMarkerColor(kBlack);
87 for (
auto i : ROOT::TSeqI(nb)) {
88 br =
static_cast<TBranch *
>(branches->At(i));
89 const auto brName = br->GetName();
90 h->GetXaxis()->SetBinLabel(i + 1, brName);
91 auto const cx = double(zip64) / br->GetZipBytes();
92 gcx->SetPoint(i, i + 0.5, cx);
95 tree.Draw(Form(
"(fF32-%s)/(%g)", brName, xmax - xmin),
"",
"goff");
96 const auto rmsDrange = TMath::RMS(nEntries, tree.GetV1());
97 const auto drange = TMath::Max(0., -TMath::Log10(rmsDrange));
98 gdrange->SetPoint(i - 1, i + 0.5, drange);
100 tree.Draw(Form(
"(fF32-%s)/fF32 >> hdval_%s", brName, brName),
"",
"goff");
101 const auto rmsDval = TMath::RMS(nEntries, tree.GetV1());
102 const auto dval = TMath::Max(0., -TMath::Log10(rmsDval));
103 gdval->SetPoint(i - 1, i + 0.5, dval);
105 tree.Draw(Form(
"(fF32-%s) >> hdvalabs_%s", brName, brName),
"",
"goff");
106 auto hdval = gDirectory->Get<TH1F>(Form(
"hdvalabs_%s", brName));
107 hdval->GetXaxis()->SetTitle(
"Difference wrt reference value");
108 auto c =
new TCanvas(brName, brName, 800, 600);
114 auto c1 =
new TCanvas(
"c1",
"c1", 800, 600);
118 h->GetXaxis()->LabelsOption(
"v");
124 auto legend =
new TLegend(0.3, 0.6, 0.9, 0.9);
125 legend->SetHeader(Form(
"%d entries within the [-#pi, #pi] range", nEntries));
126 legend->AddEntry(gcx,
"Compression factor",
"lp");
127 legend->AddEntry(gdrange,
"Log of precision wrt range: p = -Log_{10}( RMS( #frac{Ref - x}{range} ) ) ",
"lp");
128 legend->AddEntry(gdval,
"Log of precision wrt value: p = -Log_{10}( RMS( #frac{Ref - x}{Ref} ) ) ",
"lp");