Skip to main content

simpy-events

license python version build-status Documentation Status coverage pypi package

event system with SimPy to decouple simulation code and increase reusability

( >>>>>>> WORK IN PROGRESS <<<<<<< )

A basic example

  • Our simplified scenario is composed of:

    • satellites emitting signals

    • receivers receiving and processing signals

  • basic imports and creating the root namespace:

from simpy_events.manager import RootNameSpace
import simpy

root = RootNameSpace()
  • implementing a satellite model:

sat = root.ns('satellite')

class Satellite:
    chunk = 4

    def __init__(self, name, data):
        self.signal = sat.event('signal', sat=name)
        self.data = tuple(map(str, data))

    def process(self, env):
        signal = self.signal
        data = self.data
        chunk = self.chunk
        # slice data in chunks
        for chunk in [data[chunk*i:chunk*i+chunk]
                      for i in range(int(len(data) / chunk))]:
            event = env.timeout(1, ','.join(chunk))
            yield signal(event)
  • implementing a receiver model:

receiver = root.ns('receiver')
signals = receiver.topic('signals')

@signals.after
def receive_signal(context, event):
    env = event.env
    metadata = context.event.metadata
    header = str({key: val for key, val in metadata.items()
                  if key not in ('name', 'ns')})
    env.process(process_signal(env, header, event.value))

def process_signal(env, header, signal):
    receive = receiver.event('process')
    for data in signal.split(','):
        yield receive(env.timeout(0, f'{header}: {data}'))
  • creating code to analyse what’s going on:

@root.enable('analyse')
def new_process(context, event):
    metadata = context.event.metadata
    context = {key: str(val) for key, val in metadata.items()}
    print(f'new signal process: {context}')

@root.after('analyse')
def signal(context, event):
    metadata = context.event.metadata
    ns = metadata['ns']
    print(f'signal: {ns.path}: {event.value}')
  • setting up our simulation:

root.topic('receiver::signals').extend([
    '::satellite::signal',
])
root.topic('analyse').extend([
    '::satellite::signal',
    '::receiver::process',
])

def run(env):
    # create some actors
    s1 = Satellite('sat1', range(8))
    s2 = Satellite('sat2', range(100, 108))
    env.process(s1.process(env))
    env.process(s2.process(env))

    # execute
    root.enabled = True
    env.run()
  • running the simulation

    new signal process: {'ns': '::satellite', 'name': 'signal', 'sat': 'sat1'}
    new signal process: {'ns': '::satellite', 'name': 'signal', 'sat': 'sat2'}
    signal: ::satellite: 0,1,2,3
    new signal process: {'ns': '::receiver', 'name': 'process'}
    signal: ::satellite: 100,101,102,103
    new signal process: {'ns': '::receiver', 'name': 'process'}
    signal: ::receiver: {'sat': 'sat1'}: 0
    signal: ::receiver: {'sat': 'sat2'}: 100
    signal: ::receiver: {'sat': 'sat1'}: 1
    signal: ::receiver: {'sat': 'sat2'}: 101
    signal: ::receiver: {'sat': 'sat1'}: 2
    signal: ::receiver: {'sat': 'sat2'}: 102
    signal: ::receiver: {'sat': 'sat1'}: 3
    signal: ::receiver: {'sat': 'sat2'}: 103
    signal: ::satellite: 4,5,6,7
    new signal process: {'ns': '::receiver', 'name': 'process'}
    signal: ::satellite: 104,105,106,107
    new signal process: {'ns': '::receiver', 'name': 'process'}
    signal: ::receiver: {'sat': 'sat1'}: 4
    signal: ::receiver: {'sat': 'sat2'}: 104
    signal: ::receiver: {'sat': 'sat1'}: 5
    signal: ::receiver: {'sat': 'sat2'}: 105
    signal: ::receiver: {'sat': 'sat1'}: 6
    signal: ::receiver: {'sat': 'sat2'}: 106
    signal: ::receiver: {'sat': 'sat1'}: 7
    signal: ::receiver: {'sat': 'sat2'}: 107

install and test

install from pypi

using pip:

$ pip install simpy-events

dev install

There is a makefile in the project root directory:

$ make dev

Using pip, the above is equivalent to:

$ pip install -r requirements-dev.txt
$ pip install -e .

run the tests

Use the makefile in the project root directory:

$ make test

This runs the tests generating a coverage html report

build the doc

The documentation is made with sphinx, you can use the makefile in the project root directory to build html doc:

$ make doc

Documentation

Documentation on Read The Docs.

Meta

loicpw - peronloic.us@gmail.com

Distributed under the MIT license. See LICENSE.txt for more information.

https://github.com/loicpw

Metadata

Release files for simpy-events 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for simpy-events 0.0.1
File Interpreter ABI Platform
simpy_events-0.0.1-py3-none-any.whl Python 3 none any Details

Release files / simpy_events-0.0.1-py3-none-any.whl

Download URL simpy_events-0.0.1-py3-none-any.whl
Size 21.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9260a788b0f902509475349471b560dc37b47a77bf5f7a1ab21aef20b194eaa2
BLAKE2b-256 checksum
How to use checksums
a4d3e9cf700baff92ac8e562dfec9ff38e2f64bb3d1973dce4fc376400f63a15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.2.0 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.4

Release history Release notifications | RSS feed

This release

0.0.1 This release

1 release file

0.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page