Re: [Haskell] ANNOUNCE: An index-aware linear algebra library in Haskell

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: [Haskell] ANNOUNCE: An index-aware linear algebra library in Haskell

Alberto Ruiz-2
On Friday 14 April 2006 17:02, Frederik Eaton wrote:
> An index-aware linear algebra library in Haskell

Excellent work!

Is it possible to create a vector or matrix whose size is not known at compile
time?

> - Due to the need to specify index types at some point, input of
> vectors is difficult. I have provided two functions in Fu.Vector.Base
> which should cover most of the cases:
>
> listVec :: Vector v e => [e] -> (forall n . (ReflectNum n) => v (L n) -> w)
> -> w
> listMat :: Vector v e => [[e]] ->
>     (forall n m . (ReflectNum n, ReflectNum m) => v (L m, L n) -> w) -> w
>
> However, these aren't useful in interactive situations. So I have also
> provided some template-haskell routines
>
>   http://ofb.net/~frederik/futility/src/Vector/Template.hs
>
> which can be used to instantiate vectors directly. For example:

(In examples.hs):

>-- matrix with elements of type Double
>v6 = trans $(dAM [[1,2,3,4]])
>
>v7 = $(dAM [[1,0,0],[0,1,0],[0,0,1],[1,1,1]])

--
Alberto

_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe
Reply | Threaded
Open this post in threaded view
|

Re: [Haskell] ANNOUNCE: An index-aware linear algebra library in Haskell

Frederik Eaton-3
Yes, certainly... Otherwise the library would not be much use! If it
seems counterintuitive, as it did to me at first, you should check out
the "Implicit Configurations" paper, which uses modular arithmetic as
an example. My version of their code is in

http://ofb.net/~frederik/futility/src/Prepose.hs

The function I mainly use is:

reifyIntegral :: Integral a => a -> (forall s. ReflectNum s => s -> w) -> w

which turns an integral value into a type of the ReflectNum class
which represents that value, and calls the provided polymorphic
function with a dummy value (actually 'undefined') of that type; then
returning the function's result.

Frederik

On Sat, Apr 15, 2006 at 06:14:44PM +0200, Alberto Ruiz wrote:

> On Friday 14 April 2006 17:02, Frederik Eaton wrote:
> > An index-aware linear algebra library in Haskell
>
> Excellent work!
>
> Is it possible to create a vector or matrix whose size is not known at compile
> time?
>
> > - Due to the need to specify index types at some point, input of
> > vectors is difficult. I have provided two functions in Fu.Vector.Base
> > which should cover most of the cases:
> >
> > listVec :: Vector v e => [e] -> (forall n . (ReflectNum n) => v (L n) -> w)
> > -> w
> > listMat :: Vector v e => [[e]] ->
> >     (forall n m . (ReflectNum n, ReflectNum m) => v (L m, L n) -> w) -> w
> >
> > However, these aren't useful in interactive situations. So I have also
> > provided some template-haskell routines
> >
> >   http://ofb.net/~frederik/futility/src/Vector/Template.hs
> >
> > which can be used to instantiate vectors directly. For example:
>
> (In examples.hs):
>
> >-- matrix with elements of type Double
> >v6 = trans $(dAM [[1,2,3,4]])
> >
> >v7 = $(dAM [[1,0,0],[0,1,0],[0,0,1],[1,1,1]])
>
> --
> Alberto
>

--
http://ofb.net/~frederik/
_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe
Reply | Threaded
Open this post in threaded view
|

Re: [Haskell] ANNOUNCE: An index-aware linear algebra library in Haskell

Alberto Ruiz-2
It is really counterintuitive! I will study carefully your library and the
"Implicit Configurations" paper. Using static dimension checking we can write
very solid code for matrix computations...

However, I don't know how to write some definitions. For instance, this is ok:

m = $(dAM [[1,2,3]])

but with:

x = [[1,2,3]] :: [[Double]]
m1 = $(dAM x)
m2 = listMat x

main = do
    print m1
    print m2

I get:

Vector/examples.hs:35:11:
    GHC stage restriction: `x'
      is used in a top-level splice, and must be imported, not defined locally
    In the first argument of `dAM', namely `x'
    In the definition of `m1': m1 = $[splice](dAM x)

Vector/examples.hs:40:10:
    Inferred type is less polymorphic than expected
      Quantified type variable `m' escapes
      Quantified type variable `n' escapes
      Expected type: (v (L m, L n) -> w) -> t
      Inferred type: (forall n1 m1.
                      (ReflectNum n1, ReflectNum m1) =>
                      v (L m1, L n1) -> w)
                     -> w
    In the first argument of `print', namely `m2'
    In the result of a 'do' expression: print m2


I would also like to create a matrix from a data file:

main = do
    let m1 = $(dAM [[1,2],[3,4::Double]])
    s <- readFile "data.txt"
    let list = read s :: [[Double]]
    --let m2 = $(dAM list)
    let m2 = listMat list
    print $ m2 *> trans m1

But I get a similar error. Perhaps I must provide information about the
expected dimensions, but I don't know how to do it.

--
Alberto

On Saturday 15 April 2006 22:09, Frederik Eaton wrote:

> Yes, certainly... Otherwise the library would not be much use! If it
> seems counterintuitive, as it did to me at first, you should check out
> the "Implicit Configurations" paper, which uses modular arithmetic as
> an example. My version of their code is in
>
> http://ofb.net/~frederik/futility/src/Prepose.hs
>
> The function I mainly use is:
>
> reifyIntegral :: Integral a => a -> (forall s. ReflectNum s => s -> w) -> w
>
> which turns an integral value into a type of the ReflectNum class
> which represents that value, and calls the provided polymorphic
> function with a dummy value (actually 'undefined') of that type; then
> returning the function's result.
>
> Frederik
>
> On Sat, Apr 15, 2006 at 06:14:44PM +0200, Alberto Ruiz wrote:
> > On Friday 14 April 2006 17:02, Frederik Eaton wrote:
> > > An index-aware linear algebra library in Haskell
> >
> > Excellent work!
> >
> > Is it possible to create a vector or matrix whose size is not known at
> > compile time?
> >

