GithubHelp home page GithubHelp logo

robinhenry / gym-anm Goto Github PK

View Code? Open in Web Editor NEW
128.0 6.0 31.0 7.09 MB

Design Reinforcement Learning environments that model Active Network Management (ANM) tasks in electricity distribution networks.

Home Page: https://gym-anm.readthedocs.io/en/latest/

License: MIT License

Python 88.13% HTML 0.27% JavaScript 11.59% CSS 0.02%
reinforcement-learning electricity-networks gym-environments

gym-anm's Introduction

Gym-ANM

Downloads Documentation Status codecov Checks License: MIT

gym-anm is a framework for designing reinforcement learning (RL) environments that model Active Network Management (ANM) tasks in electricity distribution networks. It is built on top of the OpenAI Gym toolkit.

The gym-anm framework was designed with one goal in mind: bridge the gap between research in RL and in the management of power systems. We attempt to do this by providing RL researchers with an easy-to-work-with library of environments that model decision-making tasks in power grids.

Papers:

Key features

  • Very little background in electricity systems modelling it required. This makes gym-anm an ideal starting point for RL students and researchers looking to enter the field.
  • The environments (tasks) generated by gym-anm follow the OpenAI Gym framework, with which a large part of the RL community is already familiar.
  • The flexibility of gym-anm, with its different customizable components, makes it a suitable framework to model a wide range of ANM tasks, from simple ones that can be used for educational purposes, to complex ones designed to conduct advanced research.

Documentation

Documentation is provided online at https://gym-anm.readthedocs.io/en/latest/.

Installation

Requirements

gym-anm requires Python 3.8+ and can run on Linux, MaxOS, and Windows. Some rendering features may not work properly on Windows (not tested).

We recommend installing gym-anm in a Python environment (e.g., virtualenv or conda).

Using pip

Using pip (preferably after activating your virtual environment):

pip install gym-anm

Building from source

Alternatively, you can build gym-anm directly from source:

git clone https://github.com/robinhenry/gym-anm.git
cd gym-anm
pip install -e .

Example

The following code snippet illustrates how gym-anm environments can be used. In this example, actions are randomly sampled from the action space of the environment ANM6Easy-v0. For more information about the agent-environment interface, see the official OpenAI Gym documentation.

import gym
import time

def run():
   env = gym.make('gym_anm:ANM6Easy-v0')
   o = env.reset()

   for i in range(100):
       a = env.action_space.sample()
       o, r, done, info = env.step(a)
       env.render()
       time.sleep(0.5)  # otherwise the rendering is too fast for the human eye.

   env.close()

if __name__ == '__main__':
    run()

The above code would render the environment in your default web browser as shown in the image below: alt text

Additional example scripts can be found in examples/.

Testing the installation

All unit tests in gym-anm can be ran from the project root directory with:

python -m pytest tests

Contributing

Contributions are always welcome! Please read the contribution guidelines first.

Citing the project

All publications derived from the use of gym-anm should cite the following two 2021 papers:

@article{HENRY2021100092,
    title = {Gym-ANM: Reinforcement learning environments for active network management tasks in electricity distribution systems},
    journal = {Energy and AI},
    volume = {5},
    pages = {100092},
    year = {2021},
    issn = {2666-5468},
    doi = {https://doi.org/10.1016/j.egyai.2021.100092},
    author = {Robin Henry and Damien Ernst},
}
@article{HENRY2021100092,
    title = {Gym-ANM: Open-source software to leverage reinforcement learning for power system management in research and education},
    journal = {Software Impacts},
    volume = {9},
    pages = {100092},
    year = {2021},
    issn = {2665-9638},
    doi = {https://doi.org/10.1016/j.simpa.2021.100092},
    author = {Robin Henry and Damien Ernst}
}

Maintainers

gym-anm is currently maintained by Robin Henry.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

gym-anm's People

Contributors

robinhenry avatar sprakashdash avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

gym-anm's Issues

AttributeError: 'numpy.random._generator.Generator' object has no attribute 'randint'

I am running into the following issue in couple of places. I am fixing it by chaging np_random to np.random and using integers instead of randint. Is that correct?

File C:\ProgramData\Anaconda3\envs\gym-anm\lib\site-packages\gym_anm\envs\anm6_env\anm6_easy.py:31, in ANM6Easy.init_state(self)
27 n_dev, n_gen, n_des = 7, 2, 1
29 state = np.zeros(2 * n_dev + n_des + n_gen + self.K)
---> 31 t_0 = self.np_random.randint(0, int(24 / self.delta_t))
32 state[-1] = t_0
34 # Load (P, Q) injections.

AttributeError: 'numpy.random._generator.Generator' object has no attribute 'randint'

Line 31 in gym-anm/gym_anm/env/anm6_env/anm6_easy.py:

    def init_state(self):
        n_dev, n_gen, n_des = 7, 2, 1

        state = np.zeros(2 * n_dev + n_des + n_gen + self.K)

        t_0 = self.np_random.randint(0, int(24 / self.delta_t))
        state[-1] = t_0

Running speed of large-scale nodes

Based on gym-anm, I built my 118-node system, which had 153 devices, 92 loads and 54 units, but I found that the speed of state initialization was very slow. I'm not sure what went wrong. Could you give me some help?

Rendering Problem on Windows 10

When running the example 'gym_anm:ANM6Easy-v0' given in the quickstart section there is a problem when rendering the environment. The rendering tab that opens on the browser is blank.

I am running windows 10 and I tried running the script on a Jupyter Notebook (Python 3.8.5), in Google Collab and in Pycharm (Python 3.9). The error log I am getting is:

 Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 125, in _main
    prepare(preparation_data)
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 236, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
    main_content = runpy.run_path(main_path,
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 268, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 97, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\diego\PycharmProjects\thesis\main.py", line 16, in <module>
    env.render()
  File "C:\Users\diego\PycharmProjects\thesis\venv\lib\site-packages\gym_anm\envs\anm6_env\anm6.py", line 92, in render
    self._init_render(specs)
  File "C:\Users\diego\PycharmProjects\thesis\venv\lib\site-packages\gym_anm\envs\anm6_env\anm6.py", line 188, in _init_render
    rendering.start(title, dev_type, ps, qs, branch_rate,
  File "C:\Users\diego\PycharmProjects\thesis\venv\lib\site-packages\gym_anm\envs\anm6_env\rendering\py\rendering.py", line 54, in start
    http_server = HttpServer()
  File "C:\Users\diego\PycharmProjects\thesis\venv\lib\site-packages\gym_anm\envs\anm6_env\rendering\py\servers.py", line 171, in __init__
    self.process = self._start_http_process()
  File "C:\Users\diego\PycharmProjects\thesis\venv\lib\site-packages\gym_anm\envs\anm6_env\rendering\py\servers.py", line 184, in _start_http_process
    service.start()
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 121, in start
    self._popen = self._Popen(self)
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\context.py", line 327, in _Popen
    return Popen(process_obj)
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
    _check_not_importing_main()
  File "C:\Users\diego\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
    raise RuntimeError('''
RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

Add possibility to model shunt elements in the power grid simulator

This issue will track the addition of shunt elements to the power grid simulator, just like MATPOWER and other simulation packages do.

Background

Shunt elements were not originally included in gym-anm because we didn't want to over-complicate things for beginners with little experience in power system modeling. However, it seems that the feature would be useful to a number of people.

Feel free to react to this comment if you would like to see this feature added, too!

Plan

The goal is to add the possibility to model shunt elements in the power grid simulator. It will follow the same mathematical representation as used by MATPOWER and others: shunt elements (e.g., capacitors or inductors) will be modeled as a fixed impedance connected to ground at a specific bus.

More precisely, the modifications should follow equations (3.7) and (3.13) of the MATPOWER official documentation.

ImportError while running tests

When I run the test command: python -m tests I get the following error:

======================================================================
ERROR: test_dcopf_agent (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_dcopf_agent
Traceback (most recent call last):
  File "/home/satan/miniconda3/envs/rl-algo-env/lib/python3.7/unittest/loader.py", line 434, in _find_test_path
    module = self._get_module_from_name(name)
  File "/home/satan/miniconda3/envs/rl-algo-env/lib/python3.7/unittest/loader.py", line 375, in _get_module_from_name
    __import__(name)
  File "/home/satan/Torch_Env_List/gym-anm/tests/test_dcopf_agent.py", line 6, in <module>
    from gym_anm import MPCAgent
ImportError: cannot import name 'MPCAgent' from 'gym_anm' (/home/satan/Torch_Env_List/gym-anm/gym_anm/__init__.py)


----------------------------------------------------------------------
Ran 82 tests in 10.757s

FAILED (errors=1)

Error closing the environment

What:
The environment gives an error on env.close() call if env.render() has not been called because the "http_server" attribute as not been created

How:
Executing the environment using this modified test code:

import gym
import time

def run():
   env = gym.make('gym_anm:ANM6Easy-v0')
   o = env.reset()

   for i in range(100):
       a = env.action_space.sample()
       o, r, done, info = env.step(a)

   env.close()

if __name__ == '__main__':
    run()

Where:
"gym_anm\envs\anm6_env\anm6.py", line 231, in close

rendering.close(self.http_server, self.ws_server)

AttributeError: 'ANM6Easy' object has no attribute 'http_server'

How to fix:
I see two options to potencialy fix this issue:

  1. Initialize the attributes "http_server" and "ws_server" on the "init" function
  2. check if the render has been called/initialized and only then call rendering.close.
server_up= getattr(self, "http_server", None)
if server_up:
        rendering.close(self.http_server, self.ws_server)
        self.render_mode = None

The scalability of large-scale nodes system

Based on gym-anm, I built my 118-node system, which had 153 devices, 92 loads and 54 units, but I found that the speed of state initialization was very slow. I'm not sure what went wrong. Could you give me some help?

Deprication of np.complex

I have just installed gym-anm==1.1.2 on python 3.9. I used this version as there was a rendering issue on Windows that this seemed to fix (see another bug fix).

It kept throwing a deprication error saying np.complex was depricated in version 1.20. However, numpy 1.24 was intalled with this distribution (I was using a new conda env). I tried to downgrade numpy to 1.19, but this did not work.

Then I went into \gym_anm\simulator\simulator.py and change line 188 from:

        Y_bus = np.zeros((n + 1, n + 1), dtype=np.complex)

to

        Y_bus = np.zeros((n + 1, n + 1), dtype=np.complex128)

The env now works fine.

Is this just me, or is this a known error?

Rendering Problem (Blank Screen)

I am running the following code:

import gym
import time

def run():
    env = gym.make('gym_anm:ANM6Easy-v0')
    o = env.reset()
    
    for i in range(100):
        a = env.action_space.sample()
        o, r, done, info = env.step(a)
        env.render()
        time.sleep(0.5)  # otherwise the rendering is too fast for the human eye.
    env.close()

if __name__ == '__main__':
    run()

I get a blank screen on my browser. Running on both Windows 10 and 11.

AttributeError: module 'numpy' has no attribute 'complex'.

What:
Deprecated call of numpy alias

How:
Executing the environment using the test code:

import gym
import time

def run():
   env = gym.make('gym_anm:ANM6Easy-v0')
   o = env.reset()

   for i in range(100):
       a = env.action_space.sample()
       o, r, done, info = env.step(a)
       env.render()
       time.sleep(0.5)  # otherwise the rendering is too fast for the human eye.

   env.close()

if __name__ == '__main__':
    run()

Where:
"gym_anm\simulator\simulator.py", line 188, in _build_admittance_matrix

Y_bus = np.zeros((n + 1, n + 1), dtype=np.complex)

np.complex was a deprecated alias for the builtin complex. To avoid this error in existing code, use complex by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use np.complex128 here.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations

How to fix:
I see two options to potencialy fix this issue:

  1. Specify a requiered numpy version
  2. Upgrade to numpy 1.24 and change the line code to:
    Y_bus = np.zeros((n + 1, n + 1), dtype=complex)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.