summaryrefslogtreecommitdiff
path: root/README
blob: f9034f0172980e094dcaea15e18ee71cec0bd1b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
A simple scientific library for Haskell
---------------------------------------

REQUIREMENTS

Development packages of:

1) GNU Scientific Library (http://www.gnu.org/software/gsl)

2) BLAS and LAPACK (http://www.netlib.org/lapack)

3) ATLAS (recommended) (http://math-atlas.sourceforge.net/)

For example, in Ubuntu Linux we need:

- libgsl0-dev
- refblas3-dev
- lapack3-dev
- atlas3-base-dev

You can also install an atlas version specifically tuned
for your machine (e.g., atlas3-sse2-dev, atlas3-3dnow-dev, etc.).
However, do not install atlas3-sse2-dev on ubuntu 6.06 Dapper
(see the TESTS section below).

The following packages are used for simple graphics:

- gnuplot
- imagemagick

It is also a good idea to install GNU-Octave to check
that the results obtained by this library are correct...

INSTALLATION

$ runhaskell Setup.lhs configure --prefix=$HOME
$ runhaskell Setup.lhs build
$ runhaskell Setup.lhs haddock
$ runhaskell Setup.lhs install --user

See below for installation on Windows.

TESTS

$ runhaskell examples/tests

Additional tests with big matrices (taking a few minutes):

$ runhaskell examples/tests --big

NOTE: On Ubuntu 6.06 LTS (Dapper) atlas3-sse2-dev (3.6.0-20)
produces segmentation faults when working with big matrices 
on compiled programs. To expose the problem:

$ cd examples
$ ghc --make -O tests.hs
$ ./tests --big

If this crashes, just uninstall atlas3-sse2 (atlas3-base-dev will be used).
Fortunately, atlas3-sse2-dev seems to work well on Ubuntu 7.10 Gutsy.

A similar problem was reported at:

http://article.gmane.org/gmane.linux.debian.devel.bugs.general/323065

EXAMPLES

$ ghci
Prelude> :m + Numeric.GSL
Prelude Numeric.GSL> let quad = integrateQNG 1E-10
Prelude Numeric.GSL> quad (^2) 0 1
(0.3333333333333333,3.700743415417188e-15)

Prelude Numeric.GSL> :m + Numeric.LinearAlgebra
Prelude Numeric.LinearAlgebra> let m = (2><3)[1,2,3,4,5,6::Double]
Prelude Numeric.LinearAlgebra> let (u,d,v) = full svd m
Prelude Numeric.LinearAlgebra> d
(2><3)
 [ 9.508032000695724,                0.0, 0.0
 ,               0.0, 0.7728696356734838, 0.0 ]
Prelude Numeric.LinearAlgebra> u <> d <> trans v
(2><3)
 [ 1.0000000000000004,               2.0, 3.0
 , 3.9999999999999996, 5.000000000000001, 6.0 ]
Prelude Numeric.GSL> :q
Leaving GHCi.

A few illustrative programs are included in the examples folder.

CHANGES

This is a new version of GSLHaskell. The package is provisionally
called "hssl" (a simple scientific library for Haskell) because only
a small part of GSL is available and linear algebra is based on LAPACK.

The code has been extensively refactored. There is a new internal representation
which admits both C and Fortran matrices and avoids many transposes.

There are only minor API changes:

- The matrix product operator (<>) is now overloaded only for matrix-matrix,
  matrix-vector and vector-matrix, with the same base type. Dot product and scaling
  of vectors or matrices is now denoted by `dot` or (<.>) and `scale` or (.*).
  Conversions from real to complex objects must now be explicit.

- Most linear algebra functions admit both real and complex objects. Utilities such as
  ident or constant are now polymorphic.

- Runtime errors produced by GSL or LAPACK can be handled using Control.Exeception.catch.

Old GSLHaskell code will work with small modifications.

INSTALLATION ON WINDOWS

1) Download the developer files gsl-1.8-lib.zip from
   http://gnuwin32.sourceforge.net/packages/gsl.htm
   and copy the gsl folder (under include) to the include folder of ghc:
   C:\ghc\ghc.6.6.1\include

2) Install the package as usual from the command line in the hssl-0.1 folder:
       runhaskell Setup.lhs configure
       runhaskell Setup.lhs build
       runhaskell Setup.lhs install

3) Copy libgsl.dll, libcblas.dll (from the binaries package gsl-1.8.bin.zip)
   and liblapack.dll (borrowed from the R system) to the folder where 
   hssl has been installed: C:\Program Files\haskell\hss-0.1\ghc-6.6.1.
   Rename libcblas.dll to libblas.dll.
   They are needed to compile programs.
   These three dlls are also available from
       http://perception.inf.um.es/~aruiz/darcs/HSSL/dll1.zip

4) Copy the dlls at http://perception.inf.um.es/~aruiz/darcs/HSSL/dll2.zip
   to the working directory or C:\windows\system
   They are required to run the programs and ghci.

Unfortunately the lapack dll supplied by the R system does not include
zgels_, zgelss_, and zgees_, so the functions depending on them
(linearSolveLS, linearSolveSVD, and schur for complex data)
will produce a "non supported in this OS" runtime error.

If you find an alternative free and complete lapack.dll which works well
for this system please let me know.

NOTE: I get a syntax error when compiling LAPACK.hs in Windows with ghc-opts -O.
      Please change it to ghc-opts -O0 in hssl.cabal and build again.
      You won't notice any appreciable difference in performance, but I will try to fix it asap.

ACKNOWLEDGEMENTS

I thank Henning Thielemann and all the people in the Haskell mailing lists for their help.

- Nico Mahlo discovered a bug in the eigendecomposition wrapper.

- Frederik Eaton discovered a bug in the design of the wrappers.

- Eric Kidd has created a wiki page explaining the installation on MacOS X:
  http://www.haskell.org/haskellwiki/GSLHaskell_on_MacOS_X

- Fawzi Mohamed discovered a portability bug in the lapack wrappers.

- Pedro E. López de Teruel fixed the interface to lapack.

- Antti Siira discovered a bug in the plotting functions.

- Paulo Tanimoto helped to fix the configuration of the required libraries.