Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import networkx as nx | |
| # Helper Functions | |
| def parse_graph_input(graph_input): | |
| """Parse user input to create an adjacency list.""" | |
| try: | |
| # Try interpreting as a dictionary (adjacency list) | |
| graph = eval(graph_input) | |
| if isinstance(graph, dict): | |
| return graph | |
| except: | |
| pass | |
| try: | |
| # Try interpreting as an edge list | |
| edges = eval(graph_input) | |
| if not isinstance(edges, list): | |
| raise ValueError("Invalid graph input. Please use an adjacency list or edge list.") | |
| graph = {} | |
| for u, v in edges: | |
| graph.setdefault(u, []).append(v) | |
| graph.setdefault(v, []).append(u) | |
| return graph | |
| except: | |
| raise ValueError("Invalid graph input. Please use a valid adjacency list or edge list.") | |
| def visualize_graph(graph): | |
| """Generate a visualization of the graph using a circular layout.""" | |
| if len(graph) > 50: # Skip visualization for large graphs | |
| return None | |
| import matplotlib.pyplot as plt | |
| plt.figure() | |
| nodes = list(graph.keys()) | |
| edges = [(u, v) for u in graph for v in graph[u]] | |
| pos = nx.circular_layout(nx.Graph(edges)) | |
| nx.draw( | |
| nx.Graph(edges), | |
| pos, | |
| with_labels=True, | |
| node_color='lightblue', | |
| edge_color='gray', | |
| node_size=500, | |
| font_size=10 | |
| ) | |
| return plt.gcf() | |
| def get_basic_graph_info(graph): | |
| """Return basic information about the graph.""" | |
| num_nodes = len(graph) | |
| num_edges = sum(len(neighbors) for neighbors in graph.values()) // 2 | |
| return ( | |
| f"### Graph Information\n" | |
| f"- Number of Nodes: {num_nodes}\n" | |
| f"- Number of Edges: {num_edges}\n" | |
| f"- Degree of Each Node: { {node: len(neighbors) for node, neighbors in graph.items()} }\n" | |
| ) | |
| def process_inputs(graph1_input, graph2_input, question_type): | |
| """Process user inputs and perform the selected operation.""" | |
| # Parse graphs | |
| graph1 = parse_graph_input(graph1_input) | |
| graph2 = parse_graph_input(graph2_input) | |
| # Determine operation based on question type | |
| if question_type == "Basic Graph Info": | |
| result = get_basic_graph_info(graph1) + "\n" + get_basic_graph_info(graph2) | |
| else: | |
| result = "Unsupported question type. Please select a valid operation." | |
| # Visualize graphs | |
| graph1_plot = visualize_graph(graph1) | |
| graph2_plot = visualize_graph(graph2) | |
| return graph1_plot, graph2_plot, result | |
| # Gradio Interface | |
| with gr.Blocks(title="Graph Theory Project") as demo: | |
| gr.Markdown("# Graph Theory Project") | |
| gr.Markdown("Analyze graphs and get basic information!") | |
| with gr.Row(): | |
| graph1_input = gr.Textbox(label="Graph 1 Input (e.g., '{0: [1], 1: [0, 2], 2: [1]}' or edge list)") | |
| graph2_input = gr.Textbox(label="Graph 2 Input (e.g., '{0: [1], 1: [0, 2], 2: [1]}' or edge list)") | |
| question_type = gr.Dropdown( | |
| choices=["Basic Graph Info"], | |
| label="Select Question Type" | |
| ) | |
| with gr.Row(): | |
| graph1_output = gr.Plot(label="Graph 1 Visualization") | |
| graph2_output = gr.Plot(label="Graph 2 Visualization") | |
| result_output = gr.Textbox(label="Results", lines=20) | |
| submit_button = gr.Button("Run") | |
| submit_button.click( | |
| process_inputs, | |
| inputs=[graph1_input, graph2_input, question_type], | |
| outputs=[graph1_output, graph2_output, result_output] | |
| ) | |
| # Launch the app | |
| demo.launch() |