Omega 0.2.2 → 1.0
raw patch · 5 files changed
+41/−5 lines, 5 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
- Data.Presburger.Omega.Expr: falseE :: BoolExp
- Data.Presburger.Omega.Expr: trueE :: BoolExp
+ Data.Presburger.Omega.Expr: trueE, falseE :: BoolExp
- Data.Presburger.Omega.Expr: expEqual :: (Eq t) => Expr t -> Expr t -> Bool
+ Data.Presburger.Omega.Expr: expEqual :: Eq t => Expr t -> Expr t -> Bool
- Data.Presburger.Omega.LowLevel: Coefficient :: !!VarHandle -> !!Int -> Coefficient
+ Data.Presburger.Omega.LowLevel: Coefficient :: {-# UNPACK #-} !VarHandle -> {-# UNPACK #-} !Int -> Coefficient
- Data.Presburger.Omega.LowLevel: approximate :: (Presburger a) => a -> IO a
+ Data.Presburger.Omega.LowLevel: approximate :: Presburger a => a -> IO a
- Data.Presburger.Omega.LowLevel: coeffValue :: Coefficient -> !!Int
+ Data.Presburger.Omega.LowLevel: coeffValue :: Coefficient -> {-# UNPACK #-} !Int
- Data.Presburger.Omega.LowLevel: coeffVar :: Coefficient -> !!VarHandle
+ Data.Presburger.Omega.LowLevel: coeffVar :: Coefficient -> {-# UNPACK #-} !VarHandle
- Data.Presburger.Omega.LowLevel: complement :: (Presburger a) => a -> IO a
+ Data.Presburger.Omega.LowLevel: complement :: Presburger a => a -> IO a
- Data.Presburger.Omega.LowLevel: definiteTautology :: (Presburger a) => a -> IO Bool
+ Data.Presburger.Omega.LowLevel: definiteTautology :: Presburger a => a -> IO Bool
- Data.Presburger.Omega.LowLevel: difference :: (Presburger a) => a -> a -> IO a
+ Data.Presburger.Omega.LowLevel: difference :: Presburger a => a -> a -> IO a
- Data.Presburger.Omega.LowLevel: equal :: (Presburger a) => a -> a -> IO Bool
+ Data.Presburger.Omega.LowLevel: equal :: Presburger a => a -> a -> IO Bool
- Data.Presburger.Omega.LowLevel: exact :: (Presburger a) => a -> IO Bool
+ Data.Presburger.Omega.LowLevel: exact :: Presburger a => a -> IO Bool
- Data.Presburger.Omega.LowLevel: gist :: (Presburger a) => Effort -> a -> a -> IO a
+ Data.Presburger.Omega.LowLevel: gist :: Presburger a => Effort -> a -> a -> IO a
- Data.Presburger.Omega.LowLevel: inexact :: (Presburger a) => a -> IO Bool
+ Data.Presburger.Omega.LowLevel: inexact :: Presburger a => a -> IO Bool
- Data.Presburger.Omega.LowLevel: intersection :: (Presburger a) => a -> a -> IO a
+ Data.Presburger.Omega.LowLevel: intersection :: Presburger a => a -> a -> IO a
- Data.Presburger.Omega.LowLevel: lowerBound :: (Presburger a) => a -> IO a
+ Data.Presburger.Omega.LowLevel: lowerBound :: Presburger a => a -> IO a
- Data.Presburger.Omega.LowLevel: lowerBoundSatisfiable :: (Presburger a) => a -> IO Bool
+ Data.Presburger.Omega.LowLevel: lowerBoundSatisfiable :: Presburger a => a -> IO Bool
- Data.Presburger.Omega.LowLevel: obviousTautology :: (Presburger a) => a -> IO Bool
+ Data.Presburger.Omega.LowLevel: obviousTautology :: Presburger a => a -> IO Bool
- Data.Presburger.Omega.LowLevel: union :: (Presburger a) => a -> a -> IO a
+ Data.Presburger.Omega.LowLevel: union :: Presburger a => a -> a -> IO a
- Data.Presburger.Omega.LowLevel: unknown :: (Presburger a) => a -> IO Bool
+ Data.Presburger.Omega.LowLevel: unknown :: Presburger a => a -> IO Bool
- Data.Presburger.Omega.LowLevel: upperBound :: (Presburger a) => a -> IO a
+ Data.Presburger.Omega.LowLevel: upperBound :: Presburger a => a -> IO a
- Data.Presburger.Omega.LowLevel: upperBoundSatisfiable :: (Presburger a) => a -> IO Bool
+ Data.Presburger.Omega.LowLevel: upperBoundSatisfiable :: Presburger a => a -> IO Bool
Files
- Data/Presburger/Omega/Expr.hs +3/−2
- Data/Presburger/Omega/LowLevel.hsc +11/−0
- Data/Presburger/Omega/Rel.hs +17/−0
- Data/Presburger/Omega/Set.hs +7/−0
- Omega.cabal +3/−3
Data/Presburger/Omega/Expr.hs view
@@ -299,7 +299,7 @@ of CAUE Sum lit es -> sumE lit $ map (rec env) es CAUE Prod lit es -> prodE lit $ map (rec env) es LitE n -> litE n- VarE (Bound i) -> env `index` i+ VarE (Bound i) -> env `genericIndex` i VarE _ -> error "Expr.fold: unexpected variable" -- Like (!!), but throws a useful error message@@ -595,7 +595,7 @@ case expression of CAUE Conj lit es | lit -> let texts = map (showsBoolExprPrec env 0) es- in showParen (n >= andPrec) $+ in showParen (n >= fromIntegral andPrec) $ texts `showSepBy` showString " |&&| " | otherwise -> showString "falseE" CAUE Disj lit es@@ -1105,4 +1105,5 @@ check' (VarE (Quantified _)) = quantifiedVar check' (QuantE _ e) = check (n+1) e + quantifiedVar :: Bool quantifiedVar = error "variablesWithinRange: unexpected variable"
Data/Presburger/Omega/LowLevel.hsc view
@@ -804,24 +804,35 @@ fromPtr =<< withPresburger2 rel1 rel2 hsw_composition | otherwise = error "composition: argument arities do not agree" +-- | Restrict the domain of a relation.+-- If @domain r@ is @d@, then @domain =<< restrictDomain r s@+-- is @intersection d s@. restrictDomain :: OmegaRel -> OmegaSet -> IO OmegaRel restrictDomain rel1 set | length (rDom rel1) == length (sDom set) = fromPtr =<< withPresburger2 rel1 set hsw_restrict_domain | otherwise = error "restrictDomain: argument arities do not agree" +-- | Restrict the range of a relation.+-- If @range r@ is @d@, then @range =<< restrictRange r s@+-- is @intersection d s@. restrictRange :: OmegaRel -> OmegaSet -> IO OmegaRel restrictRange rel1 set | length (rDom rel1) == length (sDom set) = fromPtr =<< withPresburger2 rel1 set hsw_restrict_range | otherwise = error "restrictRange: argument arities do not agree" +-- | Compute the difference of two relations or sets.+-- The members of @difference x y@ are the members of @x@ that are not+-- members of @y@. difference :: Presburger a => a -> a -> IO a difference rel1 rel2 | sameArity rel1 rel2 = fromPtr =<< withPresburger2 rel1 rel2 hsw_difference | otherwise = error "difference: arguments have different arities" +-- | Compute the cross product of two sets.+-- The cross product relates every element of @s@ to every element of @y@. crossProduct :: OmegaSet -> OmegaSet -> IO OmegaRel crossProduct set1 set2 = fromPtr =<< withPresburger2 set1 set2 hsw_cross_product
Data/Presburger/Omega/Rel.hs view
@@ -243,12 +243,15 @@ definiteTautology :: Rel -> Bool definiteTautology = useRel L.definiteTautology +-- | True if the relation has no UNKNOWN constraints. exact :: Rel -> Bool exact = useRel L.exact +-- | True if the relation has UNKNOWN constraints. inexact :: Rel -> Bool inexact = useRel L.inexact +-- | True if the relation is entirely UNKNOWN. unknown :: Rel -> Bool unknown = useRel L.unknown @@ -295,11 +298,17 @@ join :: Rel -> Rel -> Rel join r1 r2 = composition r2 r1 +-- | Restrict the domain of a relation.+--+-- > domain (restrictDomain r s) === intersection (domain r) s restrictDomain :: Rel -> Set -> Rel restrictDomain r s = unsafePerformIO $ omegaRelToRel (relInpDim r) (relOutDim r) =<< L.restrictDomain (relOmegaRel r) (Set.toOmegaSet s) +-- | Restrict the range of a relation.+--+-- > range (restrictRange r s) === intersection (range r) s restrictRange :: Rel -> Set -> Rel restrictRange r s = unsafePerformIO $ omegaRelToRel (relInpDim r) (relOutDim r) =<<@@ -332,18 +341,26 @@ gist effort r1 r2 = useRel2Rel (L.gist effort) (relInpDim r1) (relOutDim r1) r1 r2 +-- | Get the transitive closure of a relation. In some cases, the transitive+-- closure cannot be computed exactly, in which case a lower bound is+-- returned. transitiveClosure :: Rel -> Rel transitiveClosure r = useRelRel L.transitiveClosure (relInpDim r) (relOutDim r) r +-- | Invert a relation, swapping the domain and range. inverse :: Rel -> Rel inverse s = useRelRel L.inverse (relOutDim s) (relInpDim s) s +-- | Get the complement of a relation. complement :: Rel -> Rel complement s = useRelRel L.complement (relInpDim s) (relOutDim s) s deltas :: Rel -> Set deltas = useRel (\wrel -> Set.fromOmegaSet =<< L.deltas wrel) +-- | Approximate a relation by allowing all existentially quantified+-- variables to take on rational values. This allows these variables to be+-- eliminated from the formula. approximate :: Rel -> Rel approximate s = useRelRel L.approximate (relInpDim s) (relOutDim s) s
Data/Presburger/Omega/Set.hs view
@@ -150,9 +150,13 @@ toOmegaSet :: Set -> OmegaSet toOmegaSet = setOmegaSet +-- | Compute the upper bound of a set by setting all UNKNOWN+-- constraints to true. upperBound :: Set -> Set upperBound s = useSetSet L.upperBound (setDim s) s +-- | Compute the lower bound of a set by setting all UNKNOWN+-- constraints to false. lowerBound :: Set -> Set lowerBound s = useSetSet L.lowerBound (setDim s) s @@ -168,12 +172,15 @@ definiteTautology :: Set -> Bool definiteTautology = useSet L.definiteTautology +-- | True if the set has no UNKNOWN constraints. exact :: Set -> Bool exact = useSet L.exact +-- | True if the set has UNKNOWN constraints. inexact :: Set -> Bool inexact = useSet L.inexact +-- | True if the set is completely UNKNOWN. unknown :: Set -> Bool unknown = useSet L.unknown
Omega.cabal view
@@ -1,6 +1,6 @@-Cabal-Version: >= 1.2.3 && < 1.9+Cabal-Version: >= 1.2.3 Name: Omega-Version: 0.2.2+Version: 1.0 Build-Type: Custom License: BSD3 License-File: LICENSE@@ -30,7 +30,7 @@ Default: False Library- Build-Depends: base >= 3 && < 4, containers+ Build-Depends: base >= 4 && < 5, containers Exposed-Modules: Data.Presburger.Omega.Expr Data.Presburger.Omega.LowLevel