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{
24 class Event;
25
26 DECLARE_ARGUMENT(MaxDepth, size_t );
27 DECLARE_ARGUMENT(MinEvents, size_t );
28 DECLARE_ARGUMENT(Dim, size_t );
29 DECLARE_ARGUMENT(Functor, std::function<std::vector<real_t>( const Event& )>);
30 DECLARE_ARGUMENT(File, std::string);
31
32 class BinDT
33 {
34 public:
35 class EndNode;
36
37 class INode
38 {
39 public:
40 INode() = default;
41 virtual ~INode() = default;
42 virtual const EndNode* operator()( const double* evt ) const = 0;
43 virtual void serialize( std::ostream& stream ) const = 0;
44 virtual void visit( const std::function<void( INode* )>& visit_function ) = 0;
45 INode* m_parent = {nullptr};
46 };
47 class EndNode : public INode
48 {
49 public:
50 EndNode( const unsigned int& no, const unsigned int& binNumber = 999 );
51 const EndNode* operator()( const double* evt ) const override ;
52 void serialize( std::ostream& stream ) const override;
53 unsigned int voxNumber() const { return m_voxNumber; }
54 unsigned int binNumber() const { return m_binNumber; }
55 void setBinNumber( const unsigned int& binNumber ) { m_binNumber = binNumber; }
56 void visit( const std::function<void(INode*)>& visit_function ) override { visit_function( this ); }
57 friend class BinDT;
58 private:
59 unsigned int m_voxNumber;
60 unsigned int m_binNumber;
61 };
62
63 class Decision : public INode
64 {
65 public:
66 Decision( const unsigned int& index, const double& value, std::shared_ptr<INode> left = nullptr,
67 std::shared_ptr<INode> right = nullptr );
68 const EndNode* operator()( const double* evt ) const override;
69 void serialize( std::ostream& stream ) const override;
70 void setChildren( std::shared_ptr<INode> l, std::shared_ptr<INode> r );
71 void visit( const std::function<void(INode*)>& visit_function ) override;
72
73 friend class BinDT;
74
75 private :
76 std::shared_ptr<INode> m_left;
77 std::shared_ptr<INode> m_right;
78 unsigned int m_index;
79 double m_value;
80 };
81
82 public:
83 template <class... ARGS>
84 BinDT( const ARGS&... args ) : BinDT( ArgumentPack( args... ) )
85 {
86 }
87 template <class... ARGS>
88 BinDT( const std::vector<double*>& addr, const ARGS&... args ) : BinDT( ArgumentPack( args... ) )
89 {
90 m_top = makeNodes( addr );
91 }
92 template <class... ARGS> BinDT( const EventList& events, const ARGS&... args ) : BinDT(ArgumentPack(args...) )
93 {
94 m_top = makeNodes( events.begin(), events.end() );
95 }
96 template <class iterator_type,
97 class... ARGS> BinDT( const iterator_type& begin,
98 const iterator_type& end, const ARGS&... args ) : BinDT(ArgumentPack( args... ) )
99 {
100 m_top = makeNodes(begin, end );
101 }
102 explicit BinDT( const ArgumentPack& args );
103 BinDT( const EventList& events, const ArgumentPack& args );
104 BinDT() = default;
105
106 std::shared_ptr<INode> top() { return m_top; }
107 unsigned int getBinNumber( const Event& evt ) const;
108 unsigned int getBinNumber( const double* evt ) const;
109 unsigned int getBin( const Event& evt ) const;
110 unsigned int getBin( const double* evt ) const;
111 unsigned int size() const;
112 void readFromStream( std::istream& stream );
113 void serialize( std::ofstream& output );
114 void serialize( const std::string& filename );
115 void setQueueOrdering( const std::vector<unsigned>& queueOrdering ){ m_queueOrdering = queueOrdering ; }
116 std::vector<std::shared_ptr<EndNode>>& nodes() { return m_endNodes; }
117 const std::vector<std::shared_ptr<EndNode>>& const_nodes() const { return m_endNodes; }
118 std::vector<std::shared_ptr<EndNode>>::iterator begin() { return m_endNodes.begin(); }
119 std::vector<std::shared_ptr<EndNode>>::iterator end() { return m_endNodes.end(); }
120
121 std::function<std::vector<double>( const Event& )> makeDefaultFunctors();
122 void refreshQueue(const std::vector<double*>&, std::queue<unsigned>&, const unsigned&);
123 template <class iterator_type>
124 std::shared_ptr<INode> makeNodes(const iterator_type& begin, const iterator_type& end)
125 {
126 std::vector<double> data( m_dim * (end-begin) );
127 std::vector<double*> addresses( end-begin );
128 size_t counter = 0;
129 for ( auto evt = begin; evt != end; ++evt )
130 {
131 auto val = m_functors( *evt );
132 for ( unsigned int i = 0; i < m_dim; ++i ) data[m_dim * counter + i] = val[i];
133 addresses[counter] = &( data[m_dim * counter] );
134 counter++;
135 }
136 return makeNodes( addresses );
137 }
138 std::shared_ptr<INode> makeNodes(const std::vector<double*>&, std::queue<unsigned>, const unsigned&);
139 std::shared_ptr<INode> makeNodes(const std::vector<double*>&);
140 std::shared_ptr<INode> makeNodes(const std::vector<double*>&, const std::vector<double*>&);
141 std::shared_ptr<INode> makeNodes(std::vector<double*>, std::vector<double*>, std::queue<unsigned>, const unsigned&);
142 void setFunctor(const std::function<std::vector<double>( const Event& )>& functors) { m_functors = functors; }
143 private:
144 std::shared_ptr<INode> m_top = {nullptr};
145 unsigned m_dim = {0};
146 unsigned m_minEvents = {0};
147 unsigned m_maxDepth = {0};
148 std::vector<unsigned> m_queueOrdering = {};
149 std::vector<std::shared_ptr<EndNode>> m_endNodes = {};
150 std::function<std::vector<double>(const Event&)> m_functors = {};
151 double getBestPost(const std::vector<double*>& source, const std::vector<double*>& target, int index, bool verbose = false );
152 };
153
154} // namespace AmpGen
155#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:73
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:57
void visit(const std::function< void(INode *)> &visit_function) override
Definition BinDT.h:56
unsigned int binNumber() const
Definition BinDT.h:54
unsigned int voxNumber() const
Definition BinDT.h:53
EndNode(const unsigned int &no, const unsigned int &binNumber=999)
void setBinNumber(const unsigned int &binNumber)
Definition BinDT.h:55
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:45
virtual ~INode()=default
void serialize(std::ofstream &output)
std::shared_ptr< INode > makeNodes(std::vector< double * >, std::vector< double * >, std::queue< unsigned >, const unsigned &)
BinDT()=default
std::shared_ptr< INode > makeNodes(const iterator_type &begin, const iterator_type &end)
Definition BinDT.h:124
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:117
std::vector< std::shared_ptr< EndNode > >::iterator begin()
Definition BinDT.h:118
void readFromStream(std::istream &stream)
std::shared_ptr< INode > makeNodes(const std::vector< double * > &, const std::vector< double * > &)
void serialize(const std::string &filename)
std::vector< std::shared_ptr< EndNode > >::iterator end()
Definition BinDT.h:119
unsigned int getBinNumber(const Event &evt) const
void setQueueOrdering(const std::vector< unsigned > &queueOrdering)
Definition BinDT.h:115
BinDT(const EventList &events, const ArgumentPack &args)
std::shared_ptr< INode > top()
Definition BinDT.h:106
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:142
BinDT(const std::vector< double * > &addr, const ARGS &... args)
Definition BinDT.h:88
std::function< std::vector< double >(const Event &)> makeDefaultFunctors()
unsigned int size() const
BinDT(const iterator_type &begin, const iterator_type &end, const ARGS &... args)
Definition BinDT.h:97
BinDT(const ArgumentPack &args)
BinDT(const ARGS &... args)
Definition BinDT.h:84
std::shared_ptr< INode > makeNodes(const std::vector< double * > &)
std::vector< std::shared_ptr< EndNode > > & nodes()
Definition BinDT.h:116
BinDT(const EventList &events, const ARGS &... args)
Definition BinDT.h:92
Encapsulates the final state particles of a single event.
Definition Event.h:18
std::vector< Event >::iterator begin()
Definition EventList.h:61
std::vector< Event >::iterator end()
Definition EventList.h:62