numhask-range 0.2.1.0 → 0.2.2.0
raw patch · 6 files changed
+102/−69 lines, 6 filesdep ~numhask-prelude
Dependency ranges changed: numhask-prelude
Files
- numhask-range.cabal +4/−4
- src/NumHask/Pair.hs +20/−8
- src/NumHask/Range.hs +15/−5
- src/NumHask/Rect.hs +13/−2
- stack.yaml +3/−3
- test/test.hs +47/−47
numhask-range.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 62fc752e10fc215ee3f1cacd5452edc20d82a58c25ee596a682e1eccbd3a98ea+-- hash: eb71b3256d9227210388010a697953048c3c2bb2f48b3d3d4c8cb6c4eda5aee7 name: numhask-range-version: 0.2.1.0+version: 0.2.2.0 synopsis: Numbers that are range representations description: Numbers that represent ranges of all sorts. category: project@@ -36,7 +36,7 @@ , adjunctions , base >=4.7 && <4.12 , distributive- , numhask-prelude >=0.0.1.0+ , numhask-prelude >=0.0.4.0 , protolude , semigroupoids exposed-modules:@@ -59,7 +59,7 @@ build-depends: base >=4.7 && <5 , doctest- , numhask-prelude >=0.0.1.0+ , numhask-prelude >=0.0.4.0 , numhask-range , tasty other-modules:
src/NumHask/Pair.hs view
@@ -189,14 +189,20 @@ where (da, ma) = a0 `divMod` a1 (db, mb) = b0 `divMod` b1+ (Pair a0 b0) `quotRem` (Pair a1 b1) = (Pair da db, Pair ma mb)+ where+ (da, ma) = a0 `quotRem` a1+ (db, mb) = b0 `quotRem` b1 instance (Signed a) => Signed (Pair a) where sign (Pair a b) = Pair (sign a) (sign b) abs (Pair a b) = Pair (abs a) (abs b) -instance (ExpField a, MultiplicativeUnital a) =>+instance (ExpField a, Normed a a, MultiplicativeUnital a) => Normed (Pair a) a where- size (Pair a b) = sqrt (a ** (one + one) + b ** (one + one))+ normL1 (Pair a b) = normL1 a + normL1 b+ normL2 (Pair a b) = sqrt (a ** (one + one) + b ** (one + one))+ normLp p (Pair a b) = (normL1 a ** p + normL1 b ** p) ** (one/p) -- | L1-based Ord instance instance (Eq a, Ord a, Signed a, Additive a) => Ord (Pair a) where@@ -206,25 +212,31 @@ nearZero (Pair a b) = nearZero a && nearZero b aboutEqual a b = nearZero $ a - b -instance (ExpField a) => Metric (Pair a) a where- distance (Pair a0 b0) (Pair a1 b1) = size (Pair (a1 - a0) (b1 - b0))+instance (ExpField a, Normed a a) => Metric (Pair a) a where+ distanceL1 a b = normL1 (a - b)+ distanceL2 a b = normL2 (a - b)+ distanceLp p a b = normLp p (a - b) -instance (AdditiveGroup a, Distribution a) => Distribution (Pair a)+instance (Distribution a) => Distribution (Pair a) -instance (Ring a) => Ring (Pair a)+instance (Semiring a) => Semiring (Pair a) -instance (AdditiveGroup a, Semiring a) => Semiring (Pair a)+instance (Ring a) => Ring (Pair a) instance (CRing a) => CRing (Pair a) +instance (Semifield a) => Semifield (Pair a)+ instance (Field a) => Field (Pair a) instance (ExpField a) => ExpField (Pair a) where exp (Pair a b) = Pair (exp a) (exp b) log (Pair a b) = Pair (log a) (log b) -instance (BoundedField a) => BoundedField (Pair a) where+instance (UpperBoundedField a) => UpperBoundedField (Pair a) where isNaN (Pair a b) = isNaN a || isNaN b++instance (LowerBoundedField a) => LowerBoundedField (Pair a) instance (Additive a) => AdditiveBasis Pair a where (.+.) = liftR2 (+)
src/NumHask/Range.hs view
@@ -156,7 +156,7 @@ plus (Range l0 u0) (Range l1 u1) = Range (min l0 l1) (max u0 u1) instance (Ord a, BoundedField a) => AdditiveUnital (Range a) where- zero = Range infinity neginfinity+ zero = Range infinity negInfinity instance (Ord a) => AdditiveAssociative (Range a) @@ -200,13 +200,23 @@ abs (Range l u) = if u >= l then Range l u else Range u l instance (AdditiveGroup a) => Normed (Range a) a where- size (Range l u) = u-l+ normL1 (Range l u) = u-l+ normL2 (Range l u) = u-l+ normLp _ (Range l u) = u-l instance (Ord a, AdditiveGroup a) => Metric (Range a) a where- distance (Range l u) (Range l' u')+ distanceL1 (Range l u) (Range l' u') | u < l' = l' - u | u' < l = l - u' | otherwise = zero+ distanceL2 (Range l u) (Range l' u')+ | u < l' = l' - u+ | u' < l = l - u'+ | otherwise = zero+ distanceLp _ (Range l u) (Range l' u')+ | u < l' = l' - u+ | u' < l = l - u'+ | otherwise = zero instance (BoundedField a, Ord a, Epsilon a) => Epsilon (Range a) where nearZero (Range l u) = nearZero (l - u)@@ -223,7 +233,7 @@ Space (Range a) where type Element (Range a) = a union (Range l0 u0) (Range l1 u1) = Range (min l0 l1) (max u0 u1)- nul = Range infinity neginfinity+ nul = Range infinity negInfinity lower (Range l _) = l upper (Range _ u) = u singleton a = Range a a@@ -252,7 +262,7 @@ -- | turn a range into n `a`s pleasing to human sense and sensibility -- the `a`s may well lie outside the original range as a result-gridSensible :: (FromInteger a, Fractional a, Ord a, QuotientField a, ExpField a) =>+gridSensible :: (FromInteger a, Fractional a, QuotientField a, ExpField a) => Pos -> Range a -> Int -> [a] gridSensible tp (Range l u) n = (+ if tp==MidPos then step/two else zero) <$> posns
src/NumHask/Rect.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE FlexibleInstances #-}@@ -84,7 +85,8 @@ -- [Pair 2.5 0.25,Pair 2.5 0.75,Pair 7.5 0.25,Pair 7.5 0.75] newtype Rect a = Rect' (Compose Pair Range a)- deriving (Eq, Functor, Apply, Applicative, Foldable, Foldable1, Traversable)+ deriving (Eq, Functor, Apply, Applicative, Foldable, Foldable1, Traversable,+ Generic) -- | pattern of Rect lowerx upperx lowery uppery pattern Rect :: a -> a -> a -> a -> Rect a@@ -100,6 +102,13 @@ show (Rect a b c d) = "Rect " <> show a <> " " <> show b <> " " <> show c <> " " <> show d +-- rect'' :: Dhall.Type (Rect a)+-- rect'' = pair (pair double double) (pair double double)++-- instance (Interpret a) => Interpret (Rect a)+-- input auto "{ _1 = {_1 = 1.1, _2 = 1.1 }}" :: IO (Range Double)++ instance Traversable1 Rect where traverse1 f (Rect a b c d) = Rect <$> f a <.> f b <.> f c <.> f d @@ -158,7 +167,9 @@ abs (Ranges l u) = Ranges (sign l * l) (sign u * u) instance (AdditiveGroup a) => Normed (Rect a) (Pair a) where- size (Ranges l u) = Pair (size l) (size u)+ normL1 (Ranges l u) = Pair (normL1 l) (normL1 u)+ normL2 (Ranges l u) = Pair (normL2 l) (normL2 u)+ normLp (Pair pl pu) (Ranges l u) = Pair (normLp pl l) (normLp pu u) instance (BoundedField a, Ord a, Epsilon a) => Epsilon (Rect a) where nearZero (Ranges a b) = nearZero a && nearZero b
stack.yaml view
@@ -1,8 +1,8 @@-resolver: nightly-2018-04-05+resolver: nightly-2018-05-08 packages: - . extra-deps:- - numhask-prelude-0.0.3.0- - numhask-0.2.0.0+ - numhask-prelude-0.0.4.0+ - numhask-0.2.1.0
test/test.hs view
@@ -63,21 +63,21 @@ -> [Law2 s (Element s)] projectSpaceFuzzyLaws x = [ ( "project o n (lower o) ≈ lower n"- , Ternary2- (\o n _ ->+ , Binary20+ (\o n -> singular o || singular n ||- x < abs (size o) ||- x < abs (size n) || project o n (lower o) ≈ lower n))+ x < abs (normL1 o) ||+ x < abs (normL1 n) || project o n (lower o) ≈ lower n)) , ( "project o n (upper o) ≈ upper n"- , Ternary2- (\o n _ ->+ , Binary20+ (\o n -> singular o || singular n ||- x < abs (size o) ||- x < abs (size n) || project o n (upper o) ≈ upper n))+ x < abs (normL1 o) ||+ x < abs (normL1 n) || project o n (upper o) ≈ upper n)) , ( "project a a x ≈ x"- , Ternary2 (\o _ s -> singular o || x < abs (size o) || project o o s ≈ s))+ , Binary11 (\o s -> singular o || x < abs (normL1 o) || project o o s ≈ s)) ] additiveSpaceFuzzyLaws ::@@ -91,16 +91,16 @@ -> [Law s] additiveSpaceFuzzyLaws n = [ ( "left unital: zero + a ≈ a"- , Unary (\a -> n < abs (size a) || zero + a ≈ a))+ , Unary (\a -> n < abs (normL1 a) || zero + a ≈ a)) , ( "right unital: a + zero ≈ a"- , Unary (\a -> n < abs (size a) || zero + a ≈ a))+ , Unary (\a -> n < abs (normL1 a) || zero + a ≈ a)) , ( "associative: (a + b) + c ≈ a + (b +c)"- , Ternary (\a b c -> n < abs (size a) || (a + b) + c ≈ a + (b + c)))+ , Ternary (\a b c -> n < abs (normL1 a) || (a + b) + c ≈ a + (b + c))) , ( "commutative a + b ≈ b + a"- , Binary (\a b -> n < abs (size a) || a + b ≈ b + a))- , ("idempotent a + a ≈ a", Unary (\a -> n < abs (size a) || a + a ≈ a))+ , Binary (\a b -> n < abs (normL1 a) || a + b ≈ b + a))+ , ("idempotent a + a ≈ a", Unary (\a -> n < abs (normL1 a) || a + a ≈ a)) , ( "idempotent negate a + negate a ≈ abs a"- , Unary (\a -> n < abs (size a) || a + negate a ≈ abs a))+ , Unary (\a -> n < abs (normL1 a) || a + negate a ≈ abs a)) ] multiplicativeSpaceFuzzyLaws ::@@ -114,15 +114,15 @@ => Element s -> [Law s] multiplicativeSpaceFuzzyLaws n =- [ ("left unital: one * a ≈ a", Unary (\a -> n < abs (size a) || one * a ≈ a))- , ("right unital: a * one ≈ a", Unary (\a -> n < abs (size a) || one * a ≈ a))+ [ ("left unital: one * a ≈ a", Unary (\a -> n < abs (normL1 a) || one * a ≈ a))+ , ("right unital: a * one ≈ a", Unary (\a -> n < abs (normL1 a) || one * a ≈ a)) , ( "associative: (a * b) * c ≈ a * (b *c)" , Ternary (\a b c ->- n < abs (size a) ||- n < abs (size b) || n < abs (size c) || (a * b) * c ≈ a * (b * c)))+ n < abs (normL1 a) ||+ n < abs (normL1 b) || n < abs (normL1 c) || (a * b) * c ≈ a * (b * c))) , ( "commutative a * b ≈ b * a"- , Binary (\a b -> n < abs (size a) || a * b ≈ b * a))+ , Binary (\a b -> n < abs (normL1 a) || a * b ≈ b * a)) ] multiplicativeGroupSpaceFuzzyLaws ::@@ -138,13 +138,13 @@ -> [Law s] multiplicativeGroupSpaceFuzzyLaws n = [ ( "divide: a / a ≈ one"- , Unary (\a -> singular a || n < abs (size a) || (a / a) ≈ one))+ , Unary (\a -> singular a || n < abs (normL1 a) || (a / a) ≈ one)) , ( "recip divide: recip a ≈ one / a"- , Unary (\a -> singular a || n < abs (size a) || recip a ≈ one / a))+ , Unary (\a -> singular a || n < abs (normL1 a) || recip a ≈ one / a)) , ( "recip left: recip a * a ≈ one"- , Unary (\a -> singular a || n < abs (size a) || recip a * a ≈ one))+ , Unary (\a -> singular a || n < abs (normL1 a) || recip a * a ≈ one)) , ( "recip right: a * recip a ≈ one"- , Unary (\a -> singular a || n < abs (size a) || a * recip a ≈ one))+ , Unary (\a -> singular a || n < abs (normL1 a) || a * recip a ≈ one)) ] fieldFuzzyLaws ::@@ -159,52 +159,52 @@ -> [Law (r a)] fieldFuzzyLaws n = [ ( "left unital: zero + a ≈ a"- , Unary (\a -> n < abs (size a) || zero + a ≈ a))+ , Unary (\a -> n < abs (normL1 a) || zero + a ≈ a)) , ( "right unital: a + zero ≈ a"- , Unary (\a -> n < abs (size a) || zero + a ≈ a))+ , Unary (\a -> n < abs (normL1 a) || zero + a ≈ a)) , ( "associative: (a + b) + c ≈ a + (b +c)"- , Ternary (\a b c -> n < abs (size a) || (a + b) + c ≈ a + (b + c)))+ , Ternary (\a b c -> n < abs (normL1 a) || (a + b) + c ≈ a + (b + c))) , ( "commutative a + b ≈ b + a"- , Binary (\a b -> n < abs (size a) || a + b ≈ b + a))+ , Binary (\a b -> n < abs (normL1 a) || a + b ≈ b + a)) , ( "minus: a - a ≈ zero"- , Unary (\a -> nearZero a || n < abs (size a) || (a - a) ≈ zero))+ , Unary (\a -> nearZero a || n < abs (normL1 a) || (a - a) ≈ zero)) , ( "negate minus: negate a ≈ zero - a"- , Unary (\a -> nearZero a || n < abs (size a) || negate a ≈ zero - a))+ , Unary (\a -> nearZero a || n < abs (normL1 a) || negate a ≈ zero - a)) , ( "negate left: negate a * a ≈ zero"- , Unary (\a -> nearZero a || n < abs (size a) || negate a + a ≈ zero))+ , Unary (\a -> nearZero a || n < abs (normL1 a) || negate a + a ≈ zero)) , ( "negate right: a * negate a ≈ zero"- , Unary (\a -> nearZero a || n < abs (size a) || a + negate a ≈ zero))- , ("left unital: one * a ≈ a", Unary (\a -> n < abs (size a) || one * a ≈ a))- , ("right unital: a * one ≈ a", Unary (\a -> n < abs (size a) || one * a ≈ a))+ , Unary (\a -> nearZero a || n < abs (normL1 a) || a + negate a ≈ zero))+ , ("left unital: one * a ≈ a", Unary (\a -> n < abs (normL1 a) || one * a ≈ a))+ , ("right unital: a * one ≈ a", Unary (\a -> n < abs (normL1 a) || one * a ≈ a)) , ( "associative: (a * b) * c ≈ a * (b *c)" , Ternary (\a b c ->- n < abs (size a) ||- n < abs (size b) || n < abs (size c) || (a * b) * c ≈ a * (b * c)))+ n < abs (normL1 a) ||+ n < abs (normL1 b) || n < abs (normL1 c) || (a * b) * c ≈ a * (b * c))) , ( "commutative a * b ≈ b * a"- , Binary (\a b -> n < abs (size a) || a * b ≈ b * a))+ , Binary (\a b -> n < abs (normL1 a) || a * b ≈ b * a)) , ( "divide: a / a ≈ one"- , Unary (\a -> nearZero a || n < abs (size a) || (a / a) ≈ one))+ , Unary (\a -> nearZero a || n < abs (normL1 a) || (a / a) ≈ one)) , ( "recip divide: recip a ≈ one / a"- , Unary (\a -> nearZero a || n < abs (size a) || recip a ≈ one / a))+ , Unary (\a -> nearZero a || n < abs (normL1 a) || recip a ≈ one / a)) , ( "recip left: recip a * a ≈ one"- , Unary (\a -> nearZero a || n < abs (size a) || recip a * a ≈ one))+ , Unary (\a -> nearZero a || n < abs (normL1 a) || recip a * a ≈ one)) , ( "recip right: a * recip a ≈ one"- , Unary (\a -> nearZero a || n < abs (size a) || a * recip a ≈ one))+ , Unary (\a -> nearZero a || n < abs (normL1 a) || a * recip a ≈ one)) , ( "left annihilation: a * zero ≈ zero"- , Unary (\a -> n < abs (size a) || a * zero ≈ zero))+ , Unary (\a -> n < abs (normL1 a) || a * zero ≈ zero)) , ( "right annihilation: zero * a ≈ zero"- , Unary (\a -> n < abs (size a) || zero * a ≈ zero))+ , Unary (\a -> n < abs (normL1 a) || zero * a ≈ zero)) , ( "left distributivity: a * (b + c) ≈ a * b + a * c" , Ternary (\a b c ->- n < abs (size a) ||- n < abs (size b) || n < abs (size c) || a * (b + c) ≈ a * b + a * c))+ n < abs (normL1 a) ||+ n < abs (normL1 b) || n < abs (normL1 c) || a * (b + c) ≈ a * b + a * c)) , ( "right distributivity: (a + b) * c ≈ a * c + b * c" , Ternary (\a b c ->- n < abs (size a) ||- n < abs (size b) || n < abs (size c) || (a + b) * c ≈ a * c + b * c))+ n < abs (normL1 a) ||+ n < abs (normL1 b) || n < abs (normL1 c) || (a + b) * c ≈ a * c + b * c)) ] semiringFuzzyLaws ::