haskell types automatic-differentiation

haskell - Numeric.AD y problema de tipeo



types automatic-differentiation (2)

Cuando GHC no puede deducir una firma de igualdad de tipo para una función válida, como en su caso, la solución es darle a la función una firma de tipo. No conozco la interfaz de esta biblioteca. Sin embargo, creo que la firma correcta es calcGrad1 :: (Num a, Floating a) => Expr a -> [Expr a] .

Estoy intentando trabajar con Numeric.AD y un tipo de Expr personalizado. Deseo calcular el gradiente simbólico de la expresión ingresada por el usuario. La primera prueba con una expresión constante funciona muy bien:

calcGrad0 :: [Expr Double] calcGrad0 = grad df vars where df [x,y] = eval (env [x,y]) (EVar "x"*EVar "y") env vs = zip varNames vs varNames = ["x","y"] vars = map EVar varNames

Esto funciona:

>calcGrad0 [Const 0.0 :+ (Const 0.0 :+ (EVar "y" :* Const 1.0)),Const 0.0 :+ (Const 0.0 :+ (EVar "x" :* Const 1.0))]

Sin embargo, si retiro la expresión como un parámetro:

calcGrad1 :: [Expr Double] calcGrad1 = calcGrad1'' (EVar "x"*EVar "y") calcGrad1'' e = grad df vars where df [x,y] = eval (env [x,y]) e env vs = zip varNames vs varNames = ["x","y"] vars = map EVar varNames

yo obtengo

Could not deduce (a ~ AD s (Expr a1)) from the context (Num a1, Floating a) bound by the inferred type of calcGrad1'' :: (Num a1, Floating a) => Expr a -> [Expr a1] at Symbolics.hs:(60,1)-(65,29) or from (Mode s) bound by a type expected by the context: Mode s => [AD s (Expr a1)] -> AD s (Expr a1) at Symbolics.hs:60:16-27 `a'' is a rigid type variable bound by the inferred type of calcGrad1'' :: (Num a1, Floating a) => Expr a -> [Expr a1] at Symbolics.hs:60:1 Expected type: [AD s (Expr a1)] -> AD s (Expr a1) Actual type: [a] -> a In the first argument of `grad'', namely `df'' In the expression: grad df vars

¿Cómo hago para que ghc acepte esto?


Supongo que te estás olvidando de aplicar el ascensor para convertir un Expr un Expr AD s Expr .

Si está interesado en usar el paquete de anuncios para la diferenciación simbólica. El paquete rastreado de Lennart Augustsson funciona bien.