Caffe
rng.hpp
1 #ifndef CAFFE_RNG_CPP_HPP_
2 #define CAFFE_RNG_CPP_HPP_
3 
4 #include <algorithm>
5 #include <iterator>
6 
7 #include "boost/random/mersenne_twister.hpp"
8 #include "boost/random/uniform_int.hpp"
9 
10 #include "caffe/common.hpp"
11 
12 namespace caffe {
13 
14 typedef boost::mt19937 rng_t;
15 
16 inline rng_t* caffe_rng() {
17  return static_cast<caffe::rng_t*>(Caffe::rng_stream().generator());
18 }
19 
20 // Fisher–Yates algorithm
21 template <class RandomAccessIterator, class RandomGenerator>
22 inline void shuffle(RandomAccessIterator begin, RandomAccessIterator end,
23  RandomGenerator* gen) {
24  typedef typename std::iterator_traits<RandomAccessIterator>::difference_type
25  difference_type;
26  typedef typename boost::uniform_int<difference_type> dist_type;
27 
28  difference_type length = std::distance(begin, end);
29  if (length <= 0) return;
30 
31  for (difference_type i = length - 1; i > 0; --i) {
32  dist_type dist(0, i);
33  std::iter_swap(begin + i, begin + dist(*gen));
34  }
35 }
36 
37 template <class RandomAccessIterator>
38 inline void shuffle(RandomAccessIterator begin, RandomAccessIterator end) {
39  shuffle(begin, end, caffe_rng());
40 }
41 } // namespace caffe
42 
43 #endif // CAFFE_RNG_HPP_
A layer factory that allows one to register layers. During runtime, registered layers can be called b...
Definition: blob.hpp:14