2012-08-28 5 views
2

저는 Mac OS X에서 ghmm python 모듈을 Python 2.7과 함께 사용하려고합니다. 나는 모든 설치 얻을 관리했습니다, 나는 파이썬 환경에서 ghmm 가져올 수 있습니다,하지만 난이 프로그램을 실행할 때 오류가합니다 (ghmm '튜토리얼'에서) (UnfairCasino 여기 http://ghmm.sourceforge.net/UnfairCasino.py을 찾을 수 있습니다)이 있습니다 :GHMM - NULL 포인터에 m_free를 시도했습니다.

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): Attempted m_free on NULL pointer. Bad program, BAD! No cookie for you. python(52313,0x7fff70940cc0) malloc: * error for object 0x74706d6574744120: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug Abort trap

을 난에 "DEBUG"밖으로 로그 인쇄를 ghmm.py 로거를 설정할 때 다음 직전 :

GHMM ghmm.py:2333 - HMM.viterbi() -- begin

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

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

Traceback (most recent call last):

File "/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py", line 842, in emit

msg = self.format(record)

File "/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py", line 719, in format

return fmt.format(record)

File "/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py", line 464, in format

record.message = record.getMessage()

File "/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py", line 328, in getMessage

msg = msg % self.args

TypeError: not all arguments converted during string formatting

Logged from file ghmm.py, line 1159

Traceback (most recent call last):

File "/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py", line 842, in emit

msg = self.format(record)

File "/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py", line 719, in format

return fmt.format(record)

File "/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py", line 464, in format

record.message = record.getMessage()

File "/Library/Frameworks/EPD64.framework/Versions/7.1/lib/python2.7/logging/init.py", line 328, in getMessage

msg = msg % self.args

TypeError: not all arguments converted during string formatting

Logged from file ghmm.py, line 949

GHMM ghmm.py:2354 - HMM.viterbi() -- end

GHMM ghmm.py:1167 - del SequenceSubSet >

그래서 나는 그것을 가지고 의심 Viterbi 함수가 완료되면 시퀀스가 ​​삭제되지만, 파이썬 코드, C 코드를 수정해야하는지, 아니면 ghmm과 래퍼를 다르게 컴파일해야하는지 잘 모르겠습니다. 지난 4 일간이 라이브러리를 사용하려고 할 때 어떤 도움이나 제안이라도 대단히 감사하겠습니다.

답변

3

이 질문의 나이를 감안할 때 아마도 다른 것으로 옮겼을 것입니다. 그러나 이것은 제가 발견 한 유일한 결과 인 것으로 보입니다. 문제는 파이썬 함수 'EmissionSequence :: asSequenceSet'이 실행되는 방식에 이상이 있기 때문에 double-free가 발생하고 있다는 것입니다. 나는 알고

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에 도달 할 것으로 보인다 때문에 아마 일부 붉은 깃발을 제기해야한다 (하지 않는 것이 - 당신은 (863 라인을 ~ 845) ghmm.py 구현 방법을 보면 확실히, 나는 그것으로 멀리 보지 않았다). 이 기능보다 조금 보면

어쨌든, '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'의 몸을 교체하는 경우 :/재 구축 ghmm 모듈을 다시 설치

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

을 그리고, 코드는 충돌없이 작동합니다, 당신은 할 수 있어야한다 너의 명랑한 길로 가라. ghmm 프로젝트가 약간 죽어 보이기 때문에 이것이 수정으로 제출 될지 확신 할 수 없지만,이 라이브러리를 사용하여 긴장된 스트레이트에서 누군가를 도울 수있을만큼 간단합니다.

+0

작동합니다! 결과가 정확한지 확실하지 않은 ... 그러나 그것은 깨달았습니다! – Alexander