diff --git a/optimization.cabal b/optimization.cabal
--- a/optimization.cabal
+++ b/optimization.cabal
@@ -1,6 +1,6 @@
 name:          optimization
 category:      Math
-version:       0.1.4
+version:       0.1.5
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
@@ -51,7 +51,7 @@
   build-depends:
     base                >= 4.4          && < 5,
     vector              >= 0.10         && < 1.0,
-    ad                  >= 3.4          && < 4.0,
+    ad                  >= 3.4          && < 4.3,
     linear              >= 1.0          && < 2.0,
     semigroupoids       >= 3.0          && < 5.0,
     distributive        >= 0.3          && < 0.5
diff --git a/src/Optimization/Constrained/Penalty.hs b/src/Optimization/Constrained/Penalty.hs
--- a/src/Optimization/Constrained/Penalty.hs
+++ b/src/Optimization/Constrained/Penalty.hs
@@ -17,7 +17,7 @@
   , lagrangian
   ) where
 
-import           Numeric.AD.Types
+import           Numeric.AD
 
 import qualified Data.Vector as V
 
@@ -50,7 +50,7 @@
 
 -- | Minimize the given constrained optimization problem
 -- This is a basic penalty method approach
-minimize :: (Functor f, Num a, Ord a, g ~ V)
+minimize :: (Functor f, RealFrac a, Ord a, g ~ V)
          => (FU f a -> f a -> [f a])   -- ^ Primal minimizer
          -> Opt f a                    -- ^ The optimization problem of interest
          -> a                          -- ^ The penalty increase factor
@@ -59,12 +59,12 @@
          -> [f a]                      -- ^ Optimizing iterates
 minimize minX opt alpha = go
   where go x0 l0 = let l1 = fmap (*alpha) l0
-                       x1 = head $ drop 100 $ minX (FU $ \x -> augLagrangian opt x (fmap auto l1)) x0
+                       x1 = head $ drop 100 $ minX (FU $ \x -> augLagrangian opt x (fmap realToFrac l1)) x0
                    in x1 : go x1 l1
 {-# INLINEABLE minimize #-}
 
 -- | Maximize the given constrained optimization problem
-maximize :: (Functor f, Num a, Ord a, g ~ V)
+maximize :: (Functor f, RealFrac a, Ord a, g ~ V)
          => (FU f a -> f a -> [f a])   -- ^ Primal minimizer
          -> Opt f a                    -- ^ The optimization problem of interest
          -> a                          -- ^ The penalty increase factor
diff --git a/src/Optimization/LineSearch.hs b/src/Optimization/LineSearch.hs
--- a/src/Optimization/LineSearch.hs
+++ b/src/Optimization/LineSearch.hs
@@ -36,6 +36,7 @@
 
 import Prelude hiding (pred)
 import Linear
+import Debug.Trace
 
 -- | A line search method @search df p x@ determines a step size
 -- in direction @p@ from point @x@ for function @f@ with gradient @df@
@@ -63,7 +64,7 @@
 {-# INLINE armijo #-}
 
 -- | Curvature condition
-curvature :: (Num a, Ord a, Additive f, Metric f)
+curvature :: (Num a, Ord a, Additive f, Metric f, Show a, Show (f a))
           => a             -- ^ curvature condition strength c2
           -> (f a -> f a)  -- ^ gradient of function
           -> f a           -- ^ point to evaluate at
@@ -71,6 +72,7 @@
           -> a             -- ^ search step size
           -> Bool          -- ^ is curvature condition satisfied
 curvature c2 df x p a =
+    traceShow (df (x ^+^ a *^ p) `dot` p, c2 * (df x `dot` p), p) $
     df (x ^+^ a *^ p) `dot` p >= c2 * (df x `dot` p)
 {-# INLINE curvature #-}
 
@@ -115,7 +117,7 @@
 -- @wolfeSearch gamma alpha c1@ starts with the given step size @alpha@
 -- and reduces it by a factor of @gamma@ until both the Armijo and
 -- curvature conditions is satisfied.
-wolfeSearch :: (Num a, Ord a, Metric f)
+wolfeSearch :: (Show a, Num a, Ord a, Metric f, Show (f a))
              => a                   -- ^ step size reduction factor gamma
              -> a                   -- ^ initial step size alpha
              -> a                   -- ^ Armijo condition strength c1
@@ -124,7 +126,8 @@
              -> LineSearch f a
 wolfeSearch gamma alpha c1 c2 f df p x =
     backtrackingSearch gamma alpha wolfe df p x
-  where wolfe a = armijo c1 f df p x a && curvature c2 df x p a
+  where wolfe a = traceShow (a, armijo c1 f df p x a, curvature c2 df x p a)
+                $ armijo c1 f df p x a && curvature c2 df x p a
 {-# INLINEABLE wolfeSearch #-}
 
 -- | Line search by Newton's method
