AmpGen 2.1
Loading...
Searching...
No Matches
BinDT.h
Go to the documentation of this file.
1#ifndef AMPGEN_BINDT_H
2#define AMPGEN_BINDT_H
3#include <memory.h>
4#include <stddef.h>
5#include <array>
6#include <fstream>
7#include <functional>
8#include <iomanip>
9#include <iostream>
10#include <map>
11#include <memory>
12#include <queue>
13#include <string>
14#include <utility>
15#include <vector>
16
17#include "AmpGen/ArgumentPack.h"
18#include "AmpGen/MsgService.h"
19#include "AmpGen/Types.h"
20#include "AmpGen/EventList.h"
21
22namespace AmpGen {
23 class Event;
24
25 DECLARE_ARGUMENT(MaxDepth, size_t);
26 DECLARE_ARGUMENT(MinEvents, size_t);
27 DECLARE_ARGUMENT(Dim, size_t);
28 DECLARE_ARGUMENT(Functor, std::function<std::vector<real_t>(const Event &)>);
29 DECLARE_ARGUMENT(File, std::string);
30
31 class BinDT {
32 public:
33 class EndNode;
34
35 class INode {
36 public:
37 INode() = default;
38 virtual ~INode() = default;
39 virtual const EndNode *operator()(const double *evt) const = 0;
40 virtual void serialize(std::ostream &stream) const = 0;
41 virtual void visit(const std::function<void(INode *)> &visit_function) = 0;
42 INode *m_parent = {nullptr};
43 };
44 class EndNode : public INode {
45 public:
46 EndNode(const unsigned int &no, const unsigned int &binNumber = 999);
47 const EndNode *operator()(const double *evt) const override;
48 void serialize(std::ostream &stream) const override;
49 unsigned int voxNumber() const { return m_voxNumber; }
50 unsigned int binNumber() const { return m_binNumber; }
51 void setBinNumber(const unsigned int &binNumber) { m_binNumber = binNumber; }
52 void visit(const std::function<void(INode *)> &visit_function) override { visit_function(this); }
53 friend class BinDT;
54
55 private:
56 unsigned int m_voxNumber;
57 unsigned int m_binNumber;
58 };
59
60 class Decision : public INode {
61 public:
62 Decision(const unsigned int &index, const double &value, std::shared_ptr<INode> left = nullptr, std::shared_ptr<INode> right = nullptr);
63 const EndNode *operator()(const double *evt) const override;
64 void serialize(std::ostream &stream) const override;
65 void setChildren(std::shared_ptr<INode> l, std::shared_ptr<INode> r);
66 void visit(const std::function<void(INode *)> &visit_function) override;
67
68 friend class BinDT;
69
70 private:
71 std::shared_ptr<INode> m_left;
72 std::shared_ptr<INode> m_right;
73 unsigned int m_index;
74 double m_value;
75 };
76
77 public:
78 template <class... ARGS> BinDT(const ARGS &...args) : BinDT(ArgumentPack(args...)) {}
79 template <class... ARGS> BinDT(const std::vector<double *> &addr, const ARGS &...args) : BinDT(ArgumentPack(args...)) { m_top = makeNodes(addr); }
80 template <class... ARGS> BinDT(const EventList &events, const ARGS &...args) : BinDT(ArgumentPack(args...)) {
81 m_top = makeNodes(events.begin(), events.end());
82 }
83 template <class iterator_type, class... ARGS>
84 BinDT(const iterator_type &begin, const iterator_type &end, const ARGS &...args) : BinDT(ArgumentPack(args...)) {
85 m_top = makeNodes(begin, end);
86 }
87 explicit BinDT(const ArgumentPack &args);
88 BinDT(const EventList &events, const ArgumentPack &args);
89 BinDT() = default;
90
91 std::shared_ptr<INode> top() { return m_top; }
92 unsigned int getBinNumber(const Event &evt) const;
93 unsigned int getBinNumber(const double *evt) const;
94 unsigned int getBin(const Event &evt) const;
95 unsigned int getBin(const double *evt) const;
96 unsigned int size() const;
97 void readFromStream(std::istream &stream);
98 void serialize(std::ofstream &output);
99 void serialize(const std::string &filename);
100 void setQueueOrdering(const std::vector<unsigned> &queueOrdering) { m_queueOrdering = queueOrdering; }
101 std::vector<std::shared_ptr<EndNode>> &nodes() { return m_endNodes; }
102 const std::vector<std::shared_ptr<EndNode>> &const_nodes() const { return m_endNodes; }
103 std::vector<std::shared_ptr<EndNode>>::iterator begin() { return m_endNodes.begin(); }
104 std::vector<std::shared_ptr<EndNode>>::iterator end() { return m_endNodes.end(); }
105
106 std::function<std::vector<double>(const Event &)> makeDefaultFunctors();
107 void refreshQueue(const std::vector<double *> &, std::queue<unsigned> &, const unsigned &);
108 template <class iterator_type> std::shared_ptr<INode> makeNodes(const iterator_type &begin, const iterator_type &end) {
109 std::vector<double> data(m_dim * (end - begin));
110 std::vector<double *> addresses(end - begin);
111 size_t counter = 0;
112 for(auto evt = begin; evt != end; ++evt) {
113 auto val = m_functors(*evt);
114 for(unsigned int i = 0; i < m_dim; ++i) data[m_dim * counter + i] = val[i];
115 addresses[counter] = &(data[m_dim * counter]);
116 counter++;
117 }
118 return makeNodes(addresses);
119 }
120 std::shared_ptr<INode> makeNodes(const std::vector<double *> &, std::queue<unsigned>, const unsigned &);
121 std::shared_ptr<INode> makeNodes(const std::vector<double *> &);
122 std::shared_ptr<INode> makeNodes(const std::vector<double *> &, const std::vector<double *> &);
123 std::shared_ptr<INode> makeNodes(std::vector<double *>, std::vector<double *>, std::queue<unsigned>, const unsigned &);
124 void setFunctor(const std::function<std::vector<double>(const Event &)> &functors) { m_functors = functors; }
125
126 private:
127 std::shared_ptr<INode> m_top = {nullptr};
128 unsigned m_dim = {0};
129 unsigned m_minEvents = {0};
130 unsigned m_maxDepth = {0};
131 std::vector<unsigned> m_queueOrdering = {};
132 std::vector<std::shared_ptr<EndNode>> m_endNodes = {};
133 std::function<std::vector<double>(const Event &)> m_functors = {};
134 double getBestPost(const std::vector<double *> &source, const std::vector<double *> &target, int index, bool verbose = false);
135 };
136
137} // namespace AmpGen
138#endif
#define DECLARE_ARGUMENT(X, Y)
Container for a set of arguments Contains a set of arguments packed from a variadic constructor,...
Decision(const unsigned int &index, const double &value, std::shared_ptr< INode > left=nullptr, std::shared_ptr< INode > right=nullptr)
friend class BinDT
Definition BinDT.h:68
void visit(const std::function< void(INode *)> &visit_function) override
const EndNode * operator()(const double *evt) const override
void serialize(std::ostream &stream) const override
void setChildren(std::shared_ptr< INode > l, std::shared_ptr< INode > r)
const EndNode * operator()(const double *evt) const override
void serialize(std::ostream &stream) const override
friend class BinDT
Definition BinDT.h:53
void visit(const std::function< void(INode *)> &visit_function) override
Definition BinDT.h:52
unsigned int binNumber() const
Definition BinDT.h:50
unsigned int voxNumber() const
Definition BinDT.h:49
EndNode(const unsigned int &no, const unsigned int &binNumber=999)
void setBinNumber(const unsigned int &binNumber)
Definition BinDT.h:51
virtual const EndNode * operator()(const double *evt) const =0
virtual void visit(const std::function< void(INode *)> &visit_function)=0
virtual void serialize(std::ostream &stream) const =0
INode * m_parent
Definition BinDT.h:42
virtual ~INode()=default
void serialize(std::ofstream &output)
BinDT(const EventList &events, const ARGS &...args)
Definition BinDT.h:80
std::shared_ptr< INode > makeNodes(std::vector< double * >, std::vector< double * >, std::queue< unsigned >, const unsigned &)
BinDT(const std::vector< double * > &addr, const ARGS &...args)
Definition BinDT.h:79
BinDT()=default
std::shared_ptr< INode > makeNodes(const iterator_type &begin, const iterator_type &end)
Definition BinDT.h:108
void refreshQueue(const std::vector< double * > &, std::queue< unsigned > &, const unsigned &)
unsigned int getBin(const double *evt) const
unsigned int getBinNumber(const double *evt) const
unsigned int getBin(const Event &evt) const
const std::vector< std::shared_ptr< EndNode > > & const_nodes() const
Definition BinDT.h:102
std::vector< std::shared_ptr< EndNode > >::iterator begin()
Definition BinDT.h:103
BinDT(const iterator_type &begin, const iterator_type &end, const ARGS &...args)
Definition BinDT.h:84
void readFromStream(std::istream &stream)
std::shared_ptr< INode > makeNodes(const std::vector< double * > &, const std::vector< double * > &)
BinDT(const ARGS &...args)
Definition BinDT.h:78
void serialize(const std::string &filename)
std::vector< std::shared_ptr< EndNode > >::iterator end()
Definition BinDT.h:104
unsigned int getBinNumber(const Event &evt) const
void setQueueOrdering(const std::vector< unsigned > &queueOrdering)
Definition BinDT.h:100
BinDT(const EventList &events, const ArgumentPack &args)
std::shared_ptr< INode > top()
Definition BinDT.h:91
std::shared_ptr< INode > makeNodes(const std::vector< double * > &, std::queue< unsigned >, const unsigned &)
void setFunctor(const std::function< std::vector< double >(const Event &)> &functors)
Definition BinDT.h:124
std::function< std::vector< double >(const Event &)> makeDefaultFunctors()
unsigned int size() const
BinDT(const ArgumentPack &args)
std::shared_ptr< INode > makeNodes(const std::vector< double * > &)
std::vector< std::shared_ptr< EndNode > > & nodes()
Definition BinDT.h:101
Encapsulates the final state particles of a single event.
Definition Event.h:19
std::vector< Event >::iterator begin()
Definition EventList.h:55
std::vector< Event >::iterator end()
Definition EventList.h:56