Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-04 04:04:14

0001 #include "CondFormats/GBRForest/interface/GBRTree.h"
0002 
0003 namespace {
0004 
0005   struct MyTree : public GBRTree {
0006     MyTree() {
0007       fCutIndices.resize(1, 0);
0008       fCutVals.resize(1, 0);
0009       fLeftIndices.resize(1, 0);
0010       fRightIndices.resize(1, -1);
0011       fResponses.resize(2);
0012       fResponses[0] = 1;
0013       fResponses[1] = 2;
0014     }
0015 
0016     double GetResponseNew(const float *vector) const {
0017       int index = 0;
0018       do {
0019         auto r = fRightIndices[index];
0020         auto l = fLeftIndices[index];
0021         // the code below is equivalent to the original
0022         // index = (vector[fCutIndices[index]] > fCutVals[index]) ? r : l;
0023         // gnenerates non branching code  and it's at least 30% faster
0024         // see https://godbolt.org/z/xT5dY9Th1   (yes in gcc13 is changed... but in the trunk is back as it was in gcc12)
0025         unsigned int x = vector[fCutIndices[index]] > fCutVals[index] ? ~0 : 0;
0026         index = (x & r) | ((~x) & l);
0027       } while (index > 0);
0028       return fResponses[-index];
0029     }
0030 
0031     double GetResponseOld(const float *vector) const {
0032       int index = 0;
0033       do {
0034         auto r = fRightIndices[index];
0035         auto l = fLeftIndices[index];
0036         index = (vector[fCutIndices[index]] > fCutVals[index]) ? r : l;
0037       } while (index > 0);
0038       return fResponses[-index];
0039     }
0040   };
0041 
0042 }  // namespace
0043 
0044 #include <iostream>
0045 
0046 int main() {
0047   MyTree aTree;
0048 
0049   float val[1];
0050   double ret;
0051 
0052   val[0] = -1;
0053   std::cout << "val " << val[0] << std::endl;
0054   ret = aTree.GetResponse(val);
0055   std::cout << "def " << ret << std::endl;
0056   ret = aTree.GetResponseOld(val);
0057   std::cout << "old " << ret << std::endl;
0058   ret = aTree.GetResponseOld(val);
0059   std::cout << "new " << ret << std::endl;
0060 
0061   val[0] = 1;
0062   std::cout << "val " << val[0] << std::endl;
0063   ret = aTree.GetResponse(val);
0064   std::cout << "def " << ret << std::endl;
0065   ret = aTree.GetResponseOld(val);
0066   std::cout << "old " << ret << std::endl;
0067   ret = aTree.GetResponseOld(val);
0068   std::cout << "new " << ret << std::endl;
0069 
0070   return 0;
0071 }