Spaces:
Sleeping
Sleeping
| import json | |
| import random | |
| import networkx as nx | |
| import os | |
| from visualizer import get_sorted_nodes | |
| def prepare_edges_for_json(G): | |
| nodes_list = get_sorted_nodes(G) | |
| nodes_list_dict = {str(i+1): node for i, node in enumerate(nodes_list)} | |
| coord_to_id = {v: k for k, v in nodes_list_dict.items()} | |
| edges_formatted = [] | |
| for u, v in G.edges(): | |
| if u in coord_to_id and v in coord_to_id: | |
| edges_formatted.append({"room1": coord_to_id[u], "room2": coord_to_id[v]}) | |
| return edges_formatted, list(nodes_list_dict.keys()), nodes_list_dict | |
| def prepare_parameter_for_json(G, I, nodes_list_dict): | |
| n_count = len(G.nodes()) | |
| if n_count == 0: | |
| return [], [], [], [], [], [], [], [], [], [] | |
| weights = [n_count / (n_count * (1 + (((i + 1) * 2) / 30))) for i in range(n_count)] | |
| m_weights = random.choices(I, weights=weights, k=5) | |
| t_weights_probs = [n_count / (n_count * (1 + (((i + 1) * 2) / 5))) for i in range(10)] | |
| t_weights = random.choices(range(1, 11), weights=t_weights_probs, k=5) | |
| dismantled, conditioningDuration, assignment, help_list = [], [], [], [] | |
| for m in range(5): | |
| dismantled.append({"m": str(m + 1), "i": str(m_weights[m]), "t": t_weights[m], "value": 1}) | |
| conditioningDuration.append({"m": str(m + 1), "value": 1}) | |
| x = random.randint(1, 3) | |
| if m > 2: | |
| if 1 not in help_list: x = 1 | |
| if 2 not in help_list: x = 2 | |
| if 3 not in help_list: x = 3 | |
| help_list.append(x) | |
| assignment.append({"m": str(m + 1), "r": str(x), "value": 1}) | |
| t_weights_del = random.choices(range(1, 11), weights=t_weights_probs[:10], k=3) | |
| delivered = [{"r": str(r+1), "i": "1", "t": t_weights_del[r], "value": 1} for r in range(3)] | |
| conditioningCapacity = [{"r": str(r+1), "value": 1} for r in range(3)] | |
| CostMT, CostMB, CostRT, CostRB, Coord = [], [], [], [], [] | |
| for i in range(n_count): | |
| s_id = str(i + 1) | |
| CostMT.append({"i": s_id, "value": random.choice([2, 5])}) | |
| CostMB.append({"i": s_id, "value": random.choice([5, 10, 30])}) | |
| CostRT.append({"i": s_id, "value": random.choice([4, 10])}) | |
| CostRB.append({"i": s_id, "value": 1000 if i==0 else random.choice([20, 30, 100])}) | |
| if s_id in nodes_list_dict: | |
| Coord.append({"i": s_id, "Coordinates": nodes_list_dict[s_id]}) | |
| return dismantled, assignment, delivered, conditioningCapacity, conditioningDuration, CostMT, CostMB, CostRT, CostRB, Coord | |
| def generate_full_json_dict(G, loop=0): | |
| edges, I, nodes_list_dict = prepare_edges_for_json(G) | |
| dismantled, assignment, delivered, condCap, condDur, CostMT, CostMB, CostRT, CostRB, Coord = prepare_parameter_for_json(G, I, nodes_list_dict) | |
| sets = { | |
| "I": I, "E": {"bidirectional": True, "seed": 1, "edges": edges}, | |
| "M": ["1", "2", "3", "4", "5"], "R": ["1", "2", "3"] | |
| } | |
| params = { | |
| "defaults": { "V": 1000, "CostMB": 100, "CostMT": 20, "CostRB": 300, "CostRT": 50 }, | |
| "t_max": 100, "V": [{"m": "1", "i": "1", "value": 42}], | |
| "dismantled": dismantled, "delivered": delivered, | |
| "conditioningCapacity": condCap, "conditioningDuration": condDur, | |
| "assignment": assignment, "Coord": Coord, | |
| "CostMT": CostMT, "CostMB": CostMB, "CostRT": CostRT, "CostRB": CostRB, "CostZR": 9, "CostZH": 5 | |
| } | |
| return {"description": "Generated by Gradio", "sets": sets, "params": params} | |
| def load_graph_from_data(data, name): | |
| """Core function to parse loaded JSON data into a NetworkX graph.""" | |
| G = nx.Graph() | |
| id_to_coord = {} | |
| if "params" in data and "Coord" in data["params"]: | |
| for item in data["params"]["Coord"]: | |
| coord = tuple(item["Coordinates"]) | |
| id_to_coord[item["i"]] = coord | |
| G.add_node(coord) | |
| if "sets" in data and "E" in data["sets"] and "edges" in data["sets"]["E"]: | |
| for edge in data["sets"]["E"]["edges"]: | |
| r1 = edge["room1"] | |
| r2 = edge["room2"] | |
| if r1 in id_to_coord and r2 in id_to_coord: | |
| G.add_edge(id_to_coord[r1], id_to_coord[r2]) | |
| width = max([n[0] for n in G.nodes()]) if len(G.nodes()) > 0 else 10 | |
| height = max([n[1] for n in G.nodes()]) if len(G.nodes()) > 0 else 10 | |
| width = int(width + max(2, width * 0.1)) | |
| height = int(height + max(2, height * 0.1)) | |
| return {"name": name, "graph": G, "width": width, "height": height} | |
| def load_graph_from_json(filepath): | |
| with open(filepath, 'r') as f: | |
| data = json.load(f) | |
| return load_graph_from_data(data, os.path.basename(filepath)) |