diff options
author | Alberto Ruiz <aruiz@um.es> | 2007-06-29 17:57:57 +0000 |
---|---|---|
committer | Alberto Ruiz <aruiz@um.es> | 2007-06-29 17:57:57 +0000 |
commit | 04c76641caa9e1184fe504c584ddeb5420e994d6 (patch) | |
tree | c76d8742575c99ce9668a3cb8cb62f3441452720 /examples | |
parent | e36c04dca536caa42b41a4280d3f21375219970d (diff) |
more work on tensors
Diffstat (limited to 'examples')
-rw-r--r-- | examples/pru.hs | 149 |
1 files changed, 0 insertions, 149 deletions
diff --git a/examples/pru.hs b/examples/pru.hs deleted file mode 100644 index 71f33bf..0000000 --- a/examples/pru.hs +++ /dev/null | |||
@@ -1,149 +0,0 @@ | |||
1 | --{-# OPTIONS_GHC #-} | ||
2 | --module Main where | ||
3 | {- | ||
4 | import Data.Packed.Internal | ||
5 | import Data.Packed.Internal.Vector | ||
6 | import Data.Packed.Internal.Matrix | ||
7 | import Data.Packed.Tensor | ||
8 | import Data.Packed.Matrix | ||
9 | import GSL.Vector | ||
10 | import LAPACK | ||
11 | import Data.List(foldl') | ||
12 | |||
13 | import Complex | ||
14 | import Numeric(showGFloat) | ||
15 | |||
16 | import Foreign.Storable | ||
17 | -} | ||
18 | |||
19 | import GSL | ||
20 | import Data.List(foldl', foldl1') | ||
21 | import Data.Packed.Internal.Tensor | ||
22 | import Data.Packed.Tensor | ||
23 | import Complex | ||
24 | |||
25 | |||
26 | main = do | ||
27 | print $ foldl part t [("p",1),("q",0),("r",2)] | ||
28 | print $ foldl part t [("p",1),("r",2),("q",0)] | ||
29 | print $ foldl part t $ reverse [("p",1),("r",2),("q",0)] | ||
30 | pru | ||
31 | |||
32 | t = T [IdxDesc 4 Covariant "p",IdxDesc 2 Covariant "q" ,IdxDesc 3 Contravariant "r"] | ||
33 | $ fromList [1..24::Double] | ||
34 | |||
35 | |||
36 | t1 = T [IdxDesc 4 Covariant "p",IdxDesc 4 Contravariant "q" ,IdxDesc 2 Covariant "r"] | ||
37 | $ fromList [1..32::Double] | ||
38 | t2 = T [IdxDesc 4 Covariant "p",IdxDesc 4 Contravariant "q"] | ||
39 | $ fromList [1..16::Double] | ||
40 | |||
41 | vector n v = tvector n (fromList v) :: Tensor Double | ||
42 | |||
43 | kron n = tensorFromMatrix (Contravariant,"k1") (Covariant,"k2") (ident n) | ||
44 | |||
45 | tensorFromTrans m = tensorFromMatrix (Contravariant,"1") (Covariant,"2") m | ||
46 | |||
47 | tam = (3><3) [1..9] | ||
48 | tbm = (3><3) [11..19] | ||
49 | |||
50 | ta = tensorFromMatrix (Contravariant,"a1") (Covariant,"a2") tam :: Tensor Double | ||
51 | tb = tensorFromMatrix (Contravariant,"b1") (Covariant,"b2") tbm :: Tensor Double | ||
52 | |||
53 | delta i j | i==j = 1 | ||
54 | | otherwise = 0 | ||
55 | |||
56 | e i n = fromList [ delta k i | k <- [1..n]] | ||
57 | |||
58 | diagl = diag.fromList | ||
59 | |||
60 | td = tensorFromMatrix (Contravariant,"i") (Covariant,"j") $ diagl [1..4] :: Tensor Double | ||
61 | |||
62 | tn = tensorFromMatrix (Contravariant,"i") (Covariant,"j") $ (2><3) [1..6] :: Tensor Double | ||
63 | tt = tensorFromMatrix (Contravariant,"i") (Covariant,"j") $ (2><3) [1..6] :: Tensor Double | ||
64 | |||
65 | tq = T [IdxDesc 3 Covariant "p",IdxDesc 2 Covariant "q" ,IdxDesc 2 Covariant "r"] | ||
66 | $ fromList [11 .. 22] :: Tensor Double | ||
67 | |||
68 | r1 = contraction tt "j" tq "p" | ||
69 | r1' = contraction' tt "j" tq "p" | ||
70 | |||
71 | pru = do | ||
72 | mapM_ (putStrLn.shdims.dims.normal) (possibleContractions t1 t2) | ||
73 | let t1 = contraction tt "i" tq "q" | ||
74 | print $ normal t1 | ||
75 | print $ foldl part t1 [("j",0),("p'",1),("r'",1)] | ||
76 | let t2 = contraction' tt "i" tq "q" | ||
77 | print $ normal t2 | ||
78 | print $ foldl part t2 [("j",0),("p'",1),("r'",1)] | ||
79 | let t1 = contraction tq "q" tt "i" | ||
80 | print $ normal t1 | ||
81 | print $ foldl part t1 [("j'",0),("p",1),("r",1)] | ||
82 | let t2 = contraction' tq "q" tt "i" | ||
83 | print $ normal t2 | ||
84 | print $ foldl part t2 [("j'",0),("p",1),("r",1)] | ||
85 | putStrLn "--------------------------------------------" | ||
86 | print $ flatten $ tam <> tbm | ||
87 | print $ contractions (ta <*> tb <*> kron 3) [("a2","k1'"),("b1'","k2'")] | ||
88 | print $ contraction ta "a2" tb "b1" | ||
89 | print $ normal $ contractions (ta <*> tb) [("a2","b1'")] | ||
90 | print $ normal $ contraction' ta "a2" tb "b1" | ||
91 | putStrLn "--------------------------------------------" | ||
92 | print $ raise $ dualMV $ raise $ dualMV (x1/\x2) /\ dualV [x3,x4] | ||
93 | putStrLn "--------------------------------------------" | ||
94 | print $ foldl' contractionF (leviCivita 4) [y1,y2] | ||
95 | print $ contractions (leviCivita 4 <*> (y1/\y2)) [("1","p'"),("2'","q''")] <*> (scalar (recip $ fact 2)) | ||
96 | print $ foldl' contractionF (leviCivita 4) [y1,y2,y3,y5] | ||
97 | print $ contractions (leviCivita 4 <*> (y1/\y2/\y3/\y5)) [("1","p'"),("2'","q''"),("3'","r''"),("4'","t''")] <*> (scalar (recip $ fact 4)) | ||
98 | print $ dim $ ten $ leviCivita 4 <*> (y1/\y2/\y3/\y5) | ||
99 | print $ innerAT (leviCivita 4) (y1/\y2/\y3/\y5) | ||
100 | |||
101 | |||
102 | y5 = vector "t" [0,1,-2,0] | ||
103 | |||
104 | u = vector "p" [1,1,0] | ||
105 | v = vector "q" [0,1,1] | ||
106 | w = vector "r" [1,0,1] | ||
107 | |||
108 | uv = u /\ v | ||
109 | uw = u /\ w | ||
110 | |||
111 | |||
112 | l1 = vector "p" [0,0,0,1] | ||
113 | l2 = vector "q" [1,0,0,1] | ||
114 | l3 = vector "r" [0,1,0,1] | ||
115 | |||
116 | dual1 = foldl' contractionF (leviCivita 3) [u,v] | ||
117 | dual2 = foldl' contractionF (leviCivita 3) [u,v,w] | ||
118 | |||
119 | |||
120 | |||
121 | dual1' = prod (foldl' contract1b ((leviCivita 3) <*> (u /\ v)) [("1","p'"),("2'","q''")]) (scalar (recip $ fact 2)) | ||
122 | dual2' = prod (foldl' contract1b ((leviCivita 3) <*> (u /\ v /\ w)) [("1","p'"),("2'","q''"),("3'","r''")]) (scalar (recip $ fact 3)) | ||
123 | |||
124 | |||
125 | x1 = vector "p" [0,0,1] | ||
126 | x2 = vector "q" [2,2,2] | ||
127 | x3 = vector "r" [-3,-1,-1] | ||
128 | x4 = vector "s" [12,0,3] | ||
129 | |||
130 | |||
131 | -- intersection of two lines :-) | ||
132 | -- > raise $ dualMV $ raise $ dualMV (x1/\x2) /\ dualV [x3,x4] | ||
133 | --(3'^[3]) [24.0,24.0,12.0] | ||
134 | |||
135 | y1 = vector "p" [0,0,0,1] | ||
136 | y2 = vector "q" [2,2,0,2] | ||
137 | y3 = vector "r" [-3,-1,0,-1] | ||
138 | y4 = vector "s" [12,0,0,3] | ||
139 | |||
140 | -- why not in R^4? | ||
141 | -- > raise $ dualMV $ raise $ dualMV (y1/\y2) /\ dualV [y3,y4] | ||
142 | -- scalar 0.0 | ||
143 | -- it seems that the sum of ranks must be greater than n :( | ||
144 | |||
145 | |||
146 | z1 = vector "p" [0,0,0,1] | ||
147 | z2 = vector "q" [1,0,0,1] | ||
148 | z3 = vector "r" [0,1,0,1] | ||
149 | z4 = vector "s" [0,0,1,1] | ||