File size: 4,610 Bytes
e47825e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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))