17

確率の負の対数で多くの作業を行う数値アプリケーションがあります。これは (確率の範囲が 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なければならないかを知る必要があり、それらを読み書きする方法を推測します (しかし、それらはDoubles によく似ています)。

それで、私は何をしますか?ありがとう!

4

1 に答える 1

15

Unbox型クラスにはメソッドがありません。これは、 および 型クラスの省略形VectorですMVector。それらを派生させると、Unboxクラスは無料になります (派生を介して、またはinstance U.Unbox Scoreどこかに独自の行に書き込むだけで)。

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Vector.Generic.Base
import Data.Vector.Generic.Mutable
import qualified Data.Vector.Unboxed as U
newtype Score = Score Double deriving (Vector U.Vector, MVector U.MVector, U.Unbox)
于 2012-06-02T23:29:41.963 に答える