packages feed

emd 0.1.2.1 → 0.1.3.0

raw patch · 5 files changed

+78/−9 lines, 5 filesdep +binarydep +data-default-classPVP ok

version bump matches the API change (PVP)

Dependencies added: binary, data-default-class

API changes (from Hackage documentation)

+ Numeric.EMD: instance (Data.Vector.Generic.Base.Vector v a, GHC.TypeNats.KnownNat n, Data.Binary.Class.Binary (v a)) => Data.Binary.Class.Binary (Numeric.EMD.EMD v n a)
+ Numeric.EMD: instance Data.Binary.Class.Binary Numeric.EMD.BoundaryHandler
+ Numeric.EMD: instance Data.Binary.Class.Binary a => Data.Binary.Class.Binary (Numeric.EMD.EMDOpts a)
+ Numeric.EMD: instance Data.Binary.Class.Binary a => Data.Binary.Class.Binary (Numeric.EMD.SiftCondition a)
+ Numeric.EMD: instance GHC.Classes.Eq (v a) => GHC.Classes.Eq (Numeric.EMD.EMD v n a)
+ Numeric.EMD: instance GHC.Classes.Ord (v a) => GHC.Classes.Ord (Numeric.EMD.EMD v n a)
+ Numeric.EMD: instance GHC.Generics.Generic (Numeric.EMD.EMD v n a)
+ Numeric.EMD: instance GHC.Generics.Generic (Numeric.EMD.EMDOpts a)
+ Numeric.EMD: instance GHC.Generics.Generic (Numeric.EMD.SiftCondition a)
+ Numeric.EMD: instance GHC.Generics.Generic Numeric.EMD.BoundaryHandler
+ Numeric.EMD: instance GHC.Real.Fractional a => Data.Default.Class.Default (Numeric.EMD.EMDOpts a)
+ Numeric.EMD: instance GHC.Real.Fractional a => Data.Default.Class.Default (Numeric.EMD.SiftCondition a)
+ Numeric.EMD.Internal.Spline: instance Data.Binary.Class.Binary a => Data.Binary.Class.Binary (Numeric.EMD.Internal.Spline.SplineEnd a)
+ Numeric.EMD.Internal.Spline: instance GHC.Generics.Generic (Numeric.EMD.Internal.Spline.SplineEnd a)
+ Numeric.HHT: instance (Data.Vector.Generic.Base.Vector v a, GHC.TypeNats.KnownNat n, Data.Binary.Class.Binary (v a)) => Data.Binary.Class.Binary (Numeric.HHT.HHT v n a)
+ Numeric.HHT: instance (Data.Vector.Generic.Base.Vector v a, GHC.TypeNats.KnownNat n, Data.Binary.Class.Binary (v a)) => Data.Binary.Class.Binary (Numeric.HHT.HHTLine v n a)
+ Numeric.HHT: instance GHC.Classes.Eq (v a) => GHC.Classes.Eq (Numeric.HHT.HHT v n a)
+ Numeric.HHT: instance GHC.Classes.Ord (v a) => GHC.Classes.Ord (Numeric.HHT.HHT v n a)
+ Numeric.HHT: instance GHC.Generics.Generic (Numeric.HHT.HHT v n a)
+ Numeric.HHT: instance GHC.Generics.Generic (Numeric.HHT.HHTLine v n a)
+ Numeric.HHT: instance GHC.Show.Show (v a) => GHC.Show.Show (Numeric.HHT.HHT v n a)

Files

