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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
/* cMarkovModelmodule.c
* jchang
* Created: 1/13/01
* Last modified: 11/26/02
*
* This optimizes some of the functions in MarkovModel.py.
*/
#include "Python.h"
#include "csupport.h"
/* Functions in this module. */
static char cMarkovModel__logadd__doc__[] =
"_logadd(logx, logy) -> log(x+y)\n";
static PyObject *cMarkovModel__logadd(PyObject *self, PyObject *args)
{
PyObject *py_logx, *py_logy;
double logx, logy, minxy;
double sum;
if(!PyArg_ParseTuple(args, "OO", &py_logx, &py_logy))
return NULL;
logx = PyNumber_AsDouble(py_logx);
logy = PyNumber_AsDouble(py_logy);
if(PyErr_Occurred())
return NULL;
if(logy-logx > 100.0) {
Py_INCREF(py_logy);
return py_logy;
} else if (logx-logy > 100.0) {
Py_INCREF(py_logx);
return py_logx;
}
minxy = (logx < logy) ? logx : logy;
sum = minxy + log(exp(logx-minxy) + exp(logy-minxy));
return PyFloat_FromDouble(sum);
}
/* Module definition stuff */
static PyMethodDef CMarkovModelMethods[] = {
{"_logadd", cMarkovModel__logadd, METH_VARARGS, cMarkovModel__logadd__doc__},
{NULL, NULL}
};
static char cMarkovModel__doc__[] =
"This module provides optimized replacement functions for MarkovModel.\n\
";
void initcMarkovModel()
{
(void) Py_InitModule3("cMarkovModel", CMarkovModelMethods,
cMarkovModel__doc__);
}
|