summaryrefslogtreecommitdiff
path: root/gi/pyp-topics/src/log_add.h
blob: e0620c5a5fb094e4c5e047582f63177f810c63fb (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
#ifndef log_add_hh
#define log_add_hh

#include <limits>
#include <iostream>
#include <cassert>
#include <cmath>

template <typename T>
struct Log
{
    static T zero() { return -std::numeric_limits<T>::infinity(); } 

    static T add(T l1, T l2)
    {
        if (l1 == zero()) return l2;
        if (l1 > l2) 
            return l1 + std::log(1 + exp(l2 - l1));
        else
            return l2 + std::log(1 + exp(l1 - l2));
    }

    static T subtract(T l1, T l2)
    {
        //std::assert(l1 >= l2);
        return l1 + log(1 - exp(l2 - l1));
    }
};

#endif