packages feed

mdp-0.1.0.0: testsuite/tests/Algorithms/MDP/Ex_3_1_RelativeTest.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}

-- | This module tests the standard value iteration algorithm for
-- discounted problems by comparing its iterations to known iterations
-- from "Dynamic Programming and Optimal Control", Dimitri
-- P. Bertsekas, p. 23.
module Algorithms.MDP.Ex_3_1_RelativeTest where

import Test.Framework

import Algorithms.MDP.Ex_3_1_Test (correctValuesA, correctValuesB, almostEqual)
import Algorithms.MDP.Examples.Ex_3_1
import Algorithms.MDP
import Algorithms.MDP.ValueIteration

lowerValuesA :: [Double]
lowerValuesA =
  [ read "-Infinity"
  , 5.000
  , 6.350
  , 6.856
  , 7.129
  , 7.232
  , 7.287
  , 7.308
  , 7.319
  , 7.324
  , 7.326
  , 7.327
  , 7.327
  , 7.327
  , 7.328
  , 7.328
  ]

upperValuesA :: [Double]
upperValuesA =
  [ read "Infinity"
  , 9.500
  , 8.375
  , 7.767
  , 7.540
  , 7.417
  , 7.371
  , 7.345
  , 7.336
  , 7.331
  , 7.329
  , 7.328
  , 7.328
  , 7.328
  , 7.328
  , 7.328
  ]

lowerValuesB :: [Double]
lowerValuesB =
  [ read "-Infinity"
  , 5.500
  , 6.625
  , 7.232
  , 7.460
  , 7.583
  , 7.629
  , 7.654
  , 7.663
  , 7.669
  , 7.671
  , 7.672
  , 7.672
  , 7.672
  , 7.672
  , 7.672
  ]

upperValuesB :: [Double]
upperValuesB =
  [ read "Infinity"
  , 10.000
  , 8.650
  , 8.144
  , 7.870
  , 7.768
  , 7.712
  , 7.692
  , 7.680
  , 7.676
  , 7.674
  , 7.673
  , 7.673
  , 7.673
  , 7.672
  , 7.672
  ]

iterations = take 16 (relativeValueIteration mdp)

lower s (CFBounds cf lb _)  = lb + cost s cf
upper s (CFBounds cf _  ub) = ub + cost s cf

actualValuesA = map (cost A . _CF) iterations
actualValuesB = map (cost B . _CF) iterations

actualLowerA = map (lower A) iterations
actualUpperA = map (upper A) iterations
actualLowerB = map (lower B) iterations
actualUpperB = map (upper B) iterations

badActualA = filter (not . almostEqual 1e-3) $ zip actualValuesA correctValuesA
badActualB = filter (not . almostEqual 1e-3) $ zip actualValuesB correctValuesB

badLBA = filter (not . almostEqual 1e-3) $ zip actualLowerA lowerValuesA
badUBA = filter (not . almostEqual 1e-3) $ zip actualUpperA upperValuesA
badLBB = filter (not . almostEqual 1e-3) $ zip actualLowerB lowerValuesB
badUBB = filter (not . almostEqual 1e-3) $ zip actualUpperB upperValuesB

test_AValues = assertBoolVerbose (unlines (map show badActualA)) (null badActualA)
test_BValues = assertBoolVerbose (unlines (map show badActualB)) (null badActualB)
test_LBA = assertBoolVerbose (unlines (map show badLBA)) (null badLBA)
test_UBA = assertBoolVerbose (unlines (map show badUBA)) (null badUBA)
test_LBB = assertBoolVerbose (unlines (map show badLBB)) (null badLBB)
test_UBB = assertBoolVerbose (unlines (map show badUBB)) (null badUBB)