2012-06-02 13 views
17

Negatif olasılık kütükleri ile çok fazla çalışma yapan sayısal bir uygulamam var (olasılıklar sıfırdan bire kadar değiştiği için), pozitif ikililerin veya negatif sonsuzluğun değerlerini alır (altta yatan olasılık sıfır ise).Haskell'de Data.Vector.Unboxed örneğini nasıl yazarım?

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 

Şimdi, bir sürü Data.Vector kullanıyorum Viterbi algoritmasının bir uygulamasında, ve gerçekten ben bazı Data.Vector s var:

şöyle bir newtype Score bu kullanıyorum Score s. Bazı performans ayarlaması yapmaya çalışırken, Data.Vector.Unboxed kullanmayı denemeye karar verdim. Ancak, türetilemeyen Unbox için bir örnek yazmam gerekiyor ve ne yapmam gerektiğini tam olarak anlayamıyorum (özellikle, Unbox tipinde bir yazım için sözleşme nedir). Score, bazı yararlı kurucular ve semantiklerle gerçekten bir Double olduğundan, bu mümkün olmalıydı. Anlayabildiğim kadarıyla, Data.Vector.Unboxed 'a Score s' nin bir vektöründeki her bir yuvanın ne kadar büyük olması gerektiğini anlayabilmem gerekiyor ve bunları nasıl okuyacağımı ve yazacağımı tahmin ediyorum (ama heck, çok fazla Double s gibi) .

Peki, ne yapıyorum? Teşekkürler!

cevap

15

Unbox tipi sınıf herhangi bir yönteme sahip değildir - yalnızca Vector ve MVector tür sınıfları için kısaltılmıştır. Bunları türetin ve Unbox sınıfı ücretsiz olarak gelir (ya türetme yoluyla ya da sadece kendi satırında instance U.Unbox Score yazarak).

{-# 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) 
+0

Awesome, thanks! –

+2

Artık, "Data.Vector.Primitive.Vector Double" öğesinden "Data.Vector.Primitive.Vector Double" ve "U.Vector" 'a kadar "U.Vector Score" değerinden "Hata" verilemedi. Puan 'farklı tiplerdir. 'U.Vector Double -> Int' türünden 'U.Vector Score -> Int' mümkün olan yöntemden 'Data.Vector.Generic.Base.basicLength' yönteminin zorlanmasından kaynaklanan olası çözüm: bağımsız bir 'türetme örneği' kullanın bildirimi, örnek bağlamı kendiniz belirtebilirsiniz. (Vector U.Vector Score) örneğini türetirken, – unhammer

+1

https://ghc.haskell.org/trac/ghc/ticket/9112, göremiyorum bir çözümden bahsettiler. – unhammer