event system with simpy to decouple simulation code and increase reusability
Project description
simpy-events
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file simpy_events-0.0.1-py3-none-any.whl.
File metadata
- Download URL: simpy_events-0.0.1-py3-none-any.whl
- Upload date:
- Size: 21.3 kB
- Tags: Python 3
- Uploaded using 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
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9260a788b0f902509475349471b560dc37b47a77bf5f7a1ab21aef20b194eaa2
|
|
| MD5 |
d61de20b1535393d9f448012ceadc0c1
|
|
| BLAKE2b-256 |
a4d3e9cf700baff92ac8e562dfec9ff38e2f64bb3d1973dce4fc376400f63a15
|