summaryrefslogtreecommitdiff
path: root/geom_bottleneck/include/dnn/utils.h
blob: f4ce632f6f99bd067c0aabe0c4773e3b3e0f3238 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#ifndef HERA_BT_DNN_UTILS_H
#define HERA_BT_DNN_UTILS_H

#include <boost/random/uniform_int.hpp>
#include <boost/foreach.hpp>
#include <boost/typeof/typeof.hpp>

namespace hera
{
namespace bt
{
namespace dnn
{

template <typename T, typename... Args>
struct has_coordinates
{
    template <typename C, typename = decltype( std::declval<C>().coordinate(std::declval<Args>()...) )>
    static std::true_type test(int);

    template <typename C>
    static std::false_type test(...);

    static constexpr bool value = decltype(test<T>(0))::value;
};

template<class RandomIt, class UniformRandomNumberGenerator, class SwapFunctor>
void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g, const SwapFunctor& swap)
{
    size_t n = last - first;
    boost::uniform_int<size_t> uniform(0,n);
    for (size_t i = n-1; i > 0; --i)
        swap(first[i], first[uniform(g,i+1)]);      // picks a random number in [0,i] range
}

template<class RandomIt, class UniformRandomNumberGenerator>
void random_shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator& g)
{
    typedef     decltype(*first)            T;
    random_shuffle(first, last, g, [](T& x, T& y) { std::swap(x,y); });
}

} // dnn
} // bt
} // hera

#endif