Spaces:
Sleeping
Sleeping
import os | |
import json | |
import networkx as nx | |
import streamlit as st | |
from st_link_analysis import st_link_analysis, NodeStyle, EdgeStyle | |
from st_link_analysis.component.layouts import LAYOUTS | |
from datasets import load_dataset | |
LAYOUT_NAMES = list(LAYOUTS.keys()) | |
st.set_page_config(layout="wide") | |
# Sample Data | |
elements = { | |
"nodes": [ | |
{"data": {"id": 1, "label": "Node", "name": "Streamlit"}}, | |
{"data": {"id": 2, "label": "PERSON", "name": "Hello"}}, | |
{"data": {"id": 3, "label": "Node", "name": "World"}}, | |
{"data": {"id": 4, "label": "POST", "content": "x"}}, | |
{"data": {"id": 5, "label": "POST", "content": "y"}}, | |
], | |
"edges": [ | |
{"data": {"id": 6, "label": "FOLLOWS", "source": 1, "target": 2}}, | |
{"data": {"id": 7, "label": "FOLLOWS", "source": 2, "target": 3}}, | |
{"data": {"id": 8, "label": "POSTED", "source": 3, "target": 4}}, | |
{"data": {"id": 9, "label": "POSTED", "source": 1, "target": 5}}, | |
{"data": {"id": 10, "label": "QUOTES", "source": 5, "target": 4}}, | |
], | |
} | |
# Style node & edge groups | |
node_styles = [ | |
NodeStyle("Node", "#FF7F3E", "name"), | |
] | |
edge_styles = [ | |
EdgeStyle("RED", "#FFB6C1", directed=False), | |
EdgeStyle("BLUE", "#87CEEB", directed=False), | |
] | |
# Render the component | |
def load_graphs(graphset_name: str): | |
graphs = nx.read_graph6(f"data/{graphset_name}") | |
return graphs | |
def load_graphs_from_dataset(graphset_name: str): | |
dataset = load_dataset("linxy/RamseyGraph", graphset_name, trust_remote_code=True) | |
return list(dataset["train"]) | |
_FILENAMES = [ | |
"r34_8", | |
"r35_12", | |
"r44_3", | |
"r37_22", | |
"r35_9", | |
"r44_7", | |
"r39_35", | |
"r45_24", | |
"r44_6", | |
"r44_11", | |
"r35_13", | |
"r44_2", | |
"r44_13", | |
"r35_8", | |
"r44_9", | |
"r34_2", | |
"r35_3", | |
"r36_4", | |
"r44_14", | |
"r34_6", | |
"r37_21", | |
"r35_7", | |
"r44_15", | |
"r34_7", | |
"r36_1", | |
"r35_6", | |
"r44_12", | |
"r36_17", | |
"r44_10", | |
"r44_8", | |
"r34_3", | |
"r35_2", | |
"r36_5", | |
"r44_16", | |
"r34_4", | |
"r36_16", | |
"r36_2", | |
"r35_5", | |
"r36_14", | |
"r35_1", | |
"r36_6", | |
"r36_10", | |
"r34_1", | |
"r36_7", | |
"r44_17", | |
"r36_12", | |
"r34_5", | |
"r38_27", | |
"r36_3", | |
"r35_4", | |
"r36_15", | |
"r44_5", | |
"r36_8", | |
"r55_42some", | |
"r35_10", | |
"r44_1", | |
"r35_11", | |
"r36_13", | |
"r46_35some", | |
"r44_4", | |
"r36_11", | |
"r36_9", | |
] | |
def convert_graph_to_json(G, show_blue): | |
# 创建元素列表,存储节点和边的数据 | |
elements = {"nodes": [], "edges": []} | |
# 遍历图的所有节点并将其添加到elements["nodes"] | |
for node in G.nodes(data=True): | |
# 假设你想为节点提供一个简单的 "label" 和 "name" | |
# 可以根据需求自定义数据结构 | |
elements["nodes"].append( | |
{ | |
"data": { | |
"id": str(node[0]), | |
"label": node[1].get("label", f"Node"), # 可根据实际属性设置 | |
"name": node[1].get("name", f"Node{node[0]}"), | |
} | |
} | |
) | |
# 遍历图的所有边并将其添加到elements["edges"] | |
edge_set = set() | |
for i, edge in enumerate(G.edges(data=True)): | |
elements["edges"].append( | |
{ | |
"data": { | |
"id": str(i + len(G.nodes)), # 确保edge的id与node的id不冲突 | |
"label": edge[2].get("label", f"RED"), | |
"source": str(edge[0]), | |
"target": str(edge[1]), | |
} | |
} | |
) | |
edge_set.add((str(edge[0]), str(edge[1]))) | |
if show_blue: | |
for i in range(len(G.nodes)): | |
for j in range(i+1, len(G.nodes)): | |
if (str(i), str(j)) in edge_set: | |
continue | |
elements["edges"].append( | |
{ | |
"data": { | |
"id": str(len(G.nodes) + len(G.edges) + i*(len(G.nodes)) + j), # 确保edge的id与node的id不冲突 | |
"label": "BLUE", | |
"source": str(i), | |
"target": str(j), | |
} | |
} | |
) | |
return elements | |
def convert_data_to_elements(G, show_blue): | |
elements = {"nodes": [], "edges": []} | |
for node in range(G['num_nodes']): | |
elements["nodes"].append( | |
{ | |
"data": { | |
"id": str(node), | |
"label": "Node", | |
"name": f"Node {node}", | |
} | |
} | |
) | |
edge_set = set() | |
for i, (source, target) in enumerate(G["edges"]): | |
elements["edges"].append( | |
{ | |
"data": { | |
"id": str(G['num_nodes'] + i), | |
"label": "RED", | |
"source": str(source), | |
"target": str(target), | |
} | |
} | |
) | |
edge_set.add((str(source), str(target))) | |
if show_blue: | |
for i in range(G['num_nodes']): | |
for j in range(i+1, G['num_nodes']): | |
if (str(i), str(j)) in edge_set: | |
continue | |
elements["edges"].append( | |
{ | |
"data": { | |
"id": str(G['num_nodes'] + len(G["edges"]) + i*(G['num_nodes']) + j), # 确保edge的id与node的id不冲突 | |
"label": "BLUE", | |
"source": str(i), | |
"target": str(j), | |
} | |
} | |
) | |
return elements | |
with st.sidebar: | |
st.title("Ramsey Graph") | |
# graphset_name = st.selectbox("R(s,t)_n", os.listdir("data"), index=0) | |
# dataset = load_dataset("linxy/RamseyGraph", graphset_name, trust_remote_code=True) | |
# graphs = load_graphs(graphset_name) | |
graphset_name = st.selectbox("R(s,t)_n", _FILENAMES, index=0) | |
graphs = load_graphs_from_dataset(graphset_name) | |
G = st.radio("G", graphs, index=0, format_func=lambda x: f"Graph with {x['num_nodes']} nodes and {len(x['edges'])} edges") | |
st.markdown("## Visualization Settings") | |
layout = st.selectbox("Layout Name", LAYOUT_NAMES, index=4) | |
show_blue = st.checkbox("Show Blue Edges", True) | |
st.markdown("## Graph Data") | |
elements = convert_data_to_elements(G, show_blue) | |
st.json(elements) | |
# print(json.dumps(elements, ensure_ascii=False, indent=2)) | |
st.markdown("# Ramsey Graph") | |
s, t = graphset_name[1], graphset_name[2] | |
st.markdown(f"the graph does not contain a clique of size {s} (RED) or an independent set of size {t} (BLUE)") | |
st_link_analysis(elements, layout, node_styles, edge_styles) | |