CHANGELOG.md view
@@ -1,6 +1,20 @@ Changelog ========= +Version 0.1.3.0+---------------++*August 15, 2018*++<https://github.com/mstksg/emd/releases/tag/v0.1.3.0>++*   `Default` instance for `SiftCondition` and `EMDOpts`, as a useful+    alternative to `defaultEO` and `defaultSC` for those who prefer it.+*   `Binary` instances for `EMD`, `HHT`, and related data types.  These are+    based on `Binary` instance for `v a`, so the user must bring the orphan+    instance of their choice into scope.  Not sure if this is the best way to+    do this.+ Version 0.1.2.1 --------------- 
emd.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: eba3e48d66b797a1e9b109e1bb2cc296003754c5adda30419efb80cfee7a1d66+-- hash: 8146e6229308d428ec6ca649537a3ddf860fe609d1d2de6ea2aff6536e75ae9e  name:           emd-version:        0.1.2.1+version:        0.1.3.0 synopsis:       Empirical Mode Decomposition and Hilbert-Huang Transform description:    Please see the README on GitHub at <https://github.com/mstksg/emd#readme> category:       Math@@ -41,7 +41,9 @@   ghc-options: -Wall -Wredundant-constraints -Wcompat   build-depends:       base >=4.10 && <5+    , binary     , containers+    , data-default-class     , finite-typelits     , ghc-typelits-knownnat     , ghc-typelits-natnormalise
src/Numeric/EMD.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE BangPatterns                             #-}+{-# LANGUAGE DeriveGeneric                            #-} {-# LANGUAGE GADTs                                    #-} {-# LANGUAGE LambdaCase                               #-} {-# LANGUAGE RecordWildCards                          #-}@@ -51,12 +52,15 @@  import           Control.Monad import           Control.Monad.IO.Class+import           Data.Default.Class import           Data.Finite import           Data.Functor.Identity+import           GHC.Generics                 (Generic) import           GHC.TypeNats import           Numeric.EMD.Internal.Extrema import           Numeric.EMD.Internal.Spline import           Text.Printf+import qualified Data.Binary                  as Bi import qualified Data.Map                     as M import qualified Data.Vector.Generic          as VG import qualified Data.Vector.Generic.Sized    as SVG@@ -66,18 +70,21 @@                     , eoSplineEnd       :: SplineEnd a      -- ^ end conditions for envelope splines                     , eoBoundaryHandler :: Maybe BoundaryHandler  -- ^ process for handling boundary                     }-  deriving (Show, Eq, Ord)+  deriving (Show, Eq, Ord, Generic)  data BoundaryHandler     -- | Clamp envelope at end points (Matlab implementation)     = BHClamp     -- | Extend boundaries symmetrically     | BHSymmetric-  deriving (Show, Eq, Ord)+  deriving (Show, Eq, Ord, Generic)      -- -- | Extend boundaries assuming global periodicity     -- -- | BHPeriodic +instance Bi.Binary BoundaryHandler+instance Bi.Binary a => Bi.Binary (EMDOpts a)+ -- | Default 'EMDOpts' defaultEO :: Fractional a => EMDOpts a defaultEO = EO { eoSiftCondition   = defaultSC@@ -85,7 +92,22 @@                , eoBoundaryHandler = Just BHSymmetric                } +instance Fractional a => Default (EMDOpts a) where+    def = defaultEO+ -- | Stop conditions for sifting process+--+-- Data type is lazy in its fields, so this infinite data type:+--+-- @+-- nTimes n = SCTimes n `SCOr` nTimes (n + 1)+-- @+--+-- will be treated identically as:+--+-- @+-- nTimes = SCTimes+-- @ data SiftCondition a     -- | Stop using standard SD method     = SCStdDev !a@@ -95,11 +117,15 @@     | SCOr (SiftCondition a) (SiftCondition a)     -- | Stop when both conditions are met     | SCAnd (SiftCondition a) (SiftCondition a)-  deriving (Show, Eq, Ord)+  deriving (Show, Eq, Ord, Generic) +instance Bi.Binary a => Bi.Binary (SiftCondition a)+instance Fractional a => Default (SiftCondition a) where+    def = defaultSC+ -- | Default 'SiftCondition' defaultSC :: Fractional a => SiftCondition a-defaultSC = SCStdDev 0.3 `SCOr` SCTimes 100     -- R package uses SCTimes 20, Matlab uses no limit+defaultSC = SCStdDev 0.3 `SCOr` SCTimes 50     -- R package uses SCTimes 20, Matlab uses no limit -- defaultSC = SCStdDev 0.3  -- | 'True' if stop@@ -128,7 +154,15 @@ data EMD v n a = EMD { emdIMFs     :: ![SVG.Vector v n a]                      , emdResidual :: !(SVG.Vector v n a)                      }-  deriving Show+  deriving (Show, Generic, Eq, Ord)++instance (VG.Vector v a, KnownNat n, Bi.Binary (v a)) => Bi.Binary (EMD v n a) where+    put EMD{..} = Bi.put (SVG.fromSized <$> emdIMFs)+               *> Bi.put (SVG.fromSized emdResidual)+    get = do+      Just emdIMFs     <- traverse SVG.toSized <$> Bi.get+      Just emdResidual <- SVG.toSized <$> Bi.get+      pure EMD{..}  -- | EMD decomposition of a given time series with a given sifting stop -- condition.
src/Numeric/EMD/Internal/Spline.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE ApplicativeDo                            #-} {-# LANGUAGE DataKinds                                #-}+{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE GADTs                                    #-} {-# LANGUAGE RecordWildCards                          #-} {-# LANGUAGE ScopedTypeVariables                      #-}@@ -33,9 +34,11 @@ import           Data.Maybe import           Data.Proxy import           Data.Type.Equality+import           GHC.Generics                     (Generic) import           GHC.TypeLits.Compare import           GHC.TypeNats import           Numeric.EMD.Internal.Tridiagonal+import qualified Data.Binary                      as Bi import qualified Data.Map                         as M import qualified Data.Vector.Sized                as SV @@ -51,7 +54,9 @@     --     -- @since 0.1.2.0     | SEClamped a a-  deriving (Show, Eq, Ord)+  deriving (Show, Eq, Ord, Generic)++instance Bi.Binary a => Bi.Binary (SplineEnd a)  data SplineCoef a = SC { _scAlpha  :: !a      -- ^ a                        , _scBeta   :: !a      -- ^ b
src/Numeric/HHT.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE DataKinds                                #-}+{-# LANGUAGE DeriveGeneric                            #-} {-# LANGUAGE FlexibleContexts                         #-} {-# LANGUAGE RecordWildCards                          #-} {-# LANGUAGE ScopedTypeVariables                      #-}@@ -43,8 +44,10 @@ import           Data.List import           Data.Proxy import           Data.Semigroup+import           GHC.Generics              (Generic) import           GHC.TypeNats import           Numeric.EMD+import qualified Data.Binary               as Bi import qualified Data.Map                  as M import qualified Data.Vector               as V import qualified Data.Vector.Generic       as VG@@ -58,14 +61,25 @@       -- | IMF HHT instantaneous frequency as a time series (between 0 and 1)     , hlFreqs :: !(SVG.Vector v n a)     }-  deriving (Show, Eq, Ord)+  deriving (Show, Eq, Ord, Generic) +instance (VG.Vector v a, KnownNat n, Bi.Binary (v a)) => Bi.Binary (HHTLine v n a) where+    put HHTLine{..} = Bi.put (SVG.fromSized hlMags )+                   *> Bi.put (SVG.fromSized hlFreqs)+    get = do+      Just hlMags  <- SVG.toSized <$> Bi.get+      Just hlFreqs <- SVG.toSized <$> Bi.get+      pure HHTLine{..}+ -- | A Hilbert-Huang Transform.  An @'HHT' v n a@ is a Hilbert-Huang -- transform of an @n@-item time series of items of type @a@ represented -- using vector @v@. -- -- Create using 'hht' or 'hhtEmd'. newtype HHT v n a = HHT { hhtLines :: [HHTLine v n a] }+  deriving (Show, Eq, Ord, Generic)++instance (VG.Vector v a, KnownNat n, Bi.Binary (v a)) => Bi.Binary (HHT v n a)  -- | Directly compute the Hilbert-Huang transform of a given time series. -- Essentially is a composition of 'hhtEmd' and 'emd'.  See 'hhtEmd' for