_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe
Reply | Threaded
Open this post in threaded view
|

Re: [Haskell] ANNOUNCE: An index-aware linear algebra library in Haskell

Frederik Eaton-3
Hi Alberto,

Those are good questions, I've added some examples which hopefully
clarify the situation. Input and output of vectors is not a strong
point of the library, but I don't think there is a good alternative to
the way I do it.

  http://ofb.net/~frederik/futility/src/Vector/read-example.hs

(also, your example exposed some missing functionality. I've added
three new functions; in addition to listMat, now there are listMatCol,
listMatRow, and listMatSquare. Hopefully these should cover almost all
use cases.

  http://ofb.net/~frederik/futility/src/Vector/Base.hs
)

By the way, here is how I would download and run the thing, although
you seem to have figured it out:

$ wget http://ofb.net/~frederik/futility/futility-devel.tar.gz
$ tar -xvzf futility-devel.tar.gz
$ cd futility-devel/
$ ghc -fth --make Vector/read-example.hs -o read-example
$ ./read-example
<# 11.0, 23.0; 14.0, 30.0; 15.0, 33.0; 18.0, 40.0 #>
<1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0>
<1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0>
<# 1.0, 5.0; 2.0, 6.0; 3.0, 6.0; 4.0, 7.0 #>
<# 11.0, 23.0; 14.0, 30.0; 15.0, 33.0; 18.0, 40.0 #>
<# -3.0, -5.0; -5.0, -7.0 #>
<# 7.0, 10.0; 15.0, 22.0 #>

As for your questions:

> Vector/examples.hs:35:11:
>     GHC stage restriction: `x'
>       is used in a top-level splice, and must be imported, not defined locally
>     In the first argument of `dAM', namely `x'
>     In the definition of `m1': m1 = $[splice](dAM x)

This is a shortcoming of Template Haskell - it will not let you call a
function from a splice if that function is defined in the same file as
the splice. It should be possible to remove this shortcoming, but I
don't know what is planned.

> m2 = listMat x

This is not how listMat is used, see the example file above.

listMat takes a list of lists and a function, and passes the matrix
version of the list of lists to the function.

> I would also like to create a matrix from a data file:

See 'v3' in the example.

Cheers,

Frederik

On Sun, Apr 16, 2006 at 05:06:55PM +0200, Alberto Ruiz wrote:

> It is really counterintuitive! I will study carefully your library and the
> "Implicit Configurations" paper. Using static dimension checking we can write
> very solid code for matrix computations...
>
> However, I don't know how to write some definitions. For instance, this is ok:
>
> m = $(dAM [[1,2,3]])
>
> but with:
>
> x = [[1,2,3]] :: [[Double]]
> m1 = $(dAM x)
> m2 = listMat x
>
> main = do
>     print m1
>     print m2
>
> I get:
>
> Vector/examples.hs:35:11:
>     GHC stage restriction: `x'
>       is used in a top-level splice, and must be imported, not defined locally
>     In the first argument of `dAM', namely `x'
>     In the definition of `m1': m1 = $[splice](dAM x)
>
> Vector/examples.hs:40:10:
>     Inferred type is less polymorphic than expected
>       Quantified type variable `m' escapes
>       Quantified type variable `n' escapes
>       Expected type: (v (L m, L n) -> w) -> t
>       Inferred type: (forall n1 m1.
>                       (ReflectNum n1, ReflectNum m1) =>
>                       v (L m1, L n1) -> w)
>                      -> w
>     In the first argument of `print', namely `m2'
>     In the result of a 'do' expression: print m2
>
>
> I would also like to create a matrix from a data file:
>
> main = do
>     let m1 = $(dAM [[1,2],[3,4::Double]])
>     s <- readFile "data.txt"
>     let list = read s :: [[Double]]
>     --let m2 = $(dAM list)
>     let m2 = listMat list
>     print $ m2 *> trans m1
>
> But I get a similar error. Perhaps I must provide information about the
> expected dimensions, but I don't know how to do it.
>
> --
> Alberto
>
> On Saturday 15 April 2006 22:09, Frederik Eaton wrote:
> > Yes, certainly... Otherwise the library would not be much use! If it
> > seems counterintuitive, as it did to me at first, you should check out
> > the "Implicit Configurations" paper, which uses modular arithmetic as
> > an example. My version of their code is in
> >
> > http://ofb.net/~frederik/futility/src/Prepose.hs
> >
> > The function I mainly use is:
> >
> > reifyIntegral :: Integral a => a -> (forall s. ReflectNum s => s -> w) -> w
> >
> > which turns an integral value into a type of the ReflectNum class
> > which represents that value, and calls the provided polymorphic
> > function with a dummy value (actually 'undefined') of that type; then
> > returning the function's result.
> >
> > Frederik
> >
> > On Sat, Apr 15, 2006 at 06:14:44PM +0200, Alberto Ruiz wrote:
> > > On Friday 14 April 2006 17:02, Frederik Eaton wrote:
> > > > An index-aware linear algebra library in Haskell
> > >
> > > Excellent work!
> > >
> > > Is it possible to create a vector or matrix whose size is not known at
> > > compile time?
> > >
>

--
http://ofb.net/~frederik/
_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe