--------------------------------------------------------------------------------
-- |
-- Module    :  Environment.Gym.ClassicControl.CartPoleV1
-- Copyright :  (c) Sentenai 2017
-- License   :  BSD3
-- Maintainer:  sam@sentenai.com
-- Stability :  experimental
--
-- Environment description:
-- > A pole is attached by an un-actuated joint to a cart, which moves along a
-- > frictionless track. The system is controlled by applying a force of +1 or -1
-- > to the cart. The pendulum starts upright, and the goal is to prevent it from
-- > falling over. A reward of +1 is provided for every timestep that the pole
-- > remains upright. The episode ends when the pole is more than 15 degrees from
-- > vertical, or the cart moves more than 2.4 units from the center.
-- >
-- > CartPole-v1 defines "solving" as getting average reward of 475.0 over 100
-- > consecutive trials.
-- >
-- > This environment corresponds to the version of the cart-pole problem
-- > described by Barto, Sutton, and Anderson [Barto83].
--
-- https://gym.openai.com/envs/CartPole-v1
--------------------------------------------------------------------------------
module Environments.Gym.ClassicControl.CartPoleV1
  ( Env.Action(..)
  , I.Runner
  , Env.StateCP(..)
  , Env.Environment
  , Env.EnvironmentT
  , runEnvironment
  , runEnvironmentT
  , runDefaultEnvironment
  , runDefaultEnvironmentT
  ) where

import Reinforce.Prelude hiding (State)
import Data.CartPole
import OpenAI.Gym (GymEnv(CartPoleV1))
import Environments.Gym.ClassicControl.CartPoleV0 as Env hiding
  ( runEnvironment
  , runEnvironmentT
  , runDefaultEnvironmentT
  , runDefaultEnvironment
  )
import qualified Environments.Gym.Internal as I


-- | Alias to 'Environments.Gym.Internal.runEnvironmentT'
runEnvironmentT :: MonadIO t => Manager -> BaseUrl -> I.RunnerT StateCP Action t x
runEnvironmentT = I.runEnvironmentT CartPoleV1

-- | Alias to 'Environments.Gym.Internal.runEnvironment' in IO
runEnvironment :: Manager -> BaseUrl -> I.RunnerT StateCP Action IO x
runEnvironment = I.runEnvironmentT CartPoleV1

-- | Alias to 'Environments.Gym.Internal.runDefaultEnvironmentT'
runDefaultEnvironmentT :: MonadIO t => I.RunnerT StateCP Action t x
runDefaultEnvironmentT = I.runDefaultEnvironmentT CartPoleV1

-- | Alias to 'Environments.Gym.Internal.runDefaultEnvironment' in IO
runDefaultEnvironment :: I.RunnerT StateCP Action IO x
runDefaultEnvironment = I.runDefaultEnvironmentT CartPoleV1