Environments

Classes to create simulated environment functions.

source

EnvironmentFactory

 EnvironmentFactory ()

Initialize self. See help(type(self)) for accurate signature.


source

ControlEnvironment

 ControlEnvironment (name=None, value=None, links=None, new_name=True,
                     namespace=None)

Abstract ControlEnvironment


source

OpenAIGym

 OpenAIGym (env_name=None, render=False, render_mode='rgb_array',
            video_wrap=False, value=0, name='gym', seed=None, links=None,
            new_name=True, early_termination=False, namespace=None,
            **cargs)

A function that creates and runs an environment from OpenAI Gym. Parameter: The environment name. Flag to display environment. Links: Link to the action function.


source

CartPoleV1

 CartPoleV1 (render=False, render_mode='rgb_array', video_wrap=False,
             value=0, name='CartPoleV1', seed=None, links=None,
             new_name=True, namespace=None, **cargs)

A function that creates an runs the CartPole-v1 environment from OpenAI Gym. Parameter: The environment name. Flag to display environment. Links: Link to the action function.


source

CartPoleDV1

 CartPoleDV1 (render=False, render_mode='rgb_array', video_wrap=False,
              value=0, name='CartPoleD-v1', seed=None, links=None,
              new_name=True, namespace=None, **cargs)

A function that creates an runs the CartPole-v1 environment from OpenAI Gym. Parameter: The environment name. Flag to display environment. Links: Link to the action function.


source

Pendulum

 Pendulum (render=False, render_mode='rgb_array', video_wrap=False,
           value=0, name='Pendulum', seed=None, links=None, new_name=True,
           namespace=None, **cargs)

A function that creates an runs the Pendulum-v1 environment from OpenAI Gym. Parameter: The environment name. Flag to display environment. Links: Link to the action function.

class Pendulum_1(OpenAIGym):
    "A function that creates an runs the Pendulum-v1 environment from OpenAI Gym. Parameter: The environment name. Flag to display environment. Links: Link to the action function."
    # from obs[0], indices
    # 0 cos(theta) - +1 is up, -1 is down, 0 is left and right
    # 1 sin(theta) - +1 is left, -1 is right, 0 is up and down
    # 2 theta dot - +dot is anti-clockwise, -dot is clockwise
    # 3 theta dot - normalised to +/- 1    
    # 4 theta +1/-1 (added here) 1 is pointing upwards, + is anti-clockwise, - is clockwise
    # reward - -(theta^2 + 0.1*theta_dt^2 + 0.001*action^2)

    def __init__(self, render=False, render_mode="rgb_array", video_wrap=False, value=0, name="Pendulum_1", 
                 seed=None, links=None, new_name=True, namespace=None,**cargs):        
        super().__init__('Pendulum-v1', render=render, render_mode=render_mode, video_wrap=video_wrap, value=value, name=name, seed=seed, 
                         links=links, new_name=new_name, namespace=namespace, **cargs)
        
    def process_hierarchy_values(self):
        self.hierarchy_values = self.links[0].get_value()
   
    def process_actions(self):
        pass
    
    def apply_actions_get_obs(self):
        return self.env.step([self.hierarchy_values])
        
    def parse_obs(self):    
        self.value = self.obs[0]
        self.reward = -self.obs[1]
        self.done = self.obs[2]
        self.info = self.obs[3]

    def process_values(self):
        vel = self.obs[0][2]/8.0
        self.value = np.append(self.value, vel)
        x = math.copysign(math.acos(self.obs[0][0]), self.obs[0][1])/math.pi
        #theta = 100 - (10 * math.copysign(1-abs(x), x))
        theta = 100 - (10 * x)
        self.value = np.append(self.value, theta)
        
    class Factory:
        def create(self, seed=None): return Pendulum_1(seed=seed)
    class FactoryWithNamespace:
        def create(self, namespace=None, seed=None): return Pendulum_1(namespace=namespace, seed=seed)

source

MountainCarV0

 MountainCarV0 (render=False, render_mode='rgb_array', video_wrap=False,
                value=0, name='MountainCarV0', seed=None, links=None,
                new_name=True, namespace=None, **cargs)

A function that creates and runs the MountainCar-v0 environment from OpenAI Gym. Parameter: The environment name. Flag to display environment. Links: Link to the action function.


source

MountainCarContinuousV0

 MountainCarContinuousV0 (render=False, render_mode='rgb_array',
                          video_wrap=False, value=0,
                          name='MountainCarContinuousV0', seed=None,
                          links=None, new_name=True,
                          early_termination=True, namespace=None, **cargs)

A function that creates and runs the MountainCarContinuous-v0 environment from OpenAI Gym. Parameter: The environment name. Flag to display environment. Links: Link to the action function.


source

WindTurbine

 WindTurbine (value=0, name='WindTurbine', links=None, new_name=True,
              namespace=None, seed=None, **cargs)

A function that creates and runs the YawEnv environment for a wind turbine. Indexes 0 - action, 1 - yaw error, 2 - wind direction, 3 - wind speed (ignore 0).


source

VelocityModel

 VelocityModel (mass=50, value=0, name='VelocityModel', links=None,
                num_links=1, new_name=True, indexes=0, namespace=None,
                **cargs)

A simple model of a moving object of a particular mass. Parameters: The environment name, mass. Links: Link to the action function.


source

DummyModel

 DummyModel (name='World', value=0, links=None, new_name=True,
             namespace=None, seed=None, **cargs)

Base class of a PCT function. This class is not used directly by developers, but defines the functionality common to all.


source

WebotsWrestler

 WebotsWrestler (render=False, value=0, name='WebotsWrestler', seed=None,
                 links=None, new_name=True, early_termination=True,
                 namespace=None)

A function that creates and runs a Webots Wrestler robot.


source

WebotsWrestlerSupervisor

 WebotsWrestlerSupervisor (render=False, value=0,
                           name='WebotsWrestlerSupervisor', seed=None,
                           links=None, new_name=True,
                           early_termination=True, namespace=None)

A function that creates and runs a Webots Wrestler robot.


source

Bridge

 Bridge (render=False, value=0, name='Bridge', seed=None, links=None,
         new_name=True, early_termination=True, namespace=None)

An environment function with sensors set by external system.


source

MicroGrid

 MicroGrid (value=0, name='MicroGrid', links=None, new_name=True,
            namespace=None, seed=None, **cargs)

A function that creates and runs the microgrid environment for an energy management system.
‘Deep reinforcement learning for energy management in a microgrid with flexible demand.’
Taha Abdelhalim Nakabi, Pekka Toivanen.
https://doi.org/10.1016/j.segan.2020.100413

Inputs - st = [SoCt, BSCt, Cbt, Tt, Gt, Put, Lb,t, t].
0 - ISC - the average SoC (state-of-charge) of the TCLs,
1 - IL - the current load value of the daily consumption pattern.
2 - IPC - the pricing counter,
3 - IBS - the battery SoC,
4 - IEG - the energy generation,
5 - IT - the temparature,
6 - IEP - the electricty prices,
7 - ITS - the time step,
Actions:
0 - TCL action, Atcl,
1 - price action, Ap,
2 - energy deficiency action, Ad,
3 - energy excess action, Ae

env = MicroGrid(seed=1)
env.summary()
MicroGrid MicroGrid | 0 

OpenAI Gym

An example showing how to use an OpenAI Gym function. And how to have another function which accesses one of the values of the gym environment.

from pct.functions import Constant
from pct.functions import IndexedParameter
from pct.putils import FunctionsList
from pct.functions import Proportional
render=False 
print(render)
acrobot = OpenAIGym("Acrobot-v1", render=render, seed=1)
namespace=acrobot.namespace
acrobot.add_link(Constant(1, namespace=namespace))
#acrobot.get_config()
False
#acrobot()
#print(acrobot.reward)
#print(getattr(acrobot, "reward"))
acrobot.output_string()
AttributeError: 'OpenAIGym' object has no attribute 'actions'
#acrobot.value[0]

The IndexedParameter type retrieves a value from a linked function based upon an index.

cos_angle1 = IndexedParameter(0, name="cos_angle1", namespace=namespace)
cos_angle1.add_link(acrobot)
print(cos_angle1.get_config())
#cos_angle1()
{'type': 'IndexedParameter', 'name': 'cos_angle1', 'value': 0, 'links': {0: 'gym'}, 'index': 0}
acrobot.close()
pen = Pendulum(render=True, namespace=namespace, seed=1)
pen.add_link(Constant([1], namespace=namespace))
print(pen.get_config())
#pen.run(steps=10, verbose=True)
# why TypeError: size must be two numbers?
{'type': 'Pendulum', 'name': 'Pendulum', 'value': 0, 'links': {0: 'constant1'}, 'env_name': 'Pendulum-v1', 'reward': 0, 'done': False, 'info': {}}
pen.close()

Velocity Model

vm = VelocityModel(name='VelocityModel', namespace=namespace)
vm.add_link(Constant(1, name='mycon'))
print(vm.summary())
config = vm.get_config()
print(config)
assert config == {'type': 'VelocityModel', 'name': 'VelocityModel', 'value': 0, 'links': {0: 'mycon'}, 'mass': 50}
vm.run(steps=10, verbose=True)
VelocityModel VelocityModel | 0 | links  mycon 
None
{'type': 'VelocityModel', 'name': 'VelocityModel', 'value': 0, 'links': {0: 'mycon'}, 'mass': 50}
0.020 0.040 0.060 0.080 0.100 0.120 0.140 0.160 0.180 0.200 
0.19999999999999998