2

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 関数が完了するとシーケンスが削除される方法と関係があると思われますが、これが 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 に答える