Yampa-core-0.2.0: tests/AFRPTestsLoop.hs
{- $Id: AFRPTestsLoop.hs,v 1.6 2003/11/10 21:28:58 antony Exp $
******************************************************************************
* A F R P *
* *
* Module: AFRPTestsLoop *
* Purpose: Test cases for loop *
* Authors: Antony Courtney and Henrik Nilsson *
* *
* Copyright (c) Yale University, 2003 *
* *
******************************************************************************
-}
module AFRPTestsLoop (loop_trs, loop_tr, loop_st0, loop_st0r,
loop_st1, loop_st1r) where
import FRP.Yampa
import AFRPTestsCommon
------------------------------------------------------------------------------
-- Test cases for loop
------------------------------------------------------------------------------
loop_acc :: SF (Double, Double) (Double, Double)
loop_acc = arr (\(x, y)->(x+y, x+y))
loop_t0 :: [Double]
loop_t0 = testSF1 (loop (constant (42.0, 43.0)))
loop_t0r =
[42.0, 42.0, 42.0, 42.0, 42.0, 42.0, 42.0, 42.0, 42.0, 42.0,
42.0, 42.0, 42.0, 42.0, 42.0, 42.0, 42.0, 42.0, 42.0, 42.0,
42.0, 42.0, 42.0, 42.0, 42.0]
loop_t1 :: [Double]
loop_t1 = testSF1 (loop identity)
loop_t1r =
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0,
20.0, 21.0, 22.0, 23.0, 24.0]
loop_t2 :: [Time]
loop_t2 = testSF1 (loop (first localTime))
loop_t2r =
[0.0, 0.25, 0.5, 0.75, 1.0,
1.25, 1.5, 1.75, 2.0, 2.25,
2.5, 2.75, 3.0, 3.25, 3.5,
3.75, 4.0, 4.25, 4.5, 4.75,
5.0, 5.25, 5.5, 5.75, 6.0]
-- AC, 10-March-2002: I think this is the simplest test that will
-- fail with AltST.
loop_t3 :: [Time]
loop_t3 = testSF1 (loop (second (iPre 0)))
loop_t3r =
[0.0, 1.0, 2.0, 3.0, 4.0,
5.0, 6.0, 7.0, 8.0, 9.0,
10.0, 11.0, 12.0, 13.0, 14.0,
15.0, 16.0, 17.0, 18.0, 19.0,
20.0, 21.0, 22.0, 23.0, 24.0]
loop_t4 :: [Double]
loop_t4 = testSF1 (loop (second (iPre 0) >>> loop_acc))
loop_t4r =
[0.0, 1.0, 3.0, 6.0, 10.0,
15.0, 21.0, 28.0, 36.0, 45.0,
55.0, 66.0, 78.0, 91.0, 105.0,
120.0, 136.0, 153.0, 171.0, 190.0,
210.0, 231.0, 253.0, 276.0, 300.0]
loop_t5 :: [Double]
loop_t5 = testSF2 (loop (second (iPre 0) >>> loop_acc))
loop_t5r =
[0.0, 0.0, 0.0, 0.0, 0.0,
1.0, 2.0, 3.0, 4.0, 5.0,
7.0, 9.0, 11.0, 13.0, 15.0,
18.0, 21.0, 24.0, 27.0, 30.0,
34.0, 38.0, 42.0, 46.0, 50.0]
loop_t6 :: [Double]
loop_t6 = testSF1 (loop (iPre (0,0) >>> first localTime >>> loop_acc))
loop_t6r =
[0.0, 0.25, 0.75, 1.5, 2.5,
3.75, 5.25, 7.0, 9.0, 11.25,
13.75, 16.5, 19.5, 22.75, 26.25,
30.0, 34.0, 38.25, 42.75, 47.5,
52.5, 57.75, 63.25, 69.0, 75.0]
loop_t7 :: [Double]
loop_t7 = testSF1 (loop (loop_acc >>> second (iPre 0)))
loop_t7r = loop_t4r
loop_t8 :: [Double]
loop_t8 = testSF2 (loop (loop_acc >>> second (iPre 0)))
loop_t8r = loop_t5r
loop_t9 :: [Double]
loop_t9 = testSF1 (loop (first localTime >>> loop_acc >>> iPre (0,0)))
loop_t9r =
[0.0, 0.0, 0.25, 0.75, 1.5,
2.5, 3.75, 5.25, 7.0, 9.0,
11.25, 13.75, 16.5, 19.5, 22.75,
26.25, 30.0, 34.0, 38.25, 42.75,
47.5, 52.5, 57.75, 63.25, 69.0]
loop_t10 :: [Double]
loop_t10 = testSF1 (loop (loop_acc >>> second (iPre 0) >>> identity))
loop_t10r = loop_t4r
loop_t11 :: [Double]
loop_t11 = testSF2 (loop (loop_acc >>> second (iPre 0) >>> identity))
loop_t11r = loop_t5r
loop_t12 :: [Double]
loop_t12 = testSF1 (loop (first localTime
>>> loop_acc
>>> iPre (0,0)
>>> identity))
loop_t12r = loop_t9r
-- Computation of approximation to exp 0, exp 1, ..., exp 5 by integration.
-- Values as given by using exp directly:
-- 1.0, 2.71828, 7.38906, 20.0855, 54.5981, 148.413
loop_t13 :: [Double]
loop_t13 =
let
es = embed (loop (second integral >>> arr (\(_, x) -> (x + 1, x + 1))))
(deltaEncode 0.001 (repeat ()))
in
[es!!0, es!!1000, es!!2000, es!!3000, es!!4000, es!!5000]
loop_t13r = [1.0,2.71692, 7.38167, 20.05544, 54.48911, 148.04276]
loop_t14 :: [Double]
loop_t14 =
let
es = embed (loop (arr (\(_, x) -> (x + 1, x + 1)) >>> second integral))
(deltaEncode 0.001 (repeat ()))
in
[es!!0, es!!1000, es!!2000, es!!3000, es!!4000, es!!5000]
loop_t14r = loop_t13r
loop_t15 :: [Double]
loop_t15 =
let
es = embed (loop (arr (\(_, x) -> (x + 1, x + 1))
>>> second integral
>>> identity))
(deltaEncode 0.001 (repeat ()))
in
[es!!0, es!!1000, es!!2000, es!!3000, es!!4000, es!!5000]
loop_t15r = loop_t13r
-- A generator for factorial: The least-fixed point of this function is
-- the factorial function.
factGen f n = if (n==0) then 1 else n*f(n-1)
-- Can we use loop to construct a fixed point?
loop_t16 :: [Int]
loop_t16 = testSF1 (loop $ arr (\ (_,f) -> (f 4,factGen f)))
loop_t16r =
[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24]
-- A simple loop test taken from MiniYampa:
-- This results in pulling on the fed-back output during evaluation, because
-- switch is strict in its input sample:
loop_t17 :: [Double]
loop_t17 = testSF1 (loop $ second $ (switch identity (const (arr fst))) >>> arr (\x -> (x,noEvent)) >>> (iPre (25, noEvent)))
loop_t17r =
[0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,
16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0]
loop_trs =
[ loop_t0 ~= loop_t0r,
loop_t1 ~= loop_t1r,
loop_t2 ~= loop_t2r,
loop_t3 ~= loop_t3r,
loop_t4 ~= loop_t4r,
loop_t5 ~= loop_t5r,
loop_t6 ~= loop_t6r,
loop_t7 ~= loop_t7r,
loop_t8 ~= loop_t8r,
loop_t9 ~= loop_t9r,
loop_t10 ~= loop_t10r,
loop_t11 ~= loop_t11r,
loop_t12 ~= loop_t12r,
loop_t13 ~= loop_t13r,
loop_t14 ~= loop_t14r,
loop_t15 ~= loop_t15r,
loop_t16 ~= loop_t16r,
loop_t17 ~= loop_t17r
]
loop_tr = and loop_trs
loop_st0 = testSFSpaceLeak 2000000
(loop (second (iPre 0) >>> loop_acc))
loop_st0r = 9.999995e11
-- A simple loop test taken from MiniYampa:
-- This results in pulling on the fed-back output during evaluation, because
-- switch is strict in its input sample:
loop_st1 :: Double
loop_st1 = testSFSpaceLeak 2000000
(loop $ second $ (switch identity (const (arr fst))) >>> arr (\x -> (x + x + x + x + x + x + x,noEvent)) >>> (iPre (25, noEvent)))
loop_st1r = 999999.5