Aleksey Khudyakov | 10 Nov 12:59 2012
Picon

ANN: fixed-vector

Hello cafe!

I want to announce library for the small vectors of fixed length
fixed-vector[1]. Fixed means that vector's length is determined
by its type.

Generic API can work with both ATD-based vector like complex or
Vec written below and array-based ones.

> data Vec a = Vec a a a

It's based on post by Roman Leschinsiy[2].

Library also provide array-based vectors with memory
representation similar to onves from vector package. It's more
compact though because there is no need to store lengh and and
offset to first element.

[1] http://hackage.haskell.org/package/fixed-vector
[2] http://unlines.wordpress.com/2010/11/15/generics-for-small-fixed-size-vectors/
Michael Orlitzky | 12 Nov 05:18 2012

Re: ANN: fixed-vector

On 11/10/2012 06:59 AM, Aleksey Khudyakov wrote:
> Hello cafe!
> 
> I want to announce library for the small vectors of fixed length
> fixed-vector[1]. Fixed means that vector's length is determined
> by its type.
> 
> Generic API can work with both ATD-based vector like complex or
> Vec written below and array-based ones.
> 
>> data Vec a = Vec a a a
> 
> It's based on post by Roman Leschinsiy[2].
> 
> 
> Library also provide array-based vectors with memory
> representation similar to onves from vector package. It's more
> compact though because there is no need to store lengh and and
> offset to first element.
> 
> [1] http://hackage.haskell.org/package/fixed-vector
> [2] http://unlines.wordpress.com/2010/11/15/generics-for-small-fixed-size-vectors/

I have a lot of one-off code where I've defined these myself. Is it
possible to e.g. define vectors in R^2 and R^3, and write the p-norm
functions only once?
Carter Schonwald | 12 Nov 07:57 2012
Picon

Re: ANN: fixed-vector

Michael, I think that calls for a type-class! 

(though I imagine theres a slicker way of writing it)


On Sun, Nov 11, 2012 at 11:18 PM, Michael Orlitzky <michael <at> orlitzky.com> wrote:
On 11/10/2012 06:59 AM, Aleksey Khudyakov wrote:
> Hello cafe!
>
> I want to announce library for the small vectors of fixed length
> fixed-vector[1]. Fixed means that vector's length is determined
> by its type.
>
> Generic API can work with both ATD-based vector like complex or
> Vec written below and array-based ones.
>
>> data Vec a = Vec a a a
>
> It's based on post by Roman Leschinsiy[2].
>
>
> Library also provide array-based vectors with memory
> representation similar to onves from vector package. It's more
> compact though because there is no need to store lengh and and
> offset to first element.
>
> [1] http://hackage.haskell.org/package/fixed-vector
> [2] http://unlines.wordpress.com/2010/11/15/generics-for-small-fixed-size-vectors/


I have a lot of one-off code where I've defined these myself. Is it
possible to e.g. define vectors in R^2 and R^3, and write the p-norm
functions only once?

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Michael Orlitzky | 13 Nov 02:27 2012

Re: ANN: fixed-vector

On 11/12/12 01:57, Carter Schonwald wrote:
> Michael, I think that calls for a type-class! 
> (though I imagine theres a slicker way of writing it)
> 

I'm already using typeclasses, but there's still a bit of boilerplate. I
could probably think of something more clever myself, but like I said,
these are just one-off experiments, and I'm lazy. So I'm hoping
fixed-vector will do it for me!
Aleksey Khudyakov | 12 Nov 13:05 2012
Picon

Re: ANN: fixed-vector

> I have a lot of one-off code where I've defined these myself. Is it
> possible to e.g. define vectors in R^2 and R^3, and write the p-norm
> functions only once?
>

Yes. it's possible.

> {-# LANGUAGE TypeFamilies #-}
> {-# LANGUAGE FlexibleInstances #-}
> {-# LANGUAGE MultiParamTypeClasses #-}
> import Data.Vector.Fixed as V
> import Data.Vector.Fixed.Internal
> -- ^^^ Needed for Fun /will be reexported from Data.Vector.Fixed
> import Data.Vector.Fixed.Unboxed

First we need to define data types and instances. It's possible to use
vectors from library

> data Vec2D a = Vec2D a a
>
> type instance Dim Vec2D = S (S Z)
>
> instance Vector Vec2D a where
>   inspect (Vec2D x y) (Fun f) = f x y
>   construct = Fun Vec2D
>
>
> data Vec3D a = Vec3D a a a
>
> type instance Dim Vec3D = S (S (S Z))
>
> instance Vector Vec3D a where
>   inspect (Vec3D x y z) (Fun f) = f x y z
>   construct = Fun Vec3D
>

Now we can define generic p-norm. Maybe you had something different in
mind but still it's function which will work with any vector of fixed
length.

> pNorm :: (Vector v a, Floating a) => a -> v a -> a
> pNorm p = (** recip p) . V.sum . V.map ((** p) . abs)

We will get folloiwng in GHCi:

*Main> pNorm 1 $ Vec2D 1 2 :: Double
3.0
*Main> pNorm 1 $ Vec3D 1 2 3 :: Double
6.0

It's possible to avoid defining data types and use generic vectors
from library. Vec2 is synonym to Data.Vector.Fixed.Unboxed.Vec (S (S Z))

*Main> pNorm 2 (vec $ con |> 1 |> 2 :: Vec2 Double)
2.23606797749979

At the moment their construction is a bit cumbersome
so used replicate to illustrate other vector sizes.

*Main> pNorm 1 (V.replicate 1 :: Vec2 Double)
2.0
*Main> pNorm 1 (V.replicate 1 :: Vec (S (S (S Z))) Double)
3.0
*Main> pNorm 1 (V.replicate 1 :: Vec (S (S (S (S Z)))) Double)
4.0
Michael Orlitzky | 13 Nov 02:32 2012

Re: ANN: fixed-vector

On 11/12/12 07:05, Aleksey Khudyakov wrote:
>> I have a lot of one-off code where I've defined these myself. Is it
>> possible to e.g. define vectors in R^2 and R^3, and write the p-norm
>> functions only once?
>>
> 
> Yes. it's possible.
> 
>> {-# LANGUAGE TypeFamilies #-}
>> {-# LANGUAGE FlexibleInstances #-}
>> {-# LANGUAGE MultiParamTypeClasses #-}
>> import Data.Vector.Fixed as V
>> import Data.Vector.Fixed.Internal
>> -- ^^^ Needed for Fun /will be reexported from Data.Vector.Fixed
>> import Data.Vector.Fixed.Unboxed
> 
> First we need to define data types and instances. It's possible to use
> vectors from library
> 
> ...

Thanks, this looks like exactly what I need. I'll try to replace my R^2
and R^3 implementations the next time I do my homework before the last
minute.

Gmane