packages feed

gym-http-api-0.1.0.0: examples/Agent.hs

-------------------------------------------------------------------------------
-- |
-- Module    :  Main
-- License   :  MIT
-- Stability :  experimental
-- Portability: non-portable
--
-- Example of how to build an agent using OpenAI.Gym.Client
-------------------------------------------------------------------------------
{-# LANGUAGE NamedFieldPuns #-}
module Main where

import Prelude
import Control.Monad (replicateM_, when)
import Control.Monad.Catch
import Control.Exception.Base

import OpenAI.Gym
import Servant.Client
import Network.HTTP.Client


main :: IO ()
main = do
  manager <- newManager defaultManagerSettings
  out <- runClientM example (ClientEnv manager url)
  case out of
    Left err -> print err
    Right ok -> print ok

  where
    url :: BaseUrl
    url = BaseUrl Http "localhost" 5000 ""


example :: ClientM ()
example = do
  inst <- envCreate CartPoleV0
  Monitor{directory} <- withMonitor inst $
    replicateM_ episodeCount (agent inst)

  -- Upload to the scoreboard.
  -- TODO: Implement environment variable support.
  upload (Config directory "algo" "")

  where
    episodeCount :: Int
    episodeCount = 100


agent :: InstID -> ClientM ()
agent inst = do
  envReset inst
  go 0 False
  where
    maxSteps :: Int
    maxSteps = 200

    reward :: Int
    reward = 0

    go :: Int -> Bool -> ClientM ()
    go x done = do
      Action a <- envActionSpaceSample inst
      Outcome ob reward done _ <- envStep inst (Step a True)
      when (not done && x < 200) $ go (x + 1) done


withMonitor :: InstID -> ClientM () -> ClientM Monitor
withMonitor inst agent = do
  envMonitorStart inst configs
  agent
  envMonitorClose inst
  return configs
  where
    configs :: Monitor
    configs = Monitor "/tmp/random-agent-results" True False False