2014-03-27 5 views
46

Gibt es eine Haskell-Bibliothek für die automatische Unterscheidung, die mit ungepackten Vektoren funktioniert? Die -Funktion von Numeric.AD erfordert eine Instanz von Traversable, die Data.Vector.Unboxed nicht ist.Automatische Differenzierung mit ungepflasterten Vektoren

+7

'grad' benötigt nicht so viele Änderungen, um es für ungepackte Vektoren zu verwenden. Sie müssen 'bind' und' unbind' von 'Numeric.AD.Internal.Var' reimplementieren. Der Typ "Variable" wird nicht deaktiviert, aber Sie können ihn durch ein Tupel ersetzen. (Ich kann es jetzt nicht ausprobieren, weil 'ad' nicht auf GHC 7.8 basiert) –

+0

@SjoerdVisscher Ich denke, dass dein Kommentar als eine gute Antwort auf diese Frage genügen würde? – sclv

Antwort

1

Ich weiß nicht, warum Vektoren von Paaren als Vektorenpaare gespeichert werden, aber Sie können einfach Instanzen für Ihren Datentyp schreiben, um die Elemente der Reihe nach zu speichern.

An dieser Stelle verursacht die letzte Zeile einen Fehler, da es keine Instanzen für die Vektorarten für Point3D gibt. Sie können wie folgt geschrieben werden:

instance M.MVector MVector Point3D where 
    basicLength (MV_Point3D v) = M.basicLength v `div` 3 
    basicUnsafeSlice a b (MV_Point3D v) = MV_Point3D $ M.basicUnsafeSlice (a*3) (b*3) v 
    basicOverlaps (MV_Point3D v0) (MV_Point3D v1) = M.basicOverlaps v0 v1 
    basicUnsafeNew n = liftM MV_Point3D (M.basicUnsafeNew (3*n)) 
    basicUnsafeRead (MV_Point3D v) n = do 
    [a,b,c] <- mapM (M.basicUnsafeRead v) [3*n,3*n+1,3*n+2] 
    return $ Point3D a b c 
    basicUnsafeWrite (MV_Point3D v) n (Point3D a b c) = zipWithM_ (M.basicUnsafeWrite v) [3*n,3*n+1,3*n+2] [a,b,c] 

instance G.Vector Vector Point3D where 
    basicUnsafeFreeze (MV_Point3D v) = liftM V_Point3D (G.basicUnsafeFreeze v) 
    basicUnsafeThaw (V_Point3D v) = liftM MV_Point3D (G.basicUnsafeThaw v) 
    basicLength (V_Point3D v) = G.basicLength v `div` 3 
    basicUnsafeSlice a b (V_Point3D v) = V_Point3D $ G.basicUnsafeSlice (a*3) (b*3) v 
    basicUnsafeIndexM (V_Point3D v) n = do 
    [a,b,c] <- mapM (G.basicUnsafeIndexM v) [3*n,3*n+1,3*n+2] 
    return $ Point3D a b c 

Ich denke, dass die meisten der Funktionsdefinitionen selbsterklärend sind. Der Vektor von Punkten wird als ein Vektor von Ints gespeichert, und der n-te Punkt ist der 3n, 3n + 1, 3n + 2-Inten.

+0

a b gibt einen Vektor zurück, der am ath-Element beginnt und am bth-Element endet. Der Anfang des n-ten Elements ist 3 * n; das Ende ist 3 * n + 2. 2) Sie verwenden diese Funktionen nie, aber sie werden verwendet, um alle anderen Funktionen auf nicht eingebetteten Vektoren zu definieren. Dies sind also alle Funktionen, die Sie definieren müssen, um beliebige Funktionen für nicht eingebettete Vektoren zu verwenden. 3) Ihr "Point" -Typ sollte n Elemente desselben Typs enthalten. Dies würde mit Daten arbeiten Point3D a = P3d {- # UNPACK # -}! A {- # UNPACK # -}! A {- # UNPACK # -}! A und newtype Instanz MVector s (Point3D a) = MV_Point3D (MVector sa) –

+0

https://software.intel.com/de-de/articles/memory-layout-transformations – Mehrdad