summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2010-02-20 17:08:59 +0000
committerAlberto Ruiz <aruiz@um.es>2010-02-20 17:08:59 +0000
commitdedd74ee85ee1bf468552107760541b31e6f1878 (patch)
tree2726f637f48498eef1af22ce03741a3353d8ec08 /examples
parentdc9cdee87db0181774cb230610e4b24f9ef3f89a (diff)
added simpler devel example
Diffstat (limited to 'examples')
-rw-r--r--examples/devel/ej1/functions.c (renamed from examples/devel/functions.c)9
-rw-r--r--examples/devel/ej1/wrappers.hs (renamed from examples/devel/wrappers.hs)9
-rw-r--r--examples/devel/ej2/functions.c24
-rw-r--r--examples/devel/ej2/wrappers.hs32
4 files changed, 65 insertions, 9 deletions
diff --git a/examples/devel/functions.c b/examples/devel/ej1/functions.c
index 6885a0e..02a4cdd 100644
--- a/examples/devel/functions.c
+++ b/examples/devel/ej1/functions.c
@@ -1,3 +1,5 @@
1/* assuming row order */
2
1typedef struct { double r, i; } doublecomplex; 3typedef struct { double r, i; } doublecomplex;
2 4
3#define DVEC(A) int A##n, double*A##p 5#define DVEC(A) int A##n, double*A##p
@@ -5,7 +7,7 @@ typedef struct { double r, i; } doublecomplex;
5#define DMAT(A) int A##r, int A##c, double*A##p 7#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 8#define CMAT(A) int A##r, int A##c, doublecomplex*A##p
7 9
8#define AT(M,r,c) (M##p[(r)*sr+(c)*sc]) 10#define AT(M,row,col) (M##p[(row)*M##c + (col)])
9 11
10/*-----------------------------------------------------*/ 12/*-----------------------------------------------------*/
11 13
@@ -19,9 +21,8 @@ int c_scale_vector(double s, DVEC(x), DVEC(y)) {
19 21
20/*-----------------------------------------------------*/ 22/*-----------------------------------------------------*/
21 23
22int c_diag(int ro, DMAT(m),DVEC(y),DMAT(z)) { 24int c_diag(DMAT(m),DVEC(y),DMAT(z)) {
23 int i,j,sr,sc; 25 int i,j;
24 if (ro==1) { sr = mc; sc = 1;} else { sr = 1; sc = mr;}
25 for (j=0; j<yn; j++) { 26 for (j=0; j<yn; j++) {
26 yp[j] = AT(m,j,j); 27 yp[j] = AT(m,j,j);
27 } 28 }
diff --git a/examples/devel/wrappers.hs b/examples/devel/ej1/wrappers.hs
index f9e258a..b329464 100644
--- a/examples/devel/wrappers.hs
+++ b/examples/devel/ej1/wrappers.hs
@@ -27,19 +27,18 @@ myScale s x = unsafePerformIO $ do
27 return y 27 return y
28 28
29----------------------------------------------------- 29-----------------------------------------------------
30-- forcing row order
30 31
31foreign import ccall "c_diag" 32foreign import ccall "c_diag"
32 cDiag :: CInt -- matrix order 33 cDiag :: CInt -> CInt -> Ptr Double -- argument
33 -> CInt -> CInt -> Ptr Double -- argument
34 -> CInt -> Ptr Double -- result1 34 -> CInt -> Ptr Double -- result1
35 -> CInt -> CInt -> Ptr Double -- result2 35 -> CInt -> CInt -> Ptr Double -- result2
36 -> IO CInt -- exit code 36 -> IO CInt -- exit code
37 37
38myDiag m = unsafePerformIO $ do 38myDiag m = unsafePerformIO $ do
39 y <- createVector (min r c) 39 y <- createVector (min r c)
40 z <- createMatrix (orderOf m) r c 40 z <- createMatrix RowMajor r c
41 app3 (cDiag o) mat m vec y mat z "cDiag" 41 app3 cDiag mat (cmat m) vec y mat z "cDiag"
42 return (y,z) 42 return (y,z)
43 where r = rows m 43 where r = rows m
44 c = cols m 44 c = cols m
45 o = if orderOf m == RowMajor then 1 else 0
diff --git a/examples/devel/ej2/functions.c b/examples/devel/ej2/functions.c
new file mode 100644
index 0000000..4dcd377
--- /dev/null
+++ b/examples/devel/ej2/functions.c
@@ -0,0 +1,24 @@
1/* general element order */
2
3typedef struct { double r, i; } doublecomplex;
4
5#define DVEC(A) int A##n, double*A##p
6#define CVEC(A) int A##n, doublecomplex*A##p
7#define DMAT(A) int A##r, int A##c, double*A##p
8#define CMAT(A) int A##r, int A##c, doublecomplex*A##p
9
10#define AT(M,r,c) (M##p[(r)*sr+(c)*sc])
11
12int c_diag(int ro, DMAT(m),DVEC(y),DMAT(z)) {
13 int i,j,sr,sc;
14 if (ro==1) { sr = mc; sc = 1;} else { sr = 1; sc = mr;}
15 for (j=0; j<yn; j++) {
16 yp[j] = AT(m,j,j);
17 }
18 for (i=0; i<mr; i++) {
19 for (j=0; j<mc; j++) {
20 AT(z,i,j) = i==j?yp[i]:0;
21 }
22 }
23 return 0;
24}
diff --git a/examples/devel/ej2/wrappers.hs b/examples/devel/ej2/wrappers.hs
new file mode 100644
index 0000000..399c5a9
--- /dev/null
+++ b/examples/devel/ej2/wrappers.hs
@@ -0,0 +1,32 @@
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 $ myDiag $ (3><5) [1..]
14
15-----------------------------------------------------
16-- arbitrary data order
17
18foreign import ccall "c_diag"
19 cDiag :: CInt -- matrix order
20 -> CInt -> CInt -> Ptr Double -- argument
21 -> CInt -> Ptr Double -- result1
22 -> CInt -> CInt -> Ptr Double -- result2
23 -> IO CInt -- exit code
24
25myDiag m = unsafePerformIO $ do
26 y <- createVector (min r c)
27 z <- createMatrix (orderOf m) r c
28 app3 (cDiag o) mat m vec y mat z "cDiag"
29 return (y,z)
30 where r = rows m
31 c = cols m
32 o = if orderOf m == RowMajor then 1 else 0