2

我正在尝试在带有 Python 2.7 的 mac osx 上使用 ghmm python 模块。我已经成功安装了所有东西,我可以在 python 环境中导入 ghmm,但是当我运行它时出现错误(来自 ghmm 'tutorial')(UnfairCasino 可以在这里找到http://ghmm.sourceforge.net /UnfairCasino.py):

from ghmm import *
from UnfairCasino import test_seq
sigma = IntegerRange(1,7)
A = [[0.9, 0.1], [0.3, 0.7]]
efair = [1.0 / 6] * 6
eloaded = [3.0 / 13, 3.0 / 13, 2.0 / 13, 2.0 / 13, 2.0 / 13, 1.0 / 13]
B = [efair, eloaded]
pi = [0.5] * 2
m = HMMFromMatrices(sigma, DiscreteDistribution(sigma), A, B, pi)
v = m.viterbi(test_seq)

具体来说,我收到此错误:

GHMM ghmm.py:148 - sequence.c:ghmm_dseq_free(1199):在 NULL 指针上尝试 m_free。糟糕的程序,糟糕!没有饼干给你。python(52313,0x7fff70940cc0) malloc: * 对象 0x74706d6574744120 的错误:未分配被释放的指针 *在 malloc_error_break 中设置断点以调试 Abort 陷阱

当我将 ghmm.py 记录器设置为“DEBUG”时,日志会在之前打印出以下内容:

GHMM ghmm.py:2333 - HMM.viterbi() -- 开始

GHMM ghmm.py:849 - EmissionSequence.asSequenceSet() -- 开始 >

GHMM ghmm.py:862 - EmissionSequence.asSequenceSet() -- 结束 >

回溯(最近一次通话最后):

文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init .py ”,第 842 行,在发出

msg = self.format(记录)

文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init .py ”,第 719 行,格式为

返回 fmt.format(记录)

文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init .py ”,第 464 行,格式

记录.消息 = 记录.getMessage()

文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init .py ”,第 328 行,在 getMessage

味精 = 味精 % self.args

TypeError:字符串格式化期间并非所有参数都转换了

从文件 ghmm.py 第 1159 行记录

回溯(最近一次通话最后):

文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init .py ”,第 842 行,在发出

msg = self.format(记录)

文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init .py ”,第 719 行,格式为

返回 fmt.format(记录)

文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init .py ”,第 464 行,格式

记录.消息 = 记录.getMessage()

文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init .py ”,第 328 行,在 getMessage

味精 = 味精 % self.args

TypeError:字符串格式化期间并非所有参数都转换了

从文件 ghmm.py 第 949 行记录

GHMM ghmm.py:2354 - HMM.viterbi() -- 结束

GHMM ghmm.py:1167 -删除序列子集 >

所以我怀疑这与 Viterbi 函数完成后删除序列的方式有关,但我不确定这是否意味着我需要修改 Python 代码、C 代码,或者我是否需要编译 ghmm 和包装不同。任何帮助/建议将不胜感激,因为我在过去 4 天一直试图让这个库正常工作。

4

1 回答 1

3

考虑到这个问题的年龄,您可能已经转向其他问题,但这似乎是我发现的唯一相关结果。问题在于,由于 python 函数 'EmissionSequence::asSequenceSet' 的执行方式有些怪异,正在发生双重释放。如果您查看 ghmm.py 的实现方式(~第 845 - 863 行)

def asSequenceSet(self):
    """
    @returns this EmissionSequence as a one element SequenceSet
    """
    log.debug("EmissionSequence.asSequenceSet() -- begin " + repr(self.cseq))
    seq = self.sequenceAllocationFunction(1)

    # checking for state labels in the source C sequence struct
    if self.emissionDomain.CDataType == "int" and self.cseq.state_labels is not None:
        log.debug("EmissionSequence.asSequenceSet() -- found labels !")
        seq.calloc_state_labels()
        self.cseq.copyStateLabel(0, seq, 0)

    seq.setLength(0, self.cseq.getLength(0))
    seq.setSequence(0, self.cseq.getSequence(0))
    seq.setWeight(0, self.cseq.getWeight(0))

    log.debug("EmissionSequence.asSequenceSet() -- end " + repr(seq))
    return SequenceSetSubset(self.emissionDomain, seq, self)

这可能会引发一些危险信号,因为它似乎有点深入到 C 中(我不确定,我没有深入研究它)。

不管怎样,如果你稍微看一下这个函数,还有另一个函数叫做“sequenceSet”:

def sequenceSet(self):
    """
    @return a one-element SequenceSet with this sequence.
    """

    # in order to copy the sequence in 'self', we first create an empty SequenceSet and then
    # add 'self'
    seqSet = SequenceSet(self.emissionDomain, [])
    seqSet.cseq.add(self.cseq)
    return seqSet

它似乎具有相同的目的,但实现方式不同。无论如何,如果你在 ghmm.py 中替换 'EmissionSequence::asSequenceSet' 的主体,只需:

def asSequenceSet(self):
"""
@returns this EmissionSequence as a one element SequenceSet
"""
    return self.sequenceSet();

然后重建/重新安装 ghmm 模块,代码将不会崩溃,你应该能够继续你的快乐方式。我不确定这是否可以作为修复提交,因为 ghmm 项目看起来有点死,但希望这足够简单,可以帮助任何使用这个库的人。

于 2012-11-20T00:17:23.057 回答