確率の負の対数で多くの作業を行う数値アプリケーションがあります。これは (確率の範囲が 0 から 1 であるため) 正の double または負の無限大 (基になる確率がゼロの場合) の値を取ります。
次のように、これらを newtype で使用してScore
います。
newtype Score = Score Double
deriving (Eq, Ord)
-- ^ A "score" is the negated logarithm of a probability
negLogZero :: Score -- ^ Stands in for - log 0
negLogZero = Score 10e1024
negLogOne :: Score -- ^ - log 1
negLogOne = Score 0.0
unScore :: Score -> Double
unScore (Score x) = x
instance Show Score where
show (Score x) = show x
さて、ビタビ アルゴリズムの実装で、私はData.Vector
多くの を使用してきました。実際、いくつかData.Vector
の がありScore
ます。パフォーマンスの調整を試みているときに、 を使用してみることにしData.Vector.Unboxed
ました。ただし、Unbox
派生できない のインスタンスを作成する必要があり、何をする必要があるか (特に、型クラスのUnbox
コントラクトは何か) がよくわかりません。Score
は実際にはいくつかの便利なコンストラクターとセマンティクスを備えているためDouble
、これは可能であると思います。私が知る限り、s のData.Vector.Unboxed
ベクトルの各スロットがどれくらいの大きさでScore
なければならないかを知る必要があり、それらを読み書きする方法を推測します (しかし、それらはDouble
s によく似ています)。
それで、私は何をしますか?ありがとう!