-
Notifications
You must be signed in to change notification settings - Fork 943
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Towards a MVC/MVVM architecture for better portrayals? #1441
Comments
Also, consider that in Matplotlib, you don't have to specify your plot's "portrayal" by default. It's a line with a default linewidth, and a color that is chosen automatically. |
I looked at the portrayals in Mesa-Geo, the most complex ones are comparable to the Sugarscape CG portrayals. It's actually not that bad if you make the portrayal function less verbose / more declarative def SsAgent_portrayal(agent):
if agent is None:
return
portrayal = None
if type(agent) is SsAgent:
portrayal = {
"Shape": "sugarscape_cg/resources/ant.png",
"scale": 0.9,
"Layer": 1
}
elif type(agent) is Sugar:
if agent.amount != 0:
color = color_dic[agent.amount]
else:
color = "#D6F5D6"
portrayal = {
"Color": color,
"Shape": "rect",
"Filled": "true",
"Layer": 0,
"w": 1,
"h": 1,
}
return portrayal The Alternatively, we can specify the portrayal as a dict ssAgentPortrayal = {
SsAgent: lambda agent: {
"Shape": "sugarscape_cg/resources/ant.png",
"scale": 0.9,
"Layer": 1
},
Sugar: lambda agent: {
"Color": color_dic[agent.amount] if agent.amount != 0 else "#D6F5D6",
"Shape": "rect",
"Filled": "true",
"Layer": 0,
"w": 1,
"h": 1,
}
} |
What's the problem this feature will solve?
The current way of defining custom portrayals for agents is through a function, for example:
mesa/examples/sugarscape_cg/sugarscape_cg/server.py
Lines 9 to 31 in 478a66b
There are nested if-else statements checking for types and so on. To make things worse, in Mesa-Geo there're various types of layers (e.g., raster layer, vector layer), other than agents, that would also need custom portrayals.
Describe the solution you'd like
Perhaps something like what was done in MASON (a JAVA ABM framework)? In this paper the authors talked about their MVC architecture where there are corresponding portrayals for agents, fields, etc.
Additional context
WebView
classes for the current Tornado server, and another set ofJupyterView
for Jupyter interface for the GUI #1263, or anything else (Streamlit perhaps?), so long as a well-defined interface is implemented. This also helps ensure that the ABM simulation part is separated from its visualizations.CanvasGridVisualization
as a View forGrid
,NetworkVisualization
forNetworkGrid
, and so on. What's missing (but available in MASON) are the View classes for agents/objects. In Mesa, these are essentially replaced by those portrayal functions.The text was updated successfully, but these errors were encountered: