Coverage for .tox/p313/lib/python3.13/site-packages/scicom/historicalletters/interface.py: 100%
28 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-10 16:17 +1200
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-10 16:17 +1200
1"""Define the solara interface to run and control the HistoricalLetters model."""
2from __future__ import annotations
4import matplotlib.pyplot as plt
5import mesa_geo as mg
6import mesa_geo.visualization as mgv
7import solara
9from mesa.visualization import SolaraViz, make_plot_component
10from mesa_geo.visualization import make_geospace_component
12import xyzservices.providers as xyz
13from matplotlib import colors
14from matplotlib.figure import Figure
16from scicom.historicalletters.agents import (
17 RegionAgent,
18 SenderAgent,
19)
20from scicom.historicalletters.model import HistoricalLetters
23def agent_draw(agent:mg.GeoAgent) -> dict:
24 """Define visualization strategies for agents.
26 Region agents get the main color as a mean of
27 all region agents topic vectors.
29 Sender agents have the color of their current
30 topic vector.
31 """
32 portrayal = {}
33 if isinstance(agent, RegionAgent):
34 color = colors.to_hex(agent.has_main_topic())
35 portrayal["color"] = color
36 elif isinstance(agent, SenderAgent):
37 colortuple = set(agent.topicVec)
38 portrayal["marker_type"] = "AwesomeIcon"
39 portrayal["name"] = "fas fa-male"
40 portrayal["icon_properties"] = {
41 "marker_color": "white",
42 "icon_color": colors.to_hex(colortuple),
43 }
44 portrayal["description"] = str(agent.unique_id)
45 return portrayal
47model_params = {
48 "population": {
49 "type": "SliderInt",
50 "value": 50,
51 "label": "Number of agents",
52 "min": 10,
53 "max": 200,
54 "step": 10,
55 },
56 "useSocialNetwork": {
57 "type": "Select",
58 "value": False,
59 "label": "Choose if an initial social network exists.",
60 "values": [True, False],
61 },
62 "useActivation": {
63 "type": "Select",
64 "value": False,
65 "label": "Choose if agents have heterogeneous acitvations.",
66 "values": [True, False],
67 },
68 "similarityThreshold": {
69 "type": "SliderFloat",
70 "value": 0.5,
71 "label": "Threshold for similarity of topics.",
72 "min": 0.0,
73 "max": 1.0,
74 "step": 0.1,
75 },
76 "moveRange": {
77 "type": "SliderFloat",
78 "value": 0.05,
79 "label": "Range defining targets for movements.",
80 "min": 0.0,
81 "max": 0.5,
82 "step": 0.1,
83 },
84 "letterRange": {
85 "type": "SliderFloat",
86 "value": 0.2,
87 "label": "Range for sending letters.",
88 "min": 0.0,
89 "max": 0.5,
90 "step": 0.1,
91 },
92}
94model = HistoricalLetters()
95page = SolaraViz(
96 model,
97 name="Historical Letters ABM",
98 model_params=model_params,
99 components=[
100 make_geospace_component(
101 agent_draw,
102 zoom=4,
103 view=[47,12],
104 tiles=xyz.OpenTopoMap,
105 scroll_wheel_zoom=True
106 ),
107 make_plot_component(["Movements", "Letters", "Clusters"])
108 ],
109)
110page