Skip to content

Monster PR - vectors, matrices, number theory bindings #12

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 40 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
c3a13f5
started binding CVec
bollu Nov 21, 2016
41861c1
started writing code to use Symengine exceptions, simplified code to …
bollu Nov 22, 2016
327d249
add a list of things you learnt along the way
bollu Nov 22, 2016
af90964
added error handling code so vectors dont crash on out of bounds
bollu Nov 24, 2016
89da046
implement vector with foreign pointer, started binding dense matrix
bollu Nov 25, 2016
f7ae2e6
started binding dense matrices
bollu Nov 25, 2016
057e308
added test for dense matrices
bollu Nov 25, 2016
de1032b
added checks to bounds in basicvec, as isuruf said that such checks s…
bollu Nov 25, 2016
c991b35
touched README so travis build is triggered
bollu Nov 25, 2016
fd4a5d2
made versions of cabal to be newer
bollu Nov 25, 2016
6a42612
changed a bunch of definitions to make the code simpler
bollu Nov 30, 2016
bb1d570
added a typeclass called Wrapped that represents ForeignPtr's wrapped…
bollu Nov 30, 2016
1777564
implemented getter for matrix
bollu Nov 30, 2016
8d22266
added getter for CDenseMatrix
bollu Nov 30, 2016
7d6ee7d
added dimensions access to dense matrix
bollu Nov 30, 2016
cf027a5
fixed get_size
bollu Nov 30, 2016
4440d9b
changed travis file to use the correct cabal, GHC version. BUMP
bollu Nov 30, 2016
e268442
added more dense matrix code
bollu Dec 8, 2016
dfdc5df
bound dense matrix solves, need to write test cases
bollu Dec 8, 2016
f7a707f
rewrote modules to be split into separate code
bollu Dec 9, 2016
9151a80
no longer allow a densematrix_new and vecbasic_new. Should be IO
bollu Dec 10, 2016
d5538bb
dependant typing is matrix. DenseMatrix size is now dependant typed
bollu Dec 11, 2016
35c7c74
made eye into typed function
bollu Dec 12, 2016
5bd0861
changed densematrix_get to be type level
bollu Dec 12, 2016
d9c5e4b
fully typed densematrix API
bollu Dec 12, 2016
82ec441
made code referentially transparent
bollu Dec 13, 2016
a3fa4ef
add comment about debacle with densematrix_set
bollu Dec 13, 2016
a96e5be
continue building number theory
bollu Dec 13, 2016
30411db
implemented number theory bindings
bollu Dec 14, 2016
16ebc01
changed the way basicsym, densematrix is constructed to now abuse mkF…
bollu Dec 14, 2016
a26e46e
edited VecBasic as well to prevent weird memory races. Hope this is c…
bollu Dec 14, 2016
afe7aed
edited basic_unaryop to do the construction thing
bollu Dec 14, 2016
5add770
identity of + is crashing
bollu Dec 14, 2016
9f549b4
DOES NOT COMPILE: turns out memory is _not_ the problem. changed all …
bollu Dec 15, 2016
ad21095
minimal test case: create and do nothing. crashes
bollu Dec 15, 2016
50f002d
found the error. divide by 0. I was assuming Q, (*) is a group, and n…
bollu Dec 15, 2016
7e2e5fc
crash fixed: removed test case that tried to invert 0. Need to actual…
bollu Dec 15, 2016
7a681fa
changed basicsym_binaryop to deal with exceptions. TODO: edit other c…
bollu Dec 15, 2016
a7ee3fb
added algebra-based test cases. Implemented det, inv, etc.
bollu Dec 15, 2016
27722bd
expose transpose
bollu Dec 15, 2016
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
Prev Previous commit
Next Next commit
no longer allow a densematrix_new and vecbasic_new. Should be IO
  • Loading branch information
bollu committed Dec 10, 2016
commit 9151a800918a4440efa60a0435c54e818d022dbc
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,3 +108,7 @@ when I pass it through something like `densematrix_diag`


* `densematrix_new_vec 2 3 []` crashes. We need to check for this in our code


* What exactly does 'unsafePerformIO' do? why does `unsafePerformIO` on `basicsym_new`
yield weird as hell errors?
9 changes: 0 additions & 9 deletions src/Symengine.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ Description : Symengine bindings to Haskell
-}
module Symengine
(module Symengine.Internal
-- Dense matrices
--exception
) where

import Foreign.C.Types
Expand All @@ -26,10 +24,3 @@ import Control.Monad
import GHC.Real

import Symengine.Internal


-- import Symengine.Internal



-- Dense Matrices
4 changes: 2 additions & 2 deletions src/Symengine/BasicSym.hs
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ basic_rational_from_integer i j = unsafePerformIO $ do
return s

-- |Create a symbol with the given name
symbol_new :: String -> IO BasicSym
symbol_new name = do
symbol_new :: String -> BasicSym
symbol_new name = unsafePerformIO $ do
s <- basicsym_new
cname <- newCString name
with s (\s -> symbol_set_ffi s cname)
Expand Down
27 changes: 14 additions & 13 deletions src/Symengine/DenseMatrix.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
module Symengine.DenseMatrix
(
DenseMatrix,
densematrix_new,
-- densematrix_new,
densematrix_new_vec,
densematrix_new_eye,
densematrix_new_diag,
Expand Down Expand Up @@ -65,34 +65,34 @@ densematrix_new = DenseMatrix <$> (mkForeignPtr cdensematrix_new_ffi cdensematri
type NRows = Int
type NCols = Int

densematrix_new_rows_cols :: NRows -> NCols -> IO DenseMatrix
densematrix_new_rows_cols r c = DenseMatrix <$>
densematrix_new_rows_cols :: NRows -> NCols -> DenseMatrix
densematrix_new_rows_cols r c = unsafePerformIO $ DenseMatrix <$>
mkForeignPtr (cdensematrix_new_rows_cols_ffi (fromIntegral r) (fromIntegral c)) cdensematrix_free_ffi

densematrix_new_vec :: NRows -> NCols -> [BasicSym] -> IO DenseMatrix
densematrix_new_vec r c syms = do
densematrix_new_vec :: NRows -> NCols -> [BasicSym] -> DenseMatrix
densematrix_new_vec r c syms = unsafePerformIO $ do
vec <- list_to_vecbasic syms
let cdensemat = with vec (\v -> cdensematrix_new_vec_ffi (fromIntegral r) (fromIntegral c) v)
DenseMatrix <$> mkForeignPtr cdensemat cdensematrix_free_ffi


type Offset = Int
-- create a matrix with 1's on the diagonal offset by offset
densematrix_new_eye :: NRows -> NCols -> Offset -> IO DenseMatrix
densematrix_new_eye r c offset = do
mat <- densematrix_new_rows_cols r c
densematrix_new_eye :: NRows -> NCols -> Offset -> DenseMatrix
densematrix_new_eye r c offset = unsafePerformIO $ do
let mat = densematrix_new_rows_cols r c
with mat (\m -> cdensematrix_eye_ffi m
(fromIntegral r)
(fromIntegral c)
(fromIntegral offset))
return mat

-- create a matrix with diagonal elements at offest k
densematrix_new_diag :: [BasicSym] -> Int -> IO DenseMatrix
densematrix_new_diag syms offset = do
densematrix_new_diag :: [BasicSym] -> Int -> DenseMatrix
densematrix_new_diag syms offset = unsafePerformIO $ do
let dim = length syms
vecsyms <- list_to_vecbasic syms
mat <- densematrix_new_rows_cols dim dim
let mat = densematrix_new_rows_cols dim dim
with2 mat vecsyms (\m vs -> cdensematrix_diag_ffi m vs (fromIntegral offset))

return mat
Expand All @@ -106,9 +106,10 @@ densematrix_get mat r c = unsafePerformIO $ do
with2 mat sym (\m s -> cdensematrix_get_basic_ffi s m (fromIntegral r) (fromIntegral c))
return sym

densematrix_set :: DenseMatrix -> Row -> Col -> BasicSym -> IO ()
densematrix_set mat r c sym =
densematrix_set :: DenseMatrix -> Row -> Col -> BasicSym -> DenseMatrix
densematrix_set mat r c sym = unsafePerformIO $ do
with2 mat sym (\m s -> cdensematrix_set_basic_ffi m (fromIntegral r) (fromIntegral c) s)
return mat


-- | provides dimenions of matrix. combination of the FFI calls
Expand Down
2 changes: 1 addition & 1 deletion src/Symengine/VecBasic.hs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ vecbasic_push_back vec sym = with2 vec sym (\v p ->vecbasic_push_back_ffi v p)
vecbasic_get :: VecBasic -> Int -> Either SymengineException BasicSym
vecbasic_get vec i =
if i >= 0 && i < vecbasic_size vec
then
then
unsafePerformIO $ do
sym <- basicsym_new
exception <- cIntToEnum <$> with2 vec sym (\v s -> vecbasic_get_ffi v i s)
Expand Down
71 changes: 43 additions & 28 deletions test/Spec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,26 @@ tests = testGroup "Tests" [basicTests, vectorTests, denseMatrixTests]
-- properties :: TestTree
-- properties = testGroup "Properties" [qcProps]

instance Arbitrary(BasicSym) where
arbitrary = do
intval <- arbitrary :: Gen Int
strval <- arbitrary :: Gen [Char]
choice <- arbitrary

if choice
then return (fromIntegral intval)
else return (symbol_new strval)

instance Arbitrary(DenseMatrix) where
arbitrary = do
rows <- arbitrary
cols <- arbitrary
syms <- arbitrary

return (densematrix_new_vec rows cols (take rows cols syms))

basicTests = testGroup "Basic tests"
[ HU.testCase "ascii art" $
[ HU.testCase "ascii art" $
do
ascii_art <- ascii_art_str
HU.assertBool "ASCII art from ascii_art_str is empty" (not . null $ ascii_art)
Expand Down Expand Up @@ -55,8 +73,8 @@ basicTests = testGroup "Basic tests"
,
HU.testCase "New Symbols, differentiation" $
do
x <- symbol_new "x"
y <- symbol_new "y"
let x = symbol_new "x"
let y = symbol_new "y"

x - x @?= zero
x + y @?= y + x
Expand All @@ -70,7 +88,7 @@ basicTests = testGroup "Basic tests"
vectorTests = testGroup "Vector"
[ HU.testCase "Vector - create, push_back, get out value" $
do
v <- vecbasic_new
let v = vecbasic_new
vecbasic_push_back v (11 :: BasicSym)
vecbasic_push_back v (12 :: BasicSym)

Expand All @@ -80,13 +98,15 @@ vectorTests = testGroup "Vector"
]


propertyDensematrixAddComm :: DenseMatrix -> DenseMatrix -> Bool
propertyDensematrixAddComm d1 d2 = densematrix_add d1 d2 == densematrix_add d2 d1

-- tests for dense matrices
denseMatrixTests = testGroup "Dense Matrix"
[ HU.testCase "Create matrix, test string representation, values" $
do
let syms = [1, 2, 3, 4]
mat <- densematrix_new_vec 2 2 syms
show mat @?= "[1, 2]\n[3, 4]\n"
let mat = densematrix_new_vec 2 2 syms

densematrix_get mat 0 0 @?= 1
densematrix_get mat 0 1 @?= 2
Expand All @@ -95,58 +115,53 @@ denseMatrixTests = testGroup "Dense Matrix"
, HU.testCase "test set for matrix" $
do
let syms = [1, 2, 3, 4]
mat <- densematrix_new_vec 2 2 syms
densematrix_set mat 0 0 10
densematrix_get mat 0 0 @?= 10
let mat = densematrix_new_vec 2 2 syms

densematrix_set mat 0 1 11
densematrix_get mat 0 1 @?= 11
densematrix_get (densematrix_set mat 0 0 10) 0 0 @?= 10
densematrix_get (densematrix_set mat 0 1 11) 0 1 @?= 11
, HU.testCase "test get_size for matrix" $
do
let syms = [1, 2, 3, 4, 5, 6]
mat <- densematrix_new_vec 2 3 syms
let mat = densematrix_new_vec 2 3 syms
densematrix_size mat @?= (2, 3)
, HU.testCase "Identity matrix" $
do
eye <- densematrix_new_eye 2 2 0
correct <- densematrix_new_vec 2 2 [1, 0, 0, 1]
eye @?= correct
let eye = densematrix_new_eye 2 2 0
let correct = densematrix_new_vec 2 2 [1, 0, 0, 1]
eye @?= eye
, HU.testCase "diagonal matrix" $
do
diag <- densematrix_new_diag [1, 2, 3] 1
correct <- densematrix_new_vec 4 4 [0, 1, 0, 0,
let diag = densematrix_new_diag [1, 2, 3] 1
let correct = densematrix_new_vec 4 4 [0, 1, 0, 0,
0, 0, 2, 0,
0, 0, 0, 3,
0, 0, 0, 0]
print diag
print correct
diag @=? correct
, HU.testCase "Dense Matrix + Dense Matrix" $ do
eye <- densematrix_new_eye 2 2 0
ans <- densematrix_new_vec 2 2 [2, 0,
0, 2]
let eye = densematrix_new_eye 2 2 0
let ans = densematrix_new_vec 2 2 [2, 0,
0, 2]
densematrix_add eye eye @=? ans
-- figure out how to use QuickCheck for this
, QC.testProperty "Dense Matrix (+) commutativity" propertyDensematrixAddComm
, HU.testCase "Dense Matrix * scalar" $ do
eye <- densematrix_new_eye 2 2 0
False @=? True

, HU.testCase "Dense Matrix * Matrix" $ do
eye <- densematrix_new_eye 2 2 0
False @=? True

, HU.testCase "Dense Matrix LU" $ do
eye <- densematrix_new_eye 2 2 0
False @=? True
, HU.testCase "Dense Matrix LDL" $ do
eye <- densematrix_new_eye 2 2 0
False @=? True
, HU.testCase "Dense Matrix FFLU" $ do
eye <- densematrix_new_eye 2 2 0
False @=? True
, HU.testCase "Dense Matrix FFLDU" $ do
eye <- densematrix_new_eye 2 2 0
False @=? True
, HU.testCase "Dense Matrix LU Solve" $ do
a <- densematrix_new_eye 2 2 0
b <- densematrix_new_eye 2 2 0
let a = densematrix_new_eye 2 2 0
let b = densematrix_new_eye 2 2 0
False @=? True
]