summaryrefslogtreecommitdiff
path: root/examples/devel
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2009-05-13 09:39:25 +0000
committerAlberto Ruiz <aruiz@um.es>2009-05-13 09:39:25 +0000
commit6809103cf34a9345f8cb60a0ec3a8f55dd18d5ef (patch)
treec100100bfd26021c6130be16013e493db78cea16 /examples/devel
parentedabccf9d9564573359ebf795f4ce9cce7b15816 (diff)
added Development module
Diffstat (limited to 'examples/devel')
-rw-r--r--examples/devel/functions.c34
-rw-r--r--examples/devel/wrappers.hs45
2 files changed, 79 insertions, 0 deletions
diff --git a/examples/devel/functions.c b/examples/devel/functions.c
new file mode 100644
index 0000000..6885a0e
--- /dev/null
+++ b/examples/devel/functions.c
@@ -0,0 +1,34 @@
1typedef struct { double r, i; } doublecomplex;
2
3#define DVEC(A) int A##n, double*A##p
4#define CVEC(A) int A##n, doublecomplex*A##p
5#define DMAT(A) int A##r, int A##c, double*A##p
6#define CMAT(A) int A##r, int A##c, doublecomplex*A##p
7
8#define AT(M,r,c) (M##p[(r)*sr+(c)*sc])
9
10/*-----------------------------------------------------*/
11
12int c_scale_vector(double s, DVEC(x), DVEC(y)) {
13 int k;
14 for (k=0; k<=yn; k++) {
15 yp[k] = s*xp[k];
16 }
17 return 0;
18}
19
20/*-----------------------------------------------------*/
21
22int c_diag(int ro, DMAT(m),DVEC(y),DMAT(z)) {
23 int i,j,sr,sc;
24 if (ro==1) { sr = mc; sc = 1;} else { sr = 1; sc = mr;}
25 for (j=0; j<yn; j++) {
26 yp[j] = AT(m,j,j);
27 }
28 for (i=0; i<mr; i++) {
29 for (j=0; j<mc; j++) {
30 AT(z,i,j) = i==j?yp[i]:0;
31 }
32 }
33 return 0;
34}
diff --git a/examples/devel/wrappers.hs b/examples/devel/wrappers.hs
new file mode 100644
index 0000000..f9e258a
--- /dev/null
+++ b/examples/devel/wrappers.hs
@@ -0,0 +1,45 @@
1{-# LANGUAGE ForeignFunctionInterface #-}
2
3-- $ ghc -O2 --make wrappers.hs functions.c
4
5import Numeric.LinearAlgebra
6import Data.Packed.Development
7import Foreign(Ptr,unsafePerformIO)
8import Foreign.C.Types(CInt)
9
10-----------------------------------------------------
11
12main = do
13 print $ myScale 3.0 (fromList [1..10])
14 print $ myDiag $ (3><5) [1..]
15
16-----------------------------------------------------
17
18foreign import ccall "c_scale_vector"
19 cScaleVector :: Double -- scale
20 -> CInt -> Ptr Double -- argument
21 -> CInt -> Ptr Double -- result
22 -> IO CInt -- exit code
23
24myScale s x = unsafePerformIO $ do
25 y <- createVector (dim x)
26 app2 (cScaleVector s) vec x vec y "cScaleVector"
27 return y
28
29-----------------------------------------------------
30
31foreign import ccall "c_diag"
32 cDiag :: CInt -- matrix order
33 -> CInt -> CInt -> Ptr Double -- argument
34 -> CInt -> Ptr Double -- result1
35 -> CInt -> CInt -> Ptr Double -- result2
36 -> IO CInt -- exit code
37
38myDiag m = unsafePerformIO $ do
39 y <- createVector (min r c)
40 z <- createMatrix (orderOf m) r c
41 app3 (cDiag o) mat m vec y mat z "cDiag"
42 return (y,z)
43 where r = rows m
44 c = cols m
45 o = if orderOf m == RowMajor then 1 else 0