thepeg
is hosted by
Hepforge
,
IPPP Durham
ThePEG
2.3.0
Utilities
VSelector.h
1
// -*- C++ -*-
2
//
3
// VSelector.h is a part of ThePEG - Toolkit for HEP Event Generation
4
// Copyright (C) 1999-2019 Leif Lonnblad
5
//
6
// ThePEG is licenced under version 3 of the GPL, see COPYING for details.
7
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
8
//
9
#ifndef ThePEG_VSelector_H
10
#define ThePEG_VSelector_H
11
// This is the definition of the ThePEG::VSelector class.
12
13
#include "
ThePEG/Config/ThePEG.h
"
14
#include <stdexcept>
15
#include <algorithm>
16
#include <stdexcept>
17
18
namespace
ThePEG
{
19
20
template
<
typename
T,
typename
WeightType =
double
>
46
class
VSelector
{
47
48
public
:
49
51
typedef
vector<WeightType>
WeightVector
;
52
54
typedef
typename
WeightVector::const_iterator
WIterator
;
55
57
typedef
vector<T>
ObjectVector
;
58
60
typedef
typename
ObjectVector::iterator
iterator
;
61
63
typedef
typename
ObjectVector::const_iterator
const_iterator
;
64
66
typedef
typename
ObjectVector::size_type
size_type
;
67
68
public
:
69
73
VSelector
(
size_type
reserved = 0) :
theSum
()
74
{
75
reserve
(reserved);
76
}
77
81
void
swap
(
VSelector
& s) {
82
theSums
.swap(s.theSums);
83
theWeights
.swap(s.theWeights);
84
theObjects
.swap(s.theObjects);
85
std::swap
(
theSum
, s.theSum);
86
}
87
94
WeightType
insert
(WeightType d,
const
T & t) {
95
WeightType newSum =
theSum
+ d;
96
if
( newSum <=
theSum
)
return
d;
97
theSums
.push_back(
theSum
= newSum);
98
theWeights
.push_back(d);
99
theObjects
.push_back(t);
100
return
theSum
;
101
}
102
108
WeightType
reweight
(WeightType,
const
T &);
109
116
WeightType
erase
(
const
T &);
117
122
void
replace
(
const
T & told,
const
T & tnew) {
123
for
(
iterator
it =
theObjects
.begin(); it !=
theObjects
.end(); ++it )
124
if
( *it == told ) *it = tnew;
125
}
126
138
T &
select
(
double
rnd,
double
* remainder = 0) {
139
return
theObjects
[
iselect
(rnd, remainder)];
140
}
141
149
T &
operator[]
(
double
rnd) {
150
return
select
(rnd, 0);
151
}
152
164
const
T &
select
(
double
rnd,
double
* remainder = 0)
const
{
165
return
theObjects
[
iselect
(rnd, remainder)];
166
}
167
175
const
T &
operator[]
(
double
rnd)
const
{
176
return
select
(rnd, 0);
177
}
178
191
template
<
typename
RNDGEN>
192
T &
select
(RNDGEN & rnd) {
193
double
rem = 0.0;
194
T & t =
select
(rnd(), &rem);
195
rnd.push_back(rem);
196
return
t;
197
}
198
211
template
<
typename
RNDGEN>
212
const
T &
select
(RNDGEN & rnd)
const
{
213
double
rem = 0.0;
214
const
T & t =
select
(rnd(), &rem);
215
rnd.push_back(rem);
216
return
t;
217
}
218
225
WeightType
sum
()
const
{
return
theSum
; }
226
231
const_iterator
begin
()
const
{
return
theObjects
.begin(); }
232
237
const_iterator
end
()
const
{
return
theObjects
.end(); }
238
242
bool
empty
()
const
{
return
theObjects
.empty(); }
243
247
size_type
size
()
const
{
return
theObjects
.size(); }
248
252
void
reserve
(
size_type
reserved) {
253
theSums
.reserve(reserved);
254
theWeights
.reserve(reserved);
255
theObjects
.reserve(reserved);
256
}
257
261
void
clear
() {
262
theSums
.clear();
263
theWeights
.clear();
264
theObjects
.clear();
265
theSum
= WeightType();
266
}
267
271
template
<
typename
OStream>
272
void
output
(OStream &)
const
;
273
277
template
<
typename
IStream>
278
void
input
(IStream &);
279
280
protected
:
281
285
size_type
iselect
(
double
rnd,
double
* remainder)
const
;
286
287
private
:
288
292
WeightVector
theSums
;
293
297
WeightVector
theWeights
;
298
302
ObjectVector
theObjects
;
303
307
WeightType
theSum
;
308
309
};
310
314
template
<
typename
OStream,
typename
T,
typename
WeightType>
315
inline
OStream &
operator<<
(OStream & os,
316
const
VSelector<T,WeightType>
& s) {
317
s.output(os);
318
return
os;
319
}
320
324
template
<
typename
IStream,
typename
T,
typename
WeightType>
325
inline
IStream &
operator>>
(IStream & is,
326
VSelector<T,WeightType>
& s) {
327
s.input(is);
328
return
is;
329
}
330
331
332
}
333
334
#include "VSelector.tcc"
335
336
#endif
/* ThePEG_VSelector_H */
ThePEG.h
This is the main config header file for ThePEG.
ThePEG::VSelector
VSelector is a templated class for storing objects associated with probabilities in a way such that,...
Definition:
VSelector.h:46
ThePEG::VSelector::theSums
WeightVector theSums
The vector of accumulated weights for the objects in the selector.
Definition:
VSelector.h:292
ThePEG::VSelector::select
T & select(RNDGEN &rnd)
Selct an object randomly.
Definition:
VSelector.h:192
ThePEG::VSelector::iterator
ObjectVector::iterator iterator
The object vector iterator type.
Definition:
VSelector.h:60
ThePEG::VSelector::theSum
WeightType theSum
The sum of all weights.
Definition:
VSelector.h:307
ThePEG::VSelector::input
void input(IStream &)
Input from a stream.
ThePEG::VSelector::select
const T & select(RNDGEN &rnd) const
Selct an object randomly.
Definition:
VSelector.h:212
ThePEG::VSelector::reweight
WeightType reweight(WeightType, const T &)
Reweight an object previously inserted giving it a new weight.
ThePEG::VSelector::erase
WeightType erase(const T &)
Erase an object, previously inserted.
ThePEG::VSelector::select
const T & select(double rnd, double *remainder=0) const
Selct an object randomly.
Definition:
VSelector.h:164
ThePEG::VSelector::WIterator
WeightVector::const_iterator WIterator
The weight vector iterator type.
Definition:
VSelector.h:54
ThePEG::VSelector::operator[]
const T & operator[](double rnd) const
Selct an object randomly.
Definition:
VSelector.h:175
ThePEG::VSelector::end
const_iterator end() const
Access to the end() iterator in the underlying vector of objects.
Definition:
VSelector.h:237
ThePEG::VSelector::ObjectVector
vector< T > ObjectVector
A vector ob objects.
Definition:
VSelector.h:57
ThePEG::VSelector::theWeights
WeightVector theWeights
The vector of weights for the objects in the selector.
Definition:
VSelector.h:297
ThePEG::VSelector::reserve
void reserve(size_type reserved)
Allocate space for a number of objects in the underlying vectors.
Definition:
VSelector.h:252
ThePEG::VSelector::insert
WeightType insert(WeightType d, const T &t)
Insert an object given a probability for this object.
Definition:
VSelector.h:94
ThePEG::VSelector::VSelector
VSelector(size_type reserved=0)
Default constructor.
Definition:
VSelector.h:73
ThePEG::VSelector::size
size_type size() const
Returns the number of objects in the selector.
Definition:
VSelector.h:247
ThePEG::VSelector::sum
WeightType sum() const
Return the sum of probabilities of the objects inserted.
Definition:
VSelector.h:225
ThePEG::VSelector::output
void output(OStream &) const
Output to a stream.
ThePEG::VSelector::begin
const_iterator begin() const
Access to the begin() iterator of the underlying vector of objects.
Definition:
VSelector.h:231
ThePEG::VSelector::replace
void replace(const T &told, const T &tnew)
Replace all occurencies of told with tnew without changing the probability for the entry.
Definition:
VSelector.h:122
ThePEG::VSelector::operator[]
T & operator[](double rnd)
Selct an object randomly.
Definition:
VSelector.h:149
ThePEG::VSelector::empty
bool empty() const
Returns true if the VSelector is empty.
Definition:
VSelector.h:242
ThePEG::VSelector::WeightVector
vector< WeightType > WeightVector
A vector of weights.
Definition:
VSelector.h:51
ThePEG::VSelector::const_iterator
ObjectVector::const_iterator const_iterator
The object vector const iterator type.
Definition:
VSelector.h:63
ThePEG::VSelector::iselect
size_type iselect(double rnd, double *remainder) const
Internal selection engine.
ThePEG::VSelector::theObjects
ObjectVector theObjects
The vector of objects in the selector.
Definition:
VSelector.h:302
ThePEG::VSelector::clear
void clear()
Erases all objects.
Definition:
VSelector.h:261
ThePEG::VSelector::select
T & select(double rnd, double *remainder=0)
Select an object randomly.
Definition:
VSelector.h:138
ThePEG::VSelector::swap
void swap(VSelector &s)
Swap the underlying representation with the argument.
Definition:
VSelector.h:81
ThePEG::VSelector::size_type
ObjectVector::size_type size_type
Size type of the underlying vector.
Definition:
VSelector.h:66
ThePEG
This is the main namespace within which all identifiers in ThePEG are declared.
Definition:
FactoryBase.h:28
ThePEG::operator>>
vector< T > & operator>>(vector< T > &tv, U &u)
Overload the right shift operator for vector to pop objects from a vector.
Definition:
Containers.h:192
ThePEG::operator<<
vector< T > & operator<<(vector< T > &tv, const U &u)
Overload the left shift operator for vector to push_back objects to a vector.
Definition:
Containers.h:179
std::swap
void swap(ThePEG::Pointer::RCPtr< T > &t1, ThePEG::Pointer::RCPtr< T > &t2)
Specialization of std::swap to avoid unnecessary (in/de)crements of the reference count.
Definition:
RCPtr.h:1154
Generated on Thu Jun 20 2024 14:47:02 for ThePEG by
1.9.6