Spaces:
Runtime error
Runtime error
| import random | |
| import gradio as gr | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| import networkx as nx | |
| from matplotlib.colors import to_hex | |
| import threading | |
| from io import BytesIO | |
| from PIL import Image | |
| lock = threading.Lock() | |
| class Node: | |
| def __init__(self, x, y, value=1.0): | |
| self.x = x | |
| self.y = y | |
| self.value = value | |
| self.connections = [] | |
| def connect(self, other_node): | |
| if other_node not in self.connections: | |
| self.connections.append(other_node) | |
| def grow(self, increment=0.1): | |
| self.value = min(self.value + increment, 5.0) | |
| class Network: | |
| def __init__(self): | |
| self.nodes = [] | |
| def add_node(self, x, y): | |
| with lock: | |
| new_node = Node(x, y, value=random.uniform(1.0, 2.0)) | |
| self.nodes.append(new_node) | |
| return new_node | |
| def connect_nodes(self, distance_threshold=75): | |
| with lock: | |
| for node1 in self.nodes: | |
| for node2 in self.nodes: | |
| if node1 != node2 and self.distance(node1, node2) < distance_threshold: | |
| node1.connect(node2) | |
| def grow_nodes(self): | |
| with lock: | |
| for node in self.nodes: | |
| node.grow() | |
| def reset(self): | |
| with lock: | |
| self.nodes = [] | |
| def render(self): | |
| with lock: | |
| G = nx.Graph() | |
| for i, node in enumerate(self.nodes): | |
| G.add_node(i, pos=(node.x, node.y), size=node.value*100, color=self.get_color(node.value)) | |
| for i, node in enumerate(self.nodes): | |
| for conn in node.connections: | |
| j = self.nodes.index(conn) | |
| G.add_edge(i, j) | |
| pos = nx.get_node_attributes(G, 'pos') | |
| sizes = [data['size'] for _, data in G.nodes(data=True)] | |
| colors = [data['color'] for _, data in G.nodes(data=True)] | |
| plt.figure(figsize=(8,8)) | |
| nx.draw(G, pos, with_labels=False, node_size=sizes, node_color=colors, edge_color="gray") | |
| plt.axis('off') | |
| plt.tight_layout() | |
| # Save the plot to an in-memory buffer | |
| buf = BytesIO() | |
| plt.savefig(buf, format='png') | |
| buf.seek(0) | |
| plt.close() | |
| # Return a PIL image | |
| return Image.open(buf) | |
| def get_color(value): | |
| gradient = plt.cm.coolwarm | |
| return to_hex(gradient(value / 5)) | |
| def distance(node1, node2): | |
| return np.sqrt((node1.x - node2.x)**2 + (node1.y - node2.y)**2) | |
| network = Network() | |
| def interact_network(x, y): | |
| network.add_node(x, y) | |
| network.connect_nodes() | |
| network.grow_nodes() | |
| return network.render() | |
| def random_node(): | |
| x, y = random.randint(50, 450), random.randint(50, 450) | |
| return interact_network(x, y) | |
| def reset_network(): | |
| network.reset() | |
| return network.render() | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Compassion Network (In-Memory Image Example)") | |
| gr.Markdown("Add nodes and watch them grow and connect. Click Reset to start over.") | |
| with gr.Row(): | |
| with gr.Column(): | |
| x_input = gr.Number(label="X Position", value=random.randint(50,450)) | |
| y_input = gr.Number(label="Y Position", value=random.randint(50,450)) | |
| add_button = gr.Button("Add Node") | |
| random_button = gr.Button("Add Random Node") | |
| reset_button = gr.Button("Reset Network") | |
| with gr.Column(): | |
| graph_output = gr.Image(type="pil", interactive=False) | |
| # Initialize the graph with an empty image | |
| graph_output.update(value=network.render()) | |
| add_button.click(interact_network, inputs=[x_input, y_input], outputs=graph_output) | |
| random_button.click(random_node, inputs=None, outputs=graph_output) | |
| reset_button.click(reset_network, inputs=None, outputs=graph_output) | |
| if __name__ == "__main__": | |
| # Required for Hugging Face Spaces Docker | |
| demo.launch(server_name="0.0.0.0", server_port=7860) |