Skip to content

Towards a MVC/MVVM architecture for better portrayals? #1441

@wang-boyu

Description

@wang-boyu

What's the problem this feature will solve?

The current way of defining custom portrayals for agents is through a function, for example:

def SsAgent_portrayal(agent):
if agent is None:
return
portrayal = {}
if type(agent) is SsAgent:
portrayal["Shape"] = "sugarscape_cg/resources/ant.png"
portrayal["scale"] = 0.9
portrayal["Layer"] = 1
elif type(agent) is Sugar:
if agent.amount != 0:
portrayal["Color"] = color_dic[agent.amount]
else:
portrayal["Color"] = "#D6F5D6"
portrayal["Shape"] = "rect"
portrayal["Filled"] = "true"
portrayal["Layer"] = 0
portrayal["w"] = 1
portrayal["h"] = 1
return portrayal

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

  • In a MVC setting it might be easier to implement additional GUI. For example we can have a set of WebView classes for the current Tornado server, and another set of JupyterView 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.
  • The current design is kind of MVC already, with CanvasGridVisualization as a View for Grid, NetworkVisualization for NetworkGrid, 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions