ansigraph-0.3.0.0: src/System/Console/Ansigraph/Examples.hs
-- | A module that shows some simple examples demonstrating how to use the package.
module System.Console.Ansigraph.Examples (
demo
, legend
, showColors
-- * Horizontal graphs
, waveDemoComplex
, waveDemoReal
, waveDemoPositive
, wave
-- * Matrix graphs
, matDemoReal
, matDemoComplex
, unitary
) where
import System.Console.Ansigraph
import System.Console.ANSI
import Control.Monad (forM_)
import Data.Complex (Complex (..), cis, realPart)
-- for GHC <= 7.8
import Control.Applicative
---- Wave Demo ----
-- | A complex wave vector, part of the graph of /z(x,t) = exp(ix - it)/ in some units.
wave :: [Complex Double]
wave = cis . (*) (pi/20) <$> [0..79]
deltas :: [Double]
deltas = (*) (-pi/10) <$> [0..80]
waves :: [[Complex Double]]
waves = zipWith (\z -> map (* z)) (cis <$> deltas) $ repeat wave
rwaves :: [[Double]]
rwaves = map (map realPart) waves
pwaves :: [PosGraph]
pwaves = PosGraph . map (+1) <$> rwaves
-- | Display an animation of the positive real function /p(x,t) = cos(x-t) + 1/ in some units.
waveDemoPositive :: IO ()
waveDemoPositive = animate pwaves
-- | Display an animation of the real function /r(x,t) = cos(x-t)/ in the standard style, i.e. with both
-- positive and negative regions.
waveDemoReal :: IO ()
waveDemoReal = animate rwaves
-- | Display an animation of the complex wave /z(x,t) = exp(ix - it)/ in some units.
waveDemoComplex :: IO ()
waveDemoComplex = animate waves
---- Matrix Demos ----
vscale :: Num a => a -> [a] -> [a]
vscale x = map (* x)
mscale :: Num a => a -> [[a]] -> [[a]]
mscale x = map $ map (* x)
-- The following is a quick implementation of the matrix tensor product ('mox').
-- The details are not relevant to the library, but are only used for this example.
fromRealVs :: [Double] -> [Double] -> [Complex Double]
fromRealVs = zipWith (:+)
fromRealMs :: [[Double]] -> [[Double]] -> [[Complex Double]]
fromRealMs = zipWith fromRealVs
vox :: Num a => [a] -> [a] -> [a]
vox v w = concatMap (`vscale` w) v
-- matrix tensor product
mox :: Num a => [[a]] -> [[a]] -> [[a]]
mox m1 m2 = zipWith vox (stepOne m1 m2) (stepTwo m1 m2)
where stepOne, stepTwo :: [[a]] -> [[a]] -> [[a]]
stepOne x y = concatMap (replicate (length y)) x
stepTwo x y = concat $ replicate (length x) y
---- Complex matrix example ----
sx, sz, sI :: [[Double]]
sz = [[1,0],[0,-1]]
sx = [[0,1],[1,0]]
sI = [[1,0],[0,1]]
-- Time-exponentials of pauli matrices
-- exp(itσ) = cos(t)I + i sin(t)σ
sinSX, sinSZ :: Double -> [[Complex Double]]
sinSX t = fromRealMs (mscale (cos t) sI) (mscale (sin t) sx)
sinSZ t = fromRealMs (mscale (cos t) sI) (mscale (sin t) sz)
-- | An example of a time-dependent complex matrix.
unitary :: Double -> [[Complex Double]]
unitary t = sinSZ t `mox` sinSX (2*t)
slowDeltas :: [Double]
slowDeltas = (*) (pi/50) <$> [0..100]
-- | Shows an animation of an example time-dependent matrix formed from Pauli matrices, called
-- 'unitary'. Specifically, it is the tensor product of σz and σx exponentiated with different
-- frequencies.
matDemoComplex :: IO ()
matDemoComplex = animate $ unitary <$> slowDeltas
---- Real matrix example ----
ry :: Double -> [[Double]]
ry t = [[cos t, 0, sin t]
,[0, 1, 0]
,[-(sin t),0,cos t]]
-- | An example real matrix animation.
matDemoReal :: IO ()
matDemoReal = animate $ (\t -> ry t `mox` ry (2*t)) <$> slowDeltas
---- Show ANSI Colors ----
colors = [Black,Red,Green,Yellow,Blue,Magenta,Cyan,White]
intensities = [Dull,Vivid]
ansicolors :: [AnsiColor]
ansicolors = [ AnsiColor i c | c <- colors, i <- intensities ]
-- | Show all of the available 'AnsiColor's with corresponding 'ColorIntensity', 'Color' pairs.
showColors = do
boldStrLn noColoring "Available colors"
newline
forM_ ansicolors $ \c -> do
let clr = Coloring Nothing (Just c)
colorStr clr $ replicate 20 ' '
putStrLn $ " " ++ show (intensity c) ++ " " ++ show (color c)
setSGR [Reset]
cb, bc :: Coloring
cb = mkColoring (AnsiColor Dull Black) (AnsiColor Vivid Cyan)
bc = invert cb
newline = putStrLn ""
verticalPad io = do
newline
io
newline
newline
-- | Displays a legend showing color conventions for supported graph types.
legend = do
boldStrLn cb " Legend "
newline
boldStrLn noColoring "Horizontal Graphs"
newline
colorStr (fromBG blue) " "
putStrLn " Real component (positive and negative)"
newline
colorStr (fromBG pink) " "
putStrLn " Imag component (positive and negative)"
newline
boldStrLn noColoring "Matrix Graphs"
newline
putStr " "
colorStr (mkColoring white pink) "+i"
putStrLn " "
colorStr (mkColoring white red) "-r"
putStr " "
colorStrLn (mkColoring white blue) "+r"
putStr " "
colorStr (mkColoring white green) "-i"
putStrLn " "
-- | Run all of the demos in sequence.
demo = do
verticalPad $ boldStrLn cb " Ansigraph demo "
putStr "Positive function graph "
colorStrLn bc " cos (x - t) + 1 "
verticalPad waveDemoPositive
putStr "Real function graph "
colorStrLn bc " cos (x - t) "
verticalPad waveDemoReal
putStr "Complex function graph "
colorStrLn bc " exp (ix - it) "
verticalPad waveDemoComplex
putStr "Real matrix graph "
colorStrLn bc " rotate_Y(t) ⊗ rotate_Y(2t) "
verticalPad matDemoReal
putStr "Complex matrix graph "
colorStrLn bc " exp (it σz) ⊗ exp (2it σx) "
verticalPad matDemoComplex
verticalPad showColors
verticalPad legend