diff options
Diffstat (limited to 'lib/Data')
-rw-r--r-- | lib/Data/Packed/Matrix.hs | 114 |
1 files changed, 63 insertions, 51 deletions
diff --git a/lib/Data/Packed/Matrix.hs b/lib/Data/Packed/Matrix.hs index 8694249..9059723 100644 --- a/lib/Data/Packed/Matrix.hs +++ b/lib/Data/Packed/Matrix.hs | |||
@@ -4,7 +4,6 @@ | |||
4 | {-# LANGUAGE MultiParamTypeClasses #-} | 4 | {-# LANGUAGE MultiParamTypeClasses #-} |
5 | {-# LANGUAGE FunctionalDependencies #-} | 5 | {-# LANGUAGE FunctionalDependencies #-} |
6 | 6 | ||
7 | |||
8 | ----------------------------------------------------------------------------- | 7 | ----------------------------------------------------------------------------- |
9 | -- | | 8 | -- | |
10 | -- Module : Data.Packed.Matrix | 9 | -- Module : Data.Packed.Matrix |
@@ -22,6 +21,7 @@ | |||
22 | module Data.Packed.Matrix ( | 21 | module Data.Packed.Matrix ( |
23 | Element, RealElement, Container(..), | 22 | Element, RealElement, Container(..), |
24 | Convert(..), RealOf, ComplexOf, SingleOf, DoubleOf, ElementOf, | 23 | Convert(..), RealOf, ComplexOf, SingleOf, DoubleOf, ElementOf, |
24 | Precision(..), comp, real'', complex'', | ||
25 | AutoReal(..), | 25 | AutoReal(..), |
26 | Matrix,rows,cols, | 26 | Matrix,rows,cols, |
27 | (><), | 27 | (><), |
@@ -471,53 +471,54 @@ toBlocksEvery r c m = toBlocks rs cs m where | |||
471 | 471 | ||
472 | ------------------------------------------------------------------- | 472 | ------------------------------------------------------------------- |
473 | 473 | ||
474 | -- | conversion utilities | 474 | -- | Supported single-double precision type pairs |
475 | 475 | class (Element s, Element d) => Precision s d | s -> d, d -> s where | |
476 | class (Element t, Element (Complex t), RealFloat t) => RealElement t | ||
477 | |||
478 | instance RealElement Double | ||
479 | instance RealElement Float | ||
480 | |||
481 | class (Element s, Element d) => Prec s d | s -> d, d -> s where | ||
482 | double2FloatG :: Vector d -> Vector s | 476 | double2FloatG :: Vector d -> Vector s |
483 | float2DoubleG :: Vector s -> Vector d | 477 | float2DoubleG :: Vector s -> Vector d |
484 | 478 | ||
485 | instance Prec Float Double where | 479 | instance Precision Float Double where |
486 | double2FloatG = double2FloatV | 480 | double2FloatG = double2FloatV |
487 | float2DoubleG = float2DoubleV | 481 | float2DoubleG = float2DoubleV |
488 | 482 | ||
489 | instance Prec (Complex Float) (Complex Double) where | 483 | instance Precision (Complex Float) (Complex Double) where |
490 | double2FloatG = asComplex . double2FloatV . asReal | 484 | double2FloatG = asComplex . double2FloatV . asReal |
491 | float2DoubleG = asComplex . float2DoubleV . asReal | 485 | float2DoubleG = asComplex . float2DoubleV . asReal |
492 | 486 | ||
487 | -- | Supported real types | ||
488 | class (Element t, Element (Complex t), RealFloat t) => RealElement t | ||
489 | |||
490 | instance RealElement Double | ||
491 | |||
492 | instance RealElement Float | ||
493 | 493 | ||
494 | -- | Conversion utilities | ||
494 | class Container c where | 495 | class Container c where |
495 | toComplex :: (RealElement e) => (c e, c e) -> c (Complex e) | 496 | toComplex :: (RealElement e) => (c e, c e) -> c (Complex e) |
496 | fromComplex :: (RealElement e) => c (Complex e) -> (c e, c e) | 497 | fromComplex :: (RealElement e) => c (Complex e) -> (c e, c e) |
497 | comp :: (RealElement e) => c e -> c (Complex e) | 498 | complex' :: (RealElement e) => c e -> c (Complex e) |
498 | conj :: (RealElement e) => c (Complex e) -> c (Complex e) | 499 | conj :: (RealElement e) => c (Complex e) -> c (Complex e) |
499 | cmap :: (Element a, Element b) => (a -> b) -> c a -> c b | 500 | cmap :: (Element a, Element b) => (a -> b) -> c a -> c b |
500 | single :: Prec a b => c b -> c a | 501 | single' :: Precision a b => c b -> c a |
501 | double :: Prec a b => c a -> c b | 502 | double' :: Precision a b => c a -> c b |
502 | 503 | ||
503 | instance Container Vector where | 504 | instance Container Vector where |
504 | toComplex = toComplexV | 505 | toComplex = toComplexV |
505 | fromComplex = fromComplexV | 506 | fromComplex = fromComplexV |
506 | comp v = toComplex (v,constantD 0 (dim v)) | 507 | complex' v = toComplex (v,constantD 0 (dim v)) |
507 | conj = conjV | 508 | conj = conjV |
508 | cmap = mapVector | 509 | cmap = mapVector |
509 | single = double2FloatG | 510 | single' = double2FloatG |
510 | double = float2DoubleG | 511 | double' = float2DoubleG |
511 | 512 | ||
512 | instance Container Matrix where | 513 | instance Container Matrix where |
513 | toComplex = uncurry $ liftMatrix2 $ curry toComplex | 514 | toComplex = uncurry $ liftMatrix2 $ curry toComplex |
514 | fromComplex z = (reshape c *** reshape c) . fromComplex . flatten $ z | 515 | fromComplex z = (reshape c *** reshape c) . fromComplex . flatten $ z |
515 | where c = cols z | 516 | where c = cols z |
516 | comp = liftMatrix comp | 517 | complex' = liftMatrix complex' |
517 | conj = liftMatrix conj | 518 | conj = liftMatrix conj |
518 | cmap f = liftMatrix (cmap f) | 519 | cmap f = liftMatrix (cmap f) |
519 | single = liftMatrix single | 520 | single' = liftMatrix single' |
520 | double = liftMatrix double | 521 | double' = liftMatrix double' |
521 | 522 | ||
522 | ------------------------------------------------------------------- | 523 | ------------------------------------------------------------------- |
523 | 524 | ||
@@ -560,54 +561,65 @@ type instance ElementOf (Matrix a) = a | |||
560 | 561 | ||
561 | -- | generic conversion functions | 562 | -- | generic conversion functions |
562 | class Convert t where | 563 | class Convert t where |
563 | real' :: Container c => c (RealOf t) -> c t | 564 | real :: Container c => c (RealOf t) -> c t |
564 | complex' :: Container c => c t -> c (ComplexOf t) | 565 | complex :: Container c => c t -> c (ComplexOf t) |
565 | single' :: Container c => c t -> c (SingleOf t) | 566 | single :: Container c => c t -> c (SingleOf t) |
566 | double' :: Container c => c t -> c (DoubleOf t) | 567 | double :: Container c => c t -> c (DoubleOf t) |
567 | 568 | ||
568 | instance Convert Double where | 569 | instance Convert Double where |
569 | real' = id | 570 | real = id |
570 | complex' = comp | 571 | complex = complex' |
571 | single' = single | 572 | single = single' |
572 | double' = id | 573 | double = id |
573 | 574 | ||
574 | instance Convert Float where | 575 | instance Convert Float where |
575 | real' = id | 576 | real = id |
576 | complex' = comp | 577 | complex = complex' |
577 | single' = id | 578 | single = id |
578 | double' = double | 579 | double = double' |
579 | 580 | ||
580 | instance Convert (Complex Double) where | 581 | instance Convert (Complex Double) where |
581 | real' = comp | 582 | real = complex' |
582 | complex' = id | 583 | complex = id |
583 | single' = single | 584 | single = single' |
584 | double' = id | 585 | double = id |
585 | 586 | ||
586 | instance Convert (Complex Float) where | 587 | instance Convert (Complex Float) where |
587 | real' = comp | 588 | real = complex' |
588 | complex' = id | 589 | complex = id |
589 | single' = id | 590 | single = id |
590 | double' = double | 591 | double = double' |
591 | 592 | ||
592 | ------------------------------------------------------------------- | 593 | ------------------------------------------------------------------- |
593 | 594 | ||
595 | |||
594 | -- | to be replaced by Convert | 596 | -- | to be replaced by Convert |
595 | class AutoReal t where | 597 | class Convert t => AutoReal t where |
596 | real :: Container c => c Double -> c t | 598 | real''' :: Container c => c Double -> c t |
597 | complex :: Container c => c t -> c (Complex Double) | 599 | complex''' :: Container c => c t -> c (Complex Double) |
598 | 600 | ||
599 | instance AutoReal Double where | 601 | instance AutoReal Double where |
600 | real = real' | 602 | real''' = real |
601 | complex = complex' | 603 | complex''' = complex |
602 | 604 | ||
603 | instance AutoReal (Complex Double) where | 605 | instance AutoReal (Complex Double) where |
604 | real = real' | 606 | real''' = real |
605 | complex = complex' | 607 | complex''' = complex |
606 | 608 | ||
607 | instance AutoReal Float where | 609 | instance AutoReal Float where |
608 | real = real' . single | 610 | real''' = real . single |
609 | complex = double . complex' | 611 | complex''' = double . complex |
610 | 612 | ||
611 | instance AutoReal (Complex Float) where | 613 | instance AutoReal (Complex Float) where |
612 | real = real' . single | 614 | real''' = real . single |
613 | complex = double . complex' | 615 | complex''' = double . complex |
616 | |||
617 | |||
618 | comp x = complex' x | ||
619 | |||
620 | -- complex'' x = double (complex x) | ||
621 | -- real'' x = real (single x) | ||
622 | |||
623 | real'' x = real''' x | ||
624 | complex'' x = complex''' x | ||
625 | |||