1 #Region "Microsoft.VisualBasic::9b5bb278e9cc7e9e483c1e377eaae6ea, Microsoft.VisualBasic.Core\Language\Language\Java\LogTricks.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Module LogTricks
35     
36     '         Function: logDiff, (+2 Overloads) logSum, logSumNoCheck
37     
38     '         Sub: logInc
39     
40     
41     ' /********************************************************************************/
42
43 #End Region
44
45 Imports sys = System.Math
46
47 Namespace Language.Java
48
49     '
50     ' * LogTricks.java
51     ' *
52     ' * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
53     ' *
54     ' * This file is part of BEAST.
55     ' * See the NOTICE file distributed with this work for additional
56     ' * information regarding copyright ownership and licensing.
57     ' *
58     ' * BEAST is free software; you can redistribute it and/or modify
59     ' * it under the terms of the GNU Lesser General Public License as
60     ' * published by the Free Software Foundation; either version 2
61     ' * of the License, or (at your option) any later version.
62     ' *
63     ' *  BEAST is distributed in the hope that it will be useful,
64     ' *  but WITHOUT ANY WARRANTY; without even the implied warranty of
65     ' *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
66     ' *  GNU Lesser General Public License for more details.
67     ' *
68     ' * You should have received a copy of the GNU Lesser General Public
69     ' * License along with BEAST; if not, write to the
70     ' * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
71     ' * Boston, MA  02110-1301  USA
72     
73
74     ''' <summary>
75     ''' @author Marc Suchard
76     ''' </summary>
77     Public Module LogTricks
78
79         Public ReadOnly maxFloat As Double = Double.MaxValue '3.40282347E+38;
80         Public ReadOnly logLimit As Double = -maxFloat / 100
81         Public ReadOnly logZero As Double = -maxFloat
82
83         Public Const NATS As Double = 400 '40;
84
85         Public Function logSumNoCheck(x As Double, y As DoubleAs Double
86             Dim temp As Double = y - x
87             If sys.Abs(temp) > NATS Then
88                 Return If(x > y, x, y)
89             Else
90                 Return x + JavaMath.log1p(sys.Exp(temp))
91             End If
92         End Function
93
94         Public Function logSum(x As Double()) As Double
95             Dim sum As Double = x(0)
96             Dim len As Integer = x.Length
97             For i As Integer = 1 To len - 1
98                 sum = logSumNoCheck(sum, x(i))
99             Next i
100             Return sum
101         End Function
102
103         Public Function logSum(x As Double, y As DoubleAs Double
104             Dim temp As Double = y - x
105             If temp > NATS OrElse x < logLimit Then Return y
106             If temp < -NATS OrElse y < logLimit Then Return x
107             If temp < 0 Then Return x + JavaMath.log1p(sys.Exp(temp))
108             Return y + JavaMath.log1p(sys.Exp(-temp))
109         End Function
110
111         Public Sub logInc(x As Double?, y As Double)
112             Dim temp As Double = y - x
113             If temp > NATS OrElse x < logLimit Then
114                 x = y
115             ElseIf temp < -NATS OrElse y < logLimit Then
116
117             Else
118                 x += JavaMath.log1p(sys.Exp(temp))
119             End If
120         End Sub
121
122         Public Function logDiff(x As Double, y As DoubleAs Double
123             Debug.Assert(x > y)
124             Dim temp As Double = y - x
125             If temp < -NATS OrElse y < logLimit Then Return x
126             Return x + JavaMath.log1p(-sys.Exp(temp))
127         End Function
128     End Module
129 End Namespace