1
0
mirror of https://github.com/gsi-upm/soil synced 2024-12-22 16:28:11 +00:00

Code organized

This commit is contained in:
Tasio Mendez 2018-04-16 10:55:27 +02:00
parent 563587193a
commit 788af57da2
4 changed files with 20 additions and 83 deletions

14
run.py
View File

@ -1,12 +1,11 @@
import argparse
from server import ModularServer
from visualization import GraphVisualization, Model
from simulator import Simulator
def run(model, name="SOIL Model", verbose=False, params=None):
graphVisualization = GraphVisualization(params)
server = ModularServer(model, graphVisualization, name=(name[0] if isinstance(name, list) else name), verbose=verbose)
server.port = 8001
def run(simulator, name="SOIL", port=8001, verbose=False):
server = ModularServer(simulator, name=(name[0] if isinstance(name, list) else name), verbose=verbose)
server.port = port
server.launch()
@ -16,8 +15,9 @@ if __name__ == "__main__":
parser.add_argument('--name', '-n', nargs=1, default='SOIL', help='name of the simulation')
parser.add_argument('--dump', '-d', help='dumping results in folder output', action='store_true')
parser.add_argument('--port', '-p', nargs=1, default=8001, help='port for launching the server')
parser.add_argument('--verbose', '-v', help='verbose mode', action='store_true')
args = parser.parse_args()
soil = Model(dump=args.dump)
run(soil, name=args.name, verbose=args.verbose)
soil = Simulator(dump=args.dump)
run(soil, name=args.name, port=(args.port[0] if isinstance(args.port, list) else args.port), verbose=args.verbose)

View File

@ -17,41 +17,13 @@ from xml.etree.ElementTree import tostring
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
class VisualizationElement:
"""
Defines an element of the visualization.
Attributes:
package_includes: A list of external JavaScript files to include that
are part of the packages.
local_includes: A list of JavaScript files that are local to the
directory that the server is being run in.
js_code: A JavaScript code string to instantiate the element.
Methods:
render: Takes a model object, and produces JSON data which can be sent
to the client.
"""
package_includes = []
local_includes = []
js_code = ''
render_args = {}
def __init__(self):
pass
def render(self, model):
return '<b>VisualizationElement goes here</b>.'
class PageHandler(tornado.web.RequestHandler):
""" Handler for the HTML template which holds the visualization. """
def get(self):
self.render('index.html', port=self.application.port,
model_name=self.application.model_name,
package_includes=self.application.package_includes,
local_includes=self.application.local_includes,
scripts=self.application.js_code)
name=self.application.name)
class SocketHandler(tornado.websocket.WebSocketHandler):
@ -85,7 +57,7 @@ class SocketHandler(tornado.websocket.WebSocketHandler):
return
else:
self.config = self.config[0]
self.send_log('INFO.soil', 'Using config: {name}'.format(name=self.config['name']))
self.send_log('INFO.' + self.application.simulator.name, 'Using config: {name}'.format(name=self.config['name']))
if 'visualization_params' in self.config:
self.write_message({'type': 'visualization_params',
@ -124,7 +96,7 @@ class SocketHandler(tornado.websocket.WebSocketHandler):
elif msg['type'] == 'run_simulation':
if self.application.verbose:
logger.info('Running new simulation for {name}'.format(name=self.config['name']))
self.send_log('INFO.soil', 'Running new simulation for {name}'.format(name=self.config['name']))
self.send_log('INFO.' + self.application.simulator.name, 'Running new simulation for {name}'.format(name=self.config['name']))
self.config['environment_params'] = msg['data']
self.run_simulation()
@ -158,7 +130,7 @@ class SocketHandler(tornado.websocket.WebSocketHandler):
try:
if (not self.log_capture_string.closed and self.log_capture_string.getvalue()):
for i in range(len(self.log_capture_string.getvalue().split('\n')) - 1):
self.send_log('INFO.soil', self.log_capture_string.getvalue().split('\n')[i])
self.send_log('INFO.' + self.application.simulator.name, self.log_capture_string.getvalue().split('\n')[i])
self.log_capture_string.truncate(0)
self.log_capture_string.seek(0)
finally:
@ -179,9 +151,9 @@ class SocketHandler(tornado.websocket.WebSocketHandler):
# Run simulation and capture logs
if 'visualization_params' in self.config:
del self.config['visualization_params']
with self.logging(self.application.model.name):
with self.logging(self.application.simulator.name):
try:
self.simulation = self.application.model.run(self.config)
self.simulation = self.application.simulator.run(self.config)
except:
error = 'Something went wrong. Please, try again.'
self.write_message({'type': 'error',
@ -217,10 +189,7 @@ class SocketHandler(tornado.websocket.WebSocketHandler):
class ModularServer(tornado.web.Application):
""" Main visualization application. """
portrayal_method = None
port = 8001
model_args = ()
model_kwargs = {}
page_handler = (r'/', PageHandler)
socket_handler = (r'/ws', SocketHandler)
static_handler = (r'/(.*)', tornado.web.StaticFileHandler,
@ -232,33 +201,15 @@ class ModularServer(tornado.web.Application):
settings = {'debug': True,
'template_path': os.path.dirname(__file__) + '/templates'}
def __init__(self, model, visualization_element, name='SOIL', verbose=True,
*args, **kwargs):
def __init__(self, simulator, name='SOIL', verbose=True, *args, **kwargs):
self.verbose = verbose
self.package_includes = set()
self.local_includes = set()
self.js_code = []
self.visualization_element = visualization_element
self.model_name = name
self.model = model
self.model_args = args
self.model_kwargs = kwargs
#self.reset_model()
self.name = name
self.simulator = simulator
# Initializing the application itself:
super().__init__(self.handlers, **self.settings)
'''
def reset_model(self):
self.model = self.model_cls(*self.model_args, **self.model_kwargs)
'''
def render_model(self):
return self.visualization_element.render(self.model)
def launch(self, port=None):
""" Run the app. """

View File

@ -1,17 +1,15 @@
import os
import networkx as nx
from server import VisualizationElement
from soil.simulation import SoilSimulation
from xml.etree import ElementTree
class Model():
class Simulator():
""" Simulator for running simulations. Using SOIL."""
def __init__(self, dump=False, dir_path='output'):
self.name = 'soil'
self.dump = dump
self.dir_path = dir_path
self.simulation = list()
def run(self, config):
name = config['name']
@ -36,15 +34,3 @@ class Model():
def reset(self):
pass
class GraphVisualization(VisualizationElement):
package_includes = []
# TODO: esta por definir todos los ajustes de simulacion
def __init__(self, params=None):
new_element = ("new funcion()")
self.js_code = "elements.push(" + new_element + ");"
def render(self, model):
pass

View File

@ -35,7 +35,7 @@
<link rel="stylesheet" type="text/css" href="css/timeline.css">
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Ubuntu+Mono" />
<title>{{ model_name }}</title>
<title>{{ name }}</title>
<script type="text/javascript">//<![CDATA[
@ -184,7 +184,7 @@
<nav class="navbar navbar-default navbar-fixed-bottom">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">{{ model_name }}</a>
<a class="navbar-brand" href="#">{{ name }}</a>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">