我正在尝试使用Python 2.7在mac osx上使用ghmm python模块。我已经设法安装了所有东西,我可以在python环境中导入ghmm,但是当我运行它时会出现错误(来自ghmm'教程')(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中设置断点以进行调试 中止陷阱
当我将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行,格式为
record.message = record.getMessage()
文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py”,第328行,在getMessage中
msg = msg%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行,格式为
record.message = record.getMessage()
文件“/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py”,第328行,在getMessage中
msg = msg%self.args
TypeError:并非在字符串格式化期间转换所有参数
从文件ghmm.py,第949行记录
GHMM ghmm.py:2354 - HMM.viterbi() - 结束
GHMM ghmm.py:1167 - del SequenceSubSet>
所以我怀疑它与Viterbi函数完成后删除Sequences的方式有关,但我不确定这是否意味着我需要修改Python代码,C代码,或者如果我需要以不同的方式编译ghmm和包装器。任何帮助/建议都会受到重视,因为我一直试图让这个图书馆在过去的4天里工作。
答案 0 :(得分: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项目看起来有点死,但希望这很简单,可以帮助任何使用此库的直线任务。