Coverage for .tox/p311/lib/python3.10/site-packages/scicom/knowledgespread/server.py: 0%

1 import altair as alt

2 import mesa

3 import networkx as nx

4 import nx_altair as nxa

5 import pandas as pd

6 import solara

7 from matplotlib import colors

8 from mesa.visualization.modules import ChartVisualization

9

10 from scicom.knowledgespread.model import KnowledgeSpread

11 from scicom.knowledgespread.SimpleContinuousModule import SimpleCanvas

12 from scicom.knowledgespread.utils import ageFunction

13

14 model_params = {

15 "num_scientists": mesa.visualization.Slider(

16 "Initial number of scientists",

17 100, 10, 200, 10,

18 ),

19 "num_timesteps": mesa.visualization.Slider(

20 "How long is the number of agents growing?",

21 20, 5, 100, 5,

22 ),

23 "oppositionPercent": mesa.visualization.Slider(

24 "Percentage of opposing agents",

25 0.05, 0, 0.5, 0.05,

26 ),

27 "epiInit": mesa.visualization.Choice(

28 "Choose initial conditions for epistemic space",

29 value=("complex"),

30 choices=["complex", "central", "polarized"],

31 ),

32 "timeInit": mesa.visualization.Choice(

33 "Choose initial conditions for population growth.",

34 value=("saturate"),

35 choices=["saturate", "linear", "exponential"],

36 ),

37 "epiRange": mesa.visualization.Slider(

38 "Basic range of visibility in epistemic space",

39 0.005, 0.001, 0.03, 0.001,

40 ),

41}

42

43

44 def agent_draw_altair(agent):

45 shapeDict = {True: "triangle-up", False: "circle"}

46 colortuple = set(agent.topicledger[-1])

47 color = colors.to_hex(colortuple)

48 #color = "#" + "".join(format(int(round(val * 255)), "02x") for val in colortuple)

49 if agent.age > 0:

50 size = ageFunction(agent, agent.a, agent.b, agent.c, 10)

51 else:

52 size = 0.001

53 probDict = {

54 #"Shape": shapeDict[agent.opposition],

55 "opposition": agent.opposition,

56 #"r": ageFunction(agent),

57 "size": size,

58 #"Filled": "true",

59 "Color": color,

60 "color": color,

61 }

62 return probDict

63

64

65 def chart_draw_altair_agents(model):

66 data = model.datacollector.get_model_vars_dataframe().reset_index()

67 chart = (

68 alt.Chart(data)

69 .mark_bar(color="orange")

70 .encode(

71 x=alt.X("index", title="Step"),

72 y=alt.Y(

73 "Active Agents",

74 title="Active agents",

75 ),

76 )

77 )

78 return solara.FigureAltair(chart)

79

80

81 def chart_draw_altair_communities(model):

82 data = model.datacollector.get_model_vars_dataframe().reset_index()

83 data.insert(0, "compLen", data["Graph structure"].apply(lambda x: len(x)))

84 chart = (

85 alt.Chart(data)

86 .mark_bar(color="orange")

87 .encode(

88 x=alt.X("index", title="Step"),

89 y=alt.Y(

90 "compLen",

91 title="Communities in social network",

92 ),

93 )

94 )

95 return solara.FigureAltair(chart)

96

97

98 def epiSpace_draw_altair(model, agent_portrayal):

99 isOpposed = (False, True)

100 shape_range = ("circle", "triangle-up")

101 all_agent_data = []

102 if not model.schedule.agents:

103 return solara.Markdown("## Finished run")

104 else:

105 for agent in model.schedule.agents:

106 cur_agent = agent_draw_altair(agent)

107 cur_agent["x"] = agent.pos[0]

108 cur_agent["y"] = agent.pos[1]

109 all_agent_data.append(cur_agent)

110 df = pd.DataFrame(all_agent_data)

111 colors = list(set(a["color"] for a in all_agent_data))

112 chart_color = alt.Color("color").legend(None).scale(domain=colors, range=colors)

113 chart = (

114 alt.Chart(df)

115 .mark_point(filled=True)

116 .encode(

117 x=alt.X("x", axis=None), # no x-axis label

118 y=alt.Y("y", axis=None), # no y-axis label

119 size=alt.Size("size", title="current activity"), # relabel size for legend

120 color=chart_color,

121 shape=alt.Shape( # use shape to indicate choice

122 "opposition", scale=alt.Scale(domain=isOpposed, range=shape_range),

123 ),

124 )

125 .configure_view(strokeOpacity=0) # hide grid/chart lines

126 )

127 return solara.FigureAltair(chart)

128

129

130 def socialNetwork_draw_altair(model):

131 currentTime = model.schedule.time

132 H = model.socialNetwork

133 Graph = nx.Graph(((u, v, e) for u, v, e in H.edges(data=True) if e["time"] <= currentTime))

134 pos = nx.kamada_kawai_layout(Graph)

135 between = nx.betweenness_centrality(Graph)

136 nx.set_node_attributes(Graph, between, "between")

137 communities = list(nx.community.label_propagation_communities(Graph))

138 for f in Graph.nodes():

139 for i, c in enumerate(communities):

140 if f in c:

141 Graph.nodes()[f].update(

142 {

143 "community": str(i),

144 "name": f,

145 },

146 )

147 chart = nxa.draw_networkx(

148 G=Graph,

149 pos=pos,

150 node_color="between",

151 edge_color="time",

152 cmap="viridis",

153 )

154 chart.configure_view(strokeOpacity=0) # hide grid/chart lines

155 return solara.FigureAltair(chart)

156

157

158 def agent_draw(agent):

159 colortuple = set(agent.topicledger[-1])

160 color = "#" + "".join(format(int(round(val * 255)), "02x") for val in colortuple)

161 probDict = {

162 "Shape": "circle",

163 "r": ageFunction(agent),

164 "Filled": "true",

165 "Color": color,

166 }

167 return probDict

168

169

170 chart = ChartVisualization.ChartModule(

171 [

172 {"Label": "Active Agents", "Color": "#000000"},

173 {"Label": "Graph components", "Color": "black"},

174 ],

175 data_collector_name="datacollector",

176)

177

178

179 epistemic_canvas = SimpleCanvas(agent_draw, 720, 720)

180

181

182 server = mesa.visualization.ModularServer(

183 KnowledgeSpread,

184 [epistemic_canvas, chart],

185 "Knowledge spread",

186 model_params,

187)