Claude commited on
Commit
32e4804
·
1 Parent(s): 3c66aeb

fix: Handle spiderweb nodes as dictionary with state array instead of list

Browse files
Files changed (1) hide show
  1. app.py +22 -16
app.py CHANGED
@@ -175,30 +175,35 @@ def build_spiderweb_graph(spiderweb_state: Optional[Dict]) -> go.Figure:
175
  paper_bgcolor="#1a1a2e", plot_bgcolor="#0f0f1e")
176
  return fig
177
 
178
- nodes = spiderweb_state.get("nodes", [])
179
- edges = spiderweb_state.get("edges", [])
180
  phase_coherence = spiderweb_state.get("phase_coherence", 0.5)
181
 
182
- node_names = [n.get("name", f"Node{i}") for i, n in enumerate(nodes)]
 
 
 
 
183
  node_x = []
184
  node_y = []
185
 
186
- # Circular layout with psi-based jitter
187
- for i, node in enumerate(nodes):
188
- angle = (2 * np.pi * i) / len(nodes)
189
- radius = 0.8 + (node.get("psi", 0.5) - 0.5) * 0.3
 
190
  node_x.append(radius * np.cos(angle) + np.random.randn() * 0.1)
191
  node_y.append(radius * np.sin(angle) + np.random.randn() * 0.1)
192
 
193
- # Build edges
194
  edge_x = []
195
  edge_y = []
196
- for edge in edges:
197
- src_idx = next((i for i, n in enumerate(nodes) if n.get("name") == edge.get("source")), None)
198
- dst_idx = next((i for i, n in enumerate(nodes) if n.get("name") == edge.get("target")), None)
199
- if src_idx is not None and dst_idx is not None:
200
- edge_x.extend([node_x[src_idx], node_x[dst_idx], None])
201
- edge_y.extend([node_y[src_idx], node_y[dst_idx], None])
 
202
 
203
  fig = go.Figure()
204
 
@@ -212,8 +217,9 @@ def build_spiderweb_graph(spiderweb_state: Optional[Dict]) -> go.Figure:
212
  ))
213
 
214
  # Add nodes
215
- node_colors = [ADAPTER_COLORS.get(node.get("name", "").lower(), "#8b5cf6") for node in nodes]
216
- node_sizes = [15 + node.get("psi", 0.5) * 20 for node in nodes]
 
217
 
218
  fig.add_trace(go.Scatter(
219
  x=node_x, y=node_y,
 
175
  paper_bgcolor="#1a1a2e", plot_bgcolor="#0f0f1e")
176
  return fig
177
 
178
+ nodes_dict = spiderweb_state.get("nodes", {})
 
179
  phase_coherence = spiderweb_state.get("phase_coherence", 0.5)
180
 
181
+ # Convert node dict to indexed list
182
+ node_ids = list(nodes_dict.keys())
183
+ node_data = [nodes_dict[nid] for nid in node_ids]
184
+
185
+ node_names = node_ids
186
  node_x = []
187
  node_y = []
188
 
189
+ # Circular layout with psi-based jitter (psi is first element of state array)
190
+ for i, node in enumerate(node_data):
191
+ angle = (2 * np.pi * i) / len(node_data)
192
+ psi = node.get("state", [0.5])[0] if isinstance(node.get("state"), list) else 0.5
193
+ radius = 0.8 + (psi - 0.5) * 0.3
194
  node_x.append(radius * np.cos(angle) + np.random.randn() * 0.1)
195
  node_y.append(radius * np.sin(angle) + np.random.randn() * 0.1)
196
 
197
+ # Build edges from neighbor relationships
198
  edge_x = []
199
  edge_y = []
200
+ for i, (nid, node) in enumerate(nodes_dict.items()):
201
+ neighbors = node.get("neighbors", [])
202
+ for neighbor_id in neighbors:
203
+ if neighbor_id in node_ids:
204
+ j = node_ids.index(neighbor_id)
205
+ edge_x.extend([node_x[i], node_x[j], None])
206
+ edge_y.extend([node_y[i], node_y[j], None])
207
 
208
  fig = go.Figure()
209
 
 
217
  ))
218
 
219
  # Add nodes
220
+ node_colors = [ADAPTER_COLORS.get(nid.lower(), "#8b5cf6") for nid in node_ids]
221
+ node_sizes = [15 + (node.get("state", [0.5])[0] if isinstance(node.get("state"), list) else 0.5) * 20
222
+ for node in node_data]
223
 
224
  fig.add_trace(go.Scatter(
225
  x=node_x, y=node_y,