Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
03d54a9
Corrects `recipUnit` for `WrapIntegral`
konn Jul 8, 2020
38c39c8
Variadic representation for Prime Fields
konn Jul 8, 2020
7ee745b
SPECIALISE pragmas
konn Jul 8, 2020
e370be0
INLINing
konn Jul 8, 2020
c93e53e
Various tests for Prime Fields (failing for inspection test)
konn Jul 8, 2020
cef0fbd
More robust inspection test
konn Jul 8, 2020
2e461e2
Changes the type-level logic to determine the internal representation
konn Jul 8, 2020
74e75a0
Slightly more efficient factorisation
konn Jul 8, 2020
1773506
Corrects precondition for F p
konn Jul 9, 2020
8cb7112
arithmoi version constraints
konn Jul 9, 2020
e727b29
Fixes 8.0.4 dependency
konn Jul 9, 2020
c1963c0
Removes unused constraint
konn Jul 9, 2020
de32505
Workarounds for 8.4
konn Jul 9, 2020
564ffdb
Separates Optimisation-related tests to distinct module
konn Jul 9, 2020
6106135
Lower bound for inspection-testing
konn Jul 9, 2020
9cb1efb
QuickCheck tabulate
konn Jul 9, 2020
dbdfb25
Depends to custom `inspection-testing` fork
konn Jul 9, 2020
6db4a2b
Corrects GitLab CI
konn Jul 9, 2020
285018e
Corrects commit
konn Jul 9, 2020
4ac6568
Updates 8.4.3 dependencies (too tired...)
konn Jul 9, 2020
4c2f183
Updates commit
konn Jul 9, 2020
8d3d4cc
Special treatment for inspection testing
konn Jul 9, 2020
42d0f07
Backslashes
konn Jul 9, 2020
ff5f9a9
Merge branch 'master' into succinct-prime-field
konn Jul 9, 2020
141c1bf
Various optimisation
konn Jul 10, 2020
003ea60
Another optimisation
konn Jul 10, 2020
914ecdd
More inspection tests
konn Jul 10, 2020
f22b5f8
Adds benchmark results
konn Jul 10, 2020
8030051
Unused imports
konn Jul 10, 2020
aadb303
Merge branch 'master' into succinct-prime-field
konn Jul 10, 2020
afa12b2
Merge branch 'master' into succinct-prime-field
konn Jul 10, 2020
d97c5eb
Removes garbage
konn Jul 10, 2020
d6d2a2a
Adds succinct version bench results
konn Jul 10, 2020
07e3b5a
Profiling for factorisation
konn Jul 11, 2020
2da0a93
Profiling reconfiguration
konn Jul 11, 2020
bce0e35
Aggressive optimisation
konn Jul 11, 2020
6b14124
instance modification
konn Jul 11, 2020
284a2b3
Merge branch 'master' into succinct-prime-field
konn Jul 11, 2020
bd84d79
Merge branch 'master' into succinct-prime-field
konn Jul 11, 2020
33e086a
Adds euclidean benchmark
konn Jul 11, 2020
36f954d
More efficient repeatedSquare without internal representation
konn Jul 11, 2020
b53094f
Stop providing custom repeatedSquare
konn Jul 11, 2020
4b9529c
Import list refactoring
konn Jul 11, 2020
5b85fdb
More inspection testing
konn Jul 11, 2020
c135e1a
Flag changes
konn Jul 11, 2020
a3a80f3
Corrects profiling flag
konn Jul 11, 2020
296d4ed
More profiling cases
konn Jul 11, 2020
4ad5f48
Merge branch 'master' into succinct-prime-field
konn Jul 18, 2020
08bcf89
Instance unification
konn Jul 18, 2020
c15aa60
Removes duplicates
konn Jul 18, 2020
0e902d9
8.10 fix
konn Jul 18, 2020
075ef7e
Kind signature (I don't understand why this needed for GHC 8.10
konn Jul 23, 2020
3bee943
StandaloneKindSignatures for F_Aux
konn Jul 23, 2020
edc1bc6
Bumps 8.8 resolver and switches default to 8.8
konn Jul 23, 2020
84fb07b
VSCode environment
konn Jul 23, 2020
2838eba
Unbox instance for Small F_p
konn Jul 23, 2020
618e178
Format on save
konn Jul 23, 2020
3742150
Updates image for CI 8.8
konn Jul 23, 2020
5dc0361
Workaround for REPL and IDE
konn Jul 23, 2020
8c20088
Unboxed and Prim instances
konn Jul 23, 2020
288575c
Galois Field opt-test
konn Jul 23, 2020
31785dc
Switched from `ListLike` to `subcategories`
konn Sep 3, 2020
b0aa408
Drops a support for GHC <= 8.4
konn Sep 3, 2020
ac3f40b
Adds missing extra-deps
konn Sep 3, 2020
72e2f54
corrects duplicated key
konn Sep 3, 2020
2f699cf
Defines isGF constraint
konn Sep 3, 2020
ae8f51c
Updates `sized` hash
konn Sep 6, 2020
172cb8b
Corrects target name
konn Sep 6, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 8 additions & 23 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,13 @@ stages:
.cached_dirs: &cached-dirs
paths:
- '.stack-work/'
- '.stack-no-coverage/'
- '.stack-root/'
- '*/.stack-work'
- '*/.stack-no-coverage'
- '.apt/'
- '.hspec-failures'

.header-ghc-84: &header-ghc-84
image: registry.gitlab.com/konn/computational-algebra/build/ghc-8.4:0.6.0.0-p4
variables:
STACK_YAML: "stack-804.yaml"
GHC: 804
cache:
key: "${CI_COMMIT_REF_SLUG}-ghc-8.4"
<<: *cached-dirs

.header-ghc-86: &header-ghc-86
image: registry.gitlab.com/konn/computational-algebra/build/ghc-8.6:0.6.0.0-p3
variables:
Expand All @@ -35,15 +28,15 @@ stages:
<<: *cached-dirs

.header-ghc-88: &header-ghc-88
image: registry.gitlab.com/konn/computational-algebra/build/ghc-8.8:0.6.0.0-p3
image: registry.gitlab.com/konn/computational-algebra/build/ghc-8.8:0.6.0.0-p4
variables:
STACK_YAML: "stack-808.yaml"
GHC: 808
cache:
key: "${CI_COMMIT_REF_SLUG}-ghc-8.8"
<<: *cached-dirs

.header-ghc-88: &header-ghc-810
.header-ghc-810: &header-ghc-810
image: registry.gitlab.com/konn/computational-algebra/build/ghc-8.10:0.6.0.0
variables:
STACK_YAML: "stack-810.yaml"
Expand All @@ -64,16 +57,15 @@ before_script:
- echo "$STACK_YAML"
- stack setup
- stack build --no-terminal --test --no-run-tests --coverage
- stack build --no-terminal --work-dir=.stack-no-coverage --flag halg-core-test:opt-test --flag halg-galois-fields:opt-test halg-core-test:exe:halg-core-opt-test halg-galois-fields:test:halg-gf-opt-test

.test-script: &test-script
stage: test
script:
- stack setup
- stack --no-terminal test --no-rerun-tests --coverage

build:ghc-8.4:
<<: *header-ghc-84
<<: *build-script
- stack exec --work-dir=.stack-no-coverage -- halg-core-opt-test
- stack exec --work-dir=.stack-no-coverage -- halg-gf-opt-test

build:ghc-8.6:
<<: *header-ghc-86
Expand All @@ -87,13 +79,6 @@ build:ghc-8.10:
<<: *header-ghc-810
<<: *build-script

test:ghc-8.4:
dependencies:
- build:ghc-8.4
<<: *header-ghc-84
<<: *test-script
coverage: '/^\s*(\d+\s*%)\s*top-level declarations used/'

test:ghc-8.6:
dependencies:
- build:ghc-8.6
Expand All @@ -115,7 +100,7 @@ test:ghc-8.10:
deploy_documents:
only:
- master@konn/computational-algebra
image: registry.gitlab.com/konn/computational-algebra/build/ghc-8.8:0.6.0.0-p3
image: registry.gitlab.com/konn/computational-algebra/build/ghc-8.8:0.6.0.0-p4
stage: deploy
allow_failure: true
dependencies:
Expand Down
1 change: 1 addition & 0 deletions .hspec-failures
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
FailureReport {failureReportSeed = 1324859739, failureReportMaxSuccess = 100, failureReportMaxSize = 100, failureReportMaxDiscardRatio = 10, failureReportPaths = []}
6 changes: 5 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,9 @@
"**/.stack-prof/": true,
"**/.stack-work/": true,
"heap-poly": true
}
},
"stylishHaskell.showConsoleOnError": false,
"haskell.formattingProvider": "none",
"editor.defaultFormatter": "vigoo.stylish-haskell",
"editor.formatOnSave": true
}
130 changes: 114 additions & 16 deletions algebraic-prelude/src/AlgebraicPrelude.hs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
{-# LANGUAGE ConstraintKinds, FlexibleContexts, FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses #-}
{-# LANGUAGE NoImplicitPrelude, NoRebindableSyntax, StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell, TypeFamilies, UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE ConstraintKinds, FlexibleContexts, FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses #-}
{-# LANGUAGE NoImplicitPrelude, NoRebindableSyntax, ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving, TemplateHaskell, TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -O2 -fno-warn-orphans #-}
-- | This module provides drop-in replacement for @'Prelude'@ module in base package,
-- based on algebraic hierarchy provided by
-- <https://hackage.haskell.org/package/algebra algebra> package.
Expand Down Expand Up @@ -87,6 +88,7 @@ import BasicPrelude as AlgebraicPrelude hidin
(^),
(^^))
import qualified Control.Lens.TH as L
import Data.Coerce (coerce)
import qualified Data.Ratio as P
import qualified Data.Semigroup as Semi
import Foreign.Storable (Storable)
Expand Down Expand Up @@ -369,34 +371,55 @@ newtype WrapIntegral a = WrapIntegral { unwrapIntegral :: a }
deriving (Read, Show, Eq, Ord, P.Num, P.Real, P.Enum, P.Integral, Storable)

instance (P.Num a) => Additive (WrapIntegral a) where
{-# SPECIALISE instance Additive (WrapIntegral Int) #-}
{-# SPECIALISE instance Additive (WrapIntegral Word) #-}
{-# SPECIALISE instance Additive (WrapIntegral Integer) #-}
WrapIntegral a + WrapIntegral b = WrapIntegral (a P.+ b)
{-# INLINE (+) #-}
sinnum1p n (WrapIntegral a) = WrapIntegral ((1 P.+ fromIntegral n) P.* a)
{-# INLINE sinnum1p #-}

instance (P.Num a) => LeftModule Natural (WrapIntegral a) where
{-# SPECIALISE instance LeftModule Natural (WrapIntegral Int) #-}
{-# SPECIALISE instance LeftModule Natural (WrapIntegral Word) #-}
{-# SPECIALISE instance LeftModule Natural (WrapIntegral Integer) #-}
n .* WrapIntegral r = WrapIntegral (P.fromIntegral n P.* r)
{-# INLINE (.*) #-}

instance (P.Num a) => RightModule Natural (WrapIntegral a) where
{-# SPECIALISE instance RightModule Natural (WrapIntegral Int) #-}
{-# SPECIALISE instance RightModule Natural (WrapIntegral Word) #-}
{-# SPECIALISE instance RightModule Natural (WrapIntegral Integer) #-}
WrapIntegral r *. n = WrapIntegral (r P.* P.fromIntegral n)
{-# INLINE (*.) #-}

instance (P.Num a) => Monoidal (WrapIntegral a) where
{-# SPECIALISE instance Monoidal (WrapIntegral Int) #-}
{-# SPECIALISE instance Monoidal (WrapIntegral Word) #-}
{-# SPECIALISE instance Monoidal (WrapIntegral Integer) #-}
zero = WrapIntegral (P.fromInteger 0)
{-# INLINE zero #-}
sinnum n (WrapIntegral a) = WrapIntegral (fromIntegral n P.* a)
{-# INLINE sinnum #-}

instance (P.Num a) => LeftModule Integer (WrapIntegral a) where
{-# SPECIALISE instance LeftModule Integer (WrapIntegral Int) #-}
{-# SPECIALISE instance LeftModule Integer (WrapIntegral Word) #-}
{-# SPECIALISE instance LeftModule Integer (WrapIntegral Integer) #-}
n .* WrapIntegral r = WrapIntegral (P.fromIntegral n P.* r)
{-# INLINE (.*) #-}

instance (P.Num a) => RightModule Integer (WrapIntegral a) where
{-# SPECIALISE instance RightModule Integer (WrapIntegral Int) #-}
{-# SPECIALISE instance RightModule Integer (WrapIntegral Word) #-}
{-# SPECIALISE instance RightModule Integer (WrapIntegral Integer) #-}
WrapIntegral r *. n = WrapIntegral (r P.* P.fromIntegral n)
{-# INLINE (*.) #-}

instance (P.Num a) => Group (WrapIntegral a) where
{-# SPECIALISE instance Group (WrapIntegral Int) #-}
{-# SPECIALISE instance Group (WrapIntegral Word) #-}
{-# SPECIALISE instance Group (WrapIntegral Integer) #-}
negate (WrapIntegral a) = WrapIntegral $ P.negate a
{-# INLINE negate #-}
WrapIntegral a - WrapIntegral b = WrapIntegral (a P.- b)
Expand All @@ -407,34 +430,64 @@ instance (P.Num a) => Group (WrapIntegral a) where
{-# INLINE times #-}

instance (P.Num a) => Multiplicative (WrapIntegral a) where
{-# SPECIALISE instance Multiplicative (WrapIntegral Int) #-}
{-# SPECIALISE instance Multiplicative (WrapIntegral Word) #-}
{-# SPECIALISE instance Multiplicative (WrapIntegral Integer) #-}
WrapIntegral p * WrapIntegral q = WrapIntegral (p P.* q)
{-# INLINE (*) #-}
pow1p (WrapIntegral p) n = WrapIntegral (p P.^ (n + 1))
{-# INLINE pow1p #-}

instance (P.Num a) => Unital (WrapIntegral a) where
{-# SPECIALISE instance Unital (WrapIntegral Int) #-}
{-# SPECIALISE instance Unital (WrapIntegral Word) #-}
{-# SPECIALISE instance Unital (WrapIntegral Integer) #-}
one = WrapIntegral $ P.fromInteger 1
{-# INLINE one #-}
pow (WrapIntegral a) n = WrapIntegral $ a P.^ n
{-# INLINE pow #-}

instance P.Num a => Abelian (WrapIntegral a)
instance P.Num a => Semiring (WrapIntegral a)
instance P.Num a => Abelian (WrapIntegral a) where
{-# SPECIALISE instance Abelian (WrapIntegral Int) #-}
{-# SPECIALISE instance Abelian (WrapIntegral Word) #-}
{-# SPECIALISE instance Abelian (WrapIntegral Integer) #-}
instance P.Num a => Semiring (WrapIntegral a) where
{-# SPECIALISE instance Semiring (WrapIntegral Int) #-}
{-# SPECIALISE instance Semiring (WrapIntegral Word) #-}
{-# SPECIALISE instance Semiring (WrapIntegral Integer) #-}
instance P.Num a => Rig (WrapIntegral a) where
{-# SPECIALISE instance Rig (WrapIntegral Int) #-}
{-# SPECIALISE instance Rig (WrapIntegral Word) #-}
{-# SPECIALISE instance Rig (WrapIntegral Integer) #-}
fromNatural = WrapIntegral . P.fromIntegral
{-# INLINE fromNatural #-}
instance P.Num a => Ring (WrapIntegral a) where
{-# SPECIALISE instance Ring (WrapIntegral Int) #-}
{-# SPECIALISE instance Ring (WrapIntegral Word) #-}
{-# SPECIALISE instance Ring (WrapIntegral Integer) #-}
fromInteger = WrapIntegral . P.fromInteger
{-# INLINE fromInteger #-}

instance P.Num a => Commutative (WrapIntegral a)
instance P.Num a => Commutative (WrapIntegral a) where
{-# SPECIALISE instance Commutative (WrapIntegral Int) #-}
{-# SPECIALISE instance Commutative (WrapIntegral Word) #-}
{-# SPECIALISE instance Commutative (WrapIntegral Integer) #-}

instance (P.Num a, Eq a) => DecidableZero (WrapIntegral a) where
isZero (WrapIntegral a) = a == 0
{-# SPECIALISE instance DecidableZero (WrapIntegral Int) #-}
{-# SPECIALISE instance DecidableZero (WrapIntegral Word) #-}
{-# SPECIALISE instance DecidableZero (WrapIntegral Integer) #-}
isZero = (== 0)
{-# INLINE isZero #-}

instance (Eq a, P.Integral a) => ZeroProductSemiring (WrapIntegral a)
instance (Eq a, P.Integral a) => ZeroProductSemiring (WrapIntegral a) where
{-# SPECIALISE instance ZeroProductSemiring (WrapIntegral Int) #-}
{-# SPECIALISE instance ZeroProductSemiring (WrapIntegral Word) #-}
{-# SPECIALISE instance ZeroProductSemiring (WrapIntegral Integer) #-}
instance (Eq a, P.Integral a) => DecidableUnits (WrapIntegral a) where
{-# SPECIALISE instance DecidableUnits (WrapIntegral Int) #-}
{-# SPECIALISE instance DecidableUnits (WrapIntegral Word) #-}
{-# SPECIALISE instance DecidableUnits (WrapIntegral Integer) #-}
isUnit (WrapIntegral r) = r == 1 || r == P.negate 1
{-# INLINE isUnit #-}

Expand All @@ -445,38 +498,80 @@ instance (Eq a, P.Integral a) => DecidableUnits (WrapIntegral a) where
{-# INLINE recipUnit #-}

instance (Eq a, P.Integral a) => DecidableAssociates (WrapIntegral a) where
{-# SPECIALISE instance DecidableAssociates (WrapIntegral Int) #-}
{-# SPECIALISE instance DecidableAssociates (WrapIntegral Word) #-}
{-# SPECIALISE instance DecidableAssociates (WrapIntegral Integer) #-}
isAssociate (WrapIntegral a) (WrapIntegral b) = P.abs a == P.abs b
{-# INLINE isAssociate #-}

instance (Eq a, P.Integral a) => UnitNormalForm (WrapIntegral a) where
{-# SPECIALISE instance UnitNormalForm (WrapIntegral Int) #-}
{-# SPECIALISE instance UnitNormalForm (WrapIntegral Word) #-}
{-# SPECIALISE instance UnitNormalForm (WrapIntegral Integer) #-}
splitUnit (WrapIntegral 0) = (WrapIntegral 1, WrapIntegral 0)
splitUnit (WrapIntegral a) = (WrapIntegral $ P.signum a, WrapIntegral $ P.abs a)
{-# INLINE splitUnit #-}

instance (Eq a, P.Integral a) => IntegralDomain (WrapIntegral a)
instance (Eq a, P.Integral a) => IntegralDomain (WrapIntegral a) where
{-# SPECIALISE instance IntegralDomain (WrapIntegral Int) #-}
{-# SPECIALISE instance IntegralDomain (WrapIntegral Word) #-}
{-# SPECIALISE instance IntegralDomain (WrapIntegral Integer) #-}
instance (Eq a, P.Integral a) => GCDDomain (WrapIntegral a) where
{-# SPECIALISE instance GCDDomain (WrapIntegral Int) #-}
{-# SPECIALISE instance GCDDomain (WrapIntegral Word) #-}
{-# SPECIALISE instance GCDDomain (WrapIntegral Integer) #-}
gcd (WrapIntegral a) (WrapIntegral b) = WrapIntegral (P.gcd a b)
{-# INLINE gcd #-}

lcm (WrapIntegral a) (WrapIntegral b) = WrapIntegral (P.lcm a b)
{-# INLINE lcm #-}

instance (Eq a, P.Integral a) => Euclidean (WrapIntegral a) where
divide (WrapIntegral f) (WrapIntegral g) =
let (q, r) = P.divMod f g
in (WrapIntegral q, WrapIntegral r)
{-# SPECIALISE instance Euclidean (WrapIntegral Int) #-}
{-# SPECIALISE instance Euclidean (WrapIntegral Integer) #-}
{-# SPECIALISE instance Euclidean (WrapIntegral Word) #-}
divide = coerce (P.divMod :: a -> a -> (a,a))
{-# SPECIALISE INLINE divide
:: WrapIntegral Int -> WrapIntegral Int
-> (WrapIntegral Int, WrapIntegral Int) #-}
{-# SPECIALISE INLINE divide
:: WrapIntegral Integer -> WrapIntegral Integer
-> (WrapIntegral Integer, WrapIntegral Integer) #-}
{-# SPECIALISE INLINE divide
:: WrapIntegral Word -> WrapIntegral Word
-> (WrapIntegral Word, WrapIntegral Word) #-}
{-# INLINE divide #-}

degree (WrapIntegral 0) = Nothing
degree (WrapIntegral a) = Just $ P.fromIntegral (P.abs a)
{-# INLINE degree #-}

quot (WrapIntegral a) (WrapIntegral b) = WrapIntegral $ P.div a b
{-# SPECIALISE INLINE quot
:: WrapIntegral Int -> WrapIntegral Int -> WrapIntegral Int #-}
{-# SPECIALISE INLINE quot
:: WrapIntegral Integer -> WrapIntegral Integer -> WrapIntegral Integer #-}
{-# SPECIALISE INLINE quot
:: WrapIntegral Word -> WrapIntegral Word -> WrapIntegral Word #-}
{-# INLINE quot #-}

rem (WrapIntegral a) (WrapIntegral b) = WrapIntegral $ P.mod a b
{-# SPECIALISE INLINE rem
:: WrapIntegral Int -> WrapIntegral Int -> WrapIntegral Int #-}
{-# SPECIALISE INLINE rem
:: WrapIntegral Integer -> WrapIntegral Integer -> WrapIntegral Integer #-}
{-# SPECIALISE INLINE rem
:: WrapIntegral Word -> WrapIntegral Word -> WrapIntegral Word #-}
{-# INLINE rem #-}

instance (Eq a, P.Integral a) => PID (WrapIntegral a)
instance (Eq a, P.Integral a) => UFD (WrapIntegral a)
instance (Eq a, P.Integral a) => PID (WrapIntegral a) where
{-# SPECIALISE instance PID (WrapIntegral Int) #-}
{-# SPECIALISE instance PID (WrapIntegral Word) #-}
{-# SPECIALISE instance PID (WrapIntegral Integer) #-}
instance (Eq a, P.Integral a) => UFD (WrapIntegral a) where
{-# SPECIALISE instance UFD (WrapIntegral Int) #-}
{-# SPECIALISE instance UFD (WrapIntegral Word) #-}
{-# SPECIALISE instance UFD (WrapIntegral Integer) #-}

-- | Turning types from @'Numeric.Algebra'@ into Prelude's Num instances.
--
Expand Down Expand Up @@ -537,8 +632,11 @@ instance Euclidean a => P.Num (Fraction a) where
instance Euclidean d => P.Fractional (Fraction d) where
{-# SPECIALISE instance P.Fractional (Fraction Integer) #-}
fromRational r = fromInteger' (P.numerator r) % fromInteger' (P.denominator r)
{-# INLINE fromRational #-}
recip = NA.recip
{-# INLINE recip #-}
(/) = (NA./)
{-# INLINE (/) #-}

-- | @'Monoid'@ instances for @'Additive'@s.
-- N.B. Unlike @'WrapNum'@, @'P.Num'@ instance is
Expand Down
Loading