packages feed

linear 1.1.1 → 1.1.2

raw patch · 8 files changed

+141/−3 lines, 8 filesdep ~basedep ~reflectionPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base, reflection

API changes (from Hackage documentation)

- Linear.V: instance Reifies Z Int
- Linear.V: instance Reifies n Int => Reifies (D n) Int
- Linear.V: instance Reifies n Int => Reifies (PD n) Int
- Linear.V: instance Reifies n Int => Reifies (SD n) Int
- Linear.V: instance Reifies s Int => Dim * (ReifiedDim s)
+ Linear.Affine: (.+^) :: (Affine p, Num a) => p a -> Diff p a -> p a
+ Linear.Affine: (.-.) :: (Affine p, Num a) => p a -> p a -> Diff p a
+ Linear.Affine: (.-^) :: (Affine p, Num a) => p a -> Diff p a -> p a
+ Linear.Affine: P :: (f a) -> Point f a
+ Linear.Affine: class Additive (Diff p) => Affine p where type family Diff p :: * -> * p .-^ v = p .+^ negated v
+ Linear.Affine: distanceA :: (Floating a, Foldable (Diff p), Affine p) => p a -> p a -> a
+ Linear.Affine: instance (Eq k, Hashable k) => Affine (HashMap k)
+ Linear.Affine: instance Additive f => Additive (Point f)
+ Linear.Affine: instance Additive f => Affine (Point f)
+ Linear.Affine: instance Affine ((->) b)
+ Linear.Affine: instance Affine Complex
+ Linear.Affine: instance Affine Identity
+ Linear.Affine: instance Affine IntMap
+ Linear.Affine: instance Affine Maybe
+ Linear.Affine: instance Affine Plucker
+ Linear.Affine: instance Affine Quaternion
+ Linear.Affine: instance Affine V0
+ Linear.Affine: instance Affine V2
+ Linear.Affine: instance Affine V3
+ Linear.Affine: instance Affine V4
+ Linear.Affine: instance Affine Vector
+ Linear.Affine: instance Affine ZipList
+ Linear.Affine: instance Affine []
+ Linear.Affine: instance Applicative f => Applicative (Point f)
+ Linear.Affine: instance Apply f => Apply (Point f)
+ Linear.Affine: instance Bind f => Bind (Point f)
+ Linear.Affine: instance Core f => Core (Point f)
+ Linear.Affine: instance Dim * n => Affine (V * n)
+ Linear.Affine: instance Epsilon (f a) => Epsilon (Point f a)
+ Linear.Affine: instance Eq (f a) => Eq (Point f a)
+ Linear.Affine: instance Foldable f => Foldable (Point f)
+ Linear.Affine: instance Fractional (f a) => Fractional (Point f a)
+ Linear.Affine: instance Functor f => Functor (Point f)
+ Linear.Affine: instance Ix (f a) => Ix (Point f a)
+ Linear.Affine: instance Metric f => Metric (Point f)
+ Linear.Affine: instance Monad f => Monad (Point f)
+ Linear.Affine: instance Num (f a) => Num (Point f a)
+ Linear.Affine: instance Ord (f a) => Ord (Point f a)
+ Linear.Affine: instance Ord k => Affine (Map k)
+ Linear.Affine: instance R2 f => R2 (Point f)
+ Linear.Affine: instance R3 f => R3 (Point f)
+ Linear.Affine: instance R4 f => R4 (Point f)
+ Linear.Affine: instance Read (f a) => Read (Point f a)
+ Linear.Affine: instance Show (f a) => Show (Point f a)
+ Linear.Affine: instance Storable (f a) => Storable (Point f a)
+ Linear.Affine: instance Traversable f => Traversable (Point f)
+ Linear.Affine: newtype Point f a
+ Linear.Affine: origin :: (Additive f, Num a) => Point f a
+ Linear.Affine: qdA :: (Affine p, Foldable (Diff p), Num a) => p a -> p a -> a
+ Linear.Conjugate: instance Conjugate CDouble
+ Linear.Conjugate: instance Conjugate CFloat
+ Linear.Epsilon: instance Epsilon CDouble
+ Linear.Epsilon: instance Epsilon CFloat
+ Linear.Metric: instance Metric Vector
+ Linear.V: instance Reifies * s Int => Dim * (ReifiedDim s)
+ Linear.Vector: outer :: (Functor f, Functor g, Num a) => f a -> g a -> f (g a)

Files

CHANGELOG.markdown view
@@ -1,3 +1,7 @@+1.1.2+-----+* Dependency bump for `reflection` compatibility+ 1.1.1 ----- * Fixed an infinite loop in the default definition of `liftI2`.
linear.cabal view
@@ -1,6 +1,6 @@ name:          linear category:      Math, Algebra-version:       1.1.1+version:       1.1.2 license:       BSD3 cabal-version: >= 1.8 license-file:  LICENSE@@ -35,7 +35,7 @@     distributive         >= 0.2.2 && < 1,     ghc-prim,     hashable             >= 1.1   && < 1.3,-    reflection           >= 1.1.6 && < 2,+    reflection           >= 1.3.2 && < 2,     semigroups           >= 0.9   && < 1,     semigroupoids        >= 3     && < 4,     tagged               >= 0.4.4 && < 1,@@ -46,6 +46,7 @@    exposed-modules:     Linear+    Linear.Affine     Linear.Conjugate     Linear.Core     Linear.Epsilon
+ src/Linear/Affine.hs view
@@ -0,0 +1,112 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE TypeFamilies #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Linear.Vector+-- License     :  BSD-style (see the file LICENSE)+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>+-- Stability   :  provisional+-- Portability :  portable+--+-- Operations on affine spaces.+-----------------------------------------------------------------------------+module Linear.Affine where++import Control.Applicative+import Data.Complex (Complex)+import Data.Foldable as Foldable+import Data.Functor.Bind+import Data.Functor.Identity (Identity)+import Data.HashMap.Lazy (HashMap)+import Data.Hashable+import Data.IntMap (IntMap)+import Data.Ix+import Data.Map (Map)+import Data.Traversable as Traversable+import Data.Vector (Vector)+import Foreign.Storable+import Linear.Core+import Linear.Epsilon+import Linear.Metric+import Linear.Plucker+import Linear.Quaternion+import Linear.V+import Linear.V0+import Linear.V2+import Linear.V3+import Linear.V4+import Linear.Vector++-- | An affine space is roughly a vector space in which we have+-- forgotten or at least pretend to have forgotten the origin.+--+-- > a .+^ (b .-. a)  =  b@+-- > (a .+^ u) .+^ v  =  a .+^ (u ^+^ v)@+-- > (a .-. b) ^+^ v  =  (a .+^ v) .-. q@+class Additive (Diff p) => Affine p where+  type Diff p :: * -> *+  +  infixl 6 .-.+  -- | Get the difference between two points as a vector offset.+  (.-.) :: Num a => p a -> p a -> Diff p a+  +  infixl 6 .+^+  -- | Add a vector offset to a point.+  (.+^) :: Num a => p a -> Diff p a -> p a++  infixl 6 .-^+  -- | Subtract a vector offset from a point.+  (.-^) :: Num a => p a -> Diff p a -> p a+  p .-^ v = p .+^ negated v+  {-# INLINE (.-^) #-}++-- | Compute the quadrance of the difference (the square of the distance)+qdA :: (Affine p, Foldable (Diff p), Num a) => p a -> p a -> a+qdA a b = Foldable.sum (fmap (join (*)) (a .-. b))++-- | Distance between two points in an affine space+distanceA :: (Floating a, Foldable (Diff p), Affine p) => p a -> p a -> a+distanceA a b = sqrt (qdA a b)++#define ADDITIVEC(CTX,T) instance CTX => Affine T where type Diff T = T ; \+  (.-.) = (^-^) ; {-# INLINE (.-.) #-} ; (.+^) = (^+^) ; {-# INLINE (.+^) #-} ; \+  (.-^) = (^-^) ; {-# INLINE (.-^) #-}+#define ADDITIVE(T) ADDITIVEC((), T)++ADDITIVE([])+ADDITIVE(Complex)+ADDITIVE(ZipList)+ADDITIVE(Maybe)+ADDITIVE(IntMap)+ADDITIVE(Identity)+ADDITIVE(Vector)+ADDITIVE(V0)+ADDITIVE(V2)+ADDITIVE(V3)+ADDITIVE(V4)+ADDITIVE(Plucker)+ADDITIVE(Quaternion)+ADDITIVE(((->) b))+ADDITIVEC(Ord k, (Map k))+ADDITIVEC((Eq k, Hashable k), (HashMap k))+ADDITIVEC(Dim n, (V n))++-- | A handy wrapper to help distinguish points from vectors at the+-- type level+newtype Point f a = P (f a)+  deriving ( Eq, Ord, Show, Read, Monad, Functor, Applicative, Foldable+           , Traversable, Apply, Bind, Additive, Metric, Core, R2, R3, R4+           , Fractional , Num, Ix, Storable, Epsilon+           )++instance Additive f => Affine (Point f) where+  type Diff (Point f) = f+  P x .-. P y = x ^-^ y+  P x .+^ v = P (x ^+^ v)+  P x .-^ v = P (x ^-^ v)++-- | Vector spaces have origins.+origin :: (Additive f, Num a) => Point f a+origin = P zero
src/Linear/Conjugate.hs view
@@ -17,6 +17,7 @@ import Data.Complex hiding (conjugate) import Data.Int import Data.Word+import Foreign.C.Types (CFloat, CDouble)  -- | An involutive ring class Num a => Conjugate a where@@ -43,6 +44,8 @@ instance Conjugate Word8 instance Conjugate Double instance Conjugate Float+instance Conjugate CFloat+instance Conjugate CDouble instance (Conjugate a, RealFloat a) => Conjugate (Complex a) where   {-# SPECIALIZE instance Conjugate (Complex Float) #-}   {-# SPECIALIZE instance Conjugate (Complex Double) #-}
src/Linear/Epsilon.hs view
@@ -12,6 +12,7 @@ module Linear.Epsilon   ( Epsilon(..)   ) where+import Foreign.C.Types (CFloat, CDouble)  -- | Provides a fairly subjective test to see if a quantity is near zero. --@@ -36,4 +37,12 @@  -- | @'abs' a '<=' 1e-12@ instance Epsilon Double where+  nearZero a = abs a <= 1e-12++-- | @'abs' a '<=' 1e-6@+instance Epsilon CFloat where+  nearZero a = abs a <= 1e-6++-- | @'abs' a '<=' 1e-12@+instance Epsilon CDouble where   nearZero a = abs a <= 1e-12
src/Linear/Metric.hs view
@@ -18,6 +18,7 @@  import Data.Foldable as Foldable import Data.Functor.Identity+import Data.Vector (Vector) import Linear.Epsilon import Linear.Vector @@ -61,6 +62,8 @@  instance Metric Identity where   dot (Identity x) (Identity y) = x * y++instance Metric Vector  -- | Normalize a 'Metric' functor to have unit 'norm'. This function -- does not change the functor if its 'norm' is 0 or 1.
src/Linear/V.hs view
@@ -182,6 +182,7 @@   | V.length v == reflectDim (Proxy :: Proxy n) = Just (V v)   | otherwise                                   = Nothing +#if !(MIN_VERSION_reflection(1,3,0)) data Z  -- 0 data D  (n :: *) -- 2n data SD (n :: *) -- 2n+1@@ -226,5 +227,5 @@   (q, 0) -> conT ''D  `appT` int q   (q, 1) -> conT ''SD `appT` int q   _     -> error "ghc is bad at math"-+#endif 
src/Linear/Vector.hs view
@@ -23,6 +23,7 @@   , basis   , basisFor   , kronecker+  , outer   ) where  import Control.Applicative@@ -301,3 +302,7 @@   where aux i e = let i' = i + 1                   in i' `seq` (i', setElement i e z)         z = pure 0++-- | Outer (tensor) product of two vectors+outer :: (Functor f, Functor g, Num a) => f a -> g a -> f (g a)+outer a b = fmap (\x->fmap (*x) b) a