Skip to content

Commit cbbffd6

Browse files
Operative solution (#132)
* apply operative solution * Fix codacy issues * Change name of firts element of loss * Add tutorial * Solve codacy issues * Fix tutorials * Delete useless output files
1 parent f0bc3a3 commit cbbffd6

38 files changed

Lines changed: 5587 additions & 2117 deletions

grape/fault_diagnosis.py

Lines changed: 38 additions & 191 deletions
Large diffs are not rendered by default.

grape/general_graph.py

Lines changed: 37 additions & 169 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
import numpy as np
88
import networkx as nx
99
import pandas as pd
10-
from matplotlib import cm
11-
from matplotlib.colors import ListedColormap
1210
import matplotlib.lines as mlines
1311
import matplotlib.pyplot as plt
1412

@@ -42,14 +40,13 @@ def load(self, filename):
4240
4341
:param str filename: input file in CSV format.
4442
45-
:return: DataFrame containing the following attributes: mark, area,
46-
perturbation_resistant, init_status, description;
43+
:return: DataFrame containing the following attributes: mark,
44+
init_status, description;
4745
DataFrame containing mark and father_mark attribute.
4846
:rtype: pandas.DataFrame, pandas.DataFrame
4947
"""
5048

51-
conv = {'mark' : str, 'father_mark' : str,
52-
'perturbation_resistant' : str}
49+
conv = {'mark' : str, 'father_mark' : str}
5350
graph_df = pd.read_csv(filename, converters=conv, keep_default_na=False)
5451
cols_to_num = ['init_status', 'initial_service']
5552
graph_df[cols_to_num] = graph_df[cols_to_num].apply(pd.to_numeric,
@@ -59,34 +56,24 @@ def load(self, filename):
5956

6057
edge_weight = row.pop('weight')
6158
father_mark = row.pop('father_mark')
62-
edge_father_condition = row.pop('father_condition')
6359

6460
self.add_node(row['mark'], **row)
6561

6662
if father_mark != 'NULL':
6763
self.add_edge(
6864
father_mark, row['mark'],
69-
father_condition=edge_father_condition,
7065
weight=edge_weight)
7166

7267
graph_edges_df = graph_df[['mark', 'father_mark']]
7368

74-
graph_df.drop(['father_condition', 'father_mark', 'type',
75-
'weight', 'initial_service'], axis=1, inplace=True)
69+
graph_df.drop(['father_mark', 'type', 'weight', 'initial_service'],
70+
axis=1, inplace=True)
7671
graph_df.drop_duplicates(inplace=True)
7772
graph_df.set_index('mark', inplace=True)
7873

7974
self._final_status = {}
80-
nx.set_node_attributes(self, 'AVAILABLE', name='status_area')
8175
nx.set_node_attributes(self, 'ACTIVE', name='mark_status')
8276

83-
perts = nx.get_node_attributes(self, 'perturbation_resistant')
84-
split_perts = {node: perts[node].split("/")
85-
for node in self.nodes}
86-
strip_perts = {node: [x.strip() for x in split_perts[node]]
87-
for node in self.nodes}
88-
nx.set_node_attributes(self, strip_perts, name='perturbation_resistant')
89-
9077
return graph_df, graph_edges_df
9178

9279
@property
@@ -98,26 +85,6 @@ def mark(self):
9885
"""
9986
return nx.get_node_attributes(self, 'mark')
10087

101-
@property
102-
def area(self):
103-
"""
104-
105-
:return: area attribute for every node.
106-
:rtype: dict
107-
"""
108-
109-
return nx.get_node_attributes(self, 'area')
110-
111-
@property
112-
def perturbation_resistant(self):
113-
"""
114-
115-
:return: perturbation_resistant attribute for every node.
116-
:rtype: dict
117-
"""
118-
119-
return nx.get_node_attributes(self, 'perturbation_resistant')
120-
12188
@property
12289
def description(self):
12390
"""
@@ -172,36 +139,6 @@ def mark_status(self):
172139

173140
return nx.get_node_attributes(self, 'mark_status')
174141

175-
@property
176-
def status_area(self):
177-
"""
178-
179-
:return: status_area attribute for every node.
180-
:rtype: dict
181-
"""
182-
183-
return nx.get_node_attributes(self, 'status_area')
184-
185-
@status_area.setter
186-
def status_area(self, status_area_dict):
187-
"""
188-
189-
:param dict status_area_dict: dictionary keyed by node,
190-
containing the values for status_area attribute.
191-
"""
192-
193-
nx.set_node_attributes(self, status_area_dict, name='status_area')
194-
195-
@property
196-
def father_condition(self):
197-
"""
198-
199-
:return: father_condition attribute for every edge.
200-
:rtype: dict
201-
"""
202-
203-
return nx.get_edge_attributes(self, 'father_condition')
204-
205142
@property
206143
def weight(self):
207144
"""
@@ -1251,7 +1188,7 @@ def compute_service(self):
12511188

12521189
def print_graph(self, radius=None, initial_pos=None, fixed_nodes=None,
12531190
n_iter=500, thresh=0.0001, size=800, border='black', edge_width=1.0,
1254-
arrow_size=10, fsize=12, fcolor='k', title='Graph', input_cmap=None,
1191+
arrow_size=10, fsize=12, fcolor='k', title='Graph',
12551192
legend=True, legend_loc='upper right', legend_ncol=1,
12561193
legend_anchor=None, legend_fsize=12, save_to_file=None, status=None):
12571194
"""
@@ -1264,12 +1201,6 @@ def print_graph(self, radius=None, initial_pos=None, fixed_nodes=None,
12641201
a subset of the nodes.
12651202
The shapes of the nodes characterize their type
12661203
(SOURCE/HUB/USER/SWITCH).
1267-
Nodes color is set as white with black borders by default. If an input
1268-
colormap is specified, different areas get colored differently (the
1269-
colormap is evenly spaced in color depending on the total number of
1270-
areas).
1271-
Edges are colored depending on the logic relation specified: black for
1272-
SINGLE edges, magenta for AND edges, brown dashed for OR edges.
12731204
The font size, family and color for labels can be also specified,
12741205
together with the title for the window figure.
12751206
@@ -1306,10 +1237,6 @@ def print_graph(self, radius=None, initial_pos=None, fixed_nodes=None,
13061237
:type fcolor: string, optional
13071238
:param title: title for figure window, default to 'Graph'.
13081239
:type title: string, optional
1309-
:param input_cmap: colormap for coloring the different areas with
1310-
different colors, default to None.
1311-
If None, all nodes are colored as white.
1312-
:type input_cmap: Matplotlib colormap
13131240
:param legend: show the legend on/off, default to True.
13141241
:type legend: bool, optional
13151242
:param legend_loc: the location of the legend, default to 'upper right'.
@@ -1345,64 +1272,31 @@ def print_graph(self, radius=None, initial_pos=None, fixed_nodes=None,
13451272

13461273
T = copy.deepcopy(self)
13471274

1348-
T.add_nodes_from(self._del_nodes)
1349-
T.add_edges_from(self._del_edges)
1275+
#T.add_nodes_from(self._del_nodes)
1276+
#T.add_edges_from(self._del_edges)
13501277

13511278
pos = nx.spring_layout(T, k=radius, pos=initial_pos,
13521279
fixed=fixed_nodes, iterations=n_iter, threshold=thresh,
13531280
seed=3113794652)
13541281

13551282
shapes = {'SOURCE': 'v', 'USER': '^', 'HUB': 'o', 'SWITCH': 'X'}
13561283

1357-
all_areas = list(set(self.area.values()))
1358-
if input_cmap is None:
1359-
mymap = ListedColormap(["white"])
1360-
else:
1361-
mymap = cm.get_cmap(input_cmap, len(all_areas))
1362-
area_indices = {}
1363-
for idx, item in enumerate(all_areas):
1364-
area_indices[item] = idx*(1./len(all_areas))
1365-
13661284
for node in self:
1367-
col = mymap(area_indices[self.area[node]])
1368-
col = np.array([col])
1369-
nx.draw_networkx_nodes(T, pos, nodelist=[node], node_color=col,
1285+
nx.draw_networkx_nodes(T, pos, nodelist=[node],
13701286
node_shape=shapes[self.type[node]], node_size=size,
13711287
edgecolors=border, alpha=0.5)
13721288

1373-
pert_resistant = [node for node in self.perturbation_resistant.keys()
1374-
if self.perturbation_resistant[node][0]]
1289+
#if self._del_nodes:
1290+
# del_marks = {n: n for n in self._del_nodes}
1291+
# for node in self._del_nodes:
1292+
# nx.draw_networkx_nodes(T, pos, nodelist=[node],
1293+
# node_color='white', node_shape='.',
1294+
# node_size=size, edgecolors='white', alpha=1.0)
1295+
# nx.draw_networkx_labels(T, pos, labels=del_marks,
1296+
# font_size=fsize, font_color='red')
13751297

1376-
for node in pert_resistant:
1377-
col = mymap(area_indices[self.area[node]])
1378-
col = np.array([col])
1379-
nx.draw_networkx_nodes(T, pos, nodelist=[node], node_color=col,
1380-
node_shape=shapes[self.type[node]], node_size=size,
1381-
edgecolors=border, alpha=1.0)
1382-
1383-
if self._del_nodes:
1384-
del_marks = {n: n for n in self._del_nodes}
1385-
for node in self._del_nodes:
1386-
nx.draw_networkx_nodes(T, pos, nodelist=[node],
1387-
node_color='white', node_shape='.',
1388-
node_size=size, edgecolors='white', alpha=1.0)
1389-
nx.draw_networkx_labels(T, pos, labels=del_marks,
1390-
font_size=fsize, font_color='red')
1391-
1392-
or_edges = [(u, v) for (u, v, d) in self.edges(data=True)
1393-
if d['father_condition'] == 'OR']
1394-
and_edges = [(u, v) for (u, v, d) in self.edges(data=True)
1395-
if d['father_condition'] == 'AND']
1396-
single_edges = [(u, v) for (u, v, d) in self.edges(data=True)
1397-
if d['father_condition'] == 'SINGLE']
1398-
1399-
#deleted edges
1400-
or_edges_del = [(u, v) for (u, v, d) in self._del_edges
1401-
if d['father_condition'] == 'OR']
1402-
and_edges_del = [(u, v) for (u, v, d) in self._del_edges
1403-
if d['father_condition'] == 'AND']
1404-
single_edges_del = [(u, v) for (u, v, d) in self._del_edges
1405-
if d['father_condition'] == 'SINGLE']
1298+
edges = [(u, v) for (u, v, d) in self.edges(data=True)]
1299+
#edges_del = [(u, v) for (u, v, d) in self._del_edges]
14061300

14071301
if status == 'initial':
14081302
status_sw = [k for k, v in self.init_status.items() if not v]
@@ -1411,29 +1305,15 @@ def print_graph(self, radius=None, initial_pos=None, fixed_nodes=None,
14111305
for pred in list(self.predecessors(sw)):
14121306
edges_no_init.append((pred,sw))
14131307

1414-
or_edges = list(set(or_edges)-set(edges_no_init))
1415-
and_edges = list(set(and_edges)-set(edges_no_init))
1416-
single_edges = list(set(single_edges)-set(edges_no_init))
1417-
1418-
nx.draw_networkx_edges(T, pos, edgelist=or_edges, width=edge_width,
1419-
arrowsize=arrow_size, alpha=0.9, edge_color='brown', style='dashed',
1420-
node_size=size)
1421-
nx.draw_networkx_edges(T, pos, edgelist=and_edges, width=edge_width,
1422-
arrowsize=arrow_size, alpha=0.9, edge_color='violet',
1423-
node_size=size)
1424-
nx.draw_networkx_edges(T, pos, edgelist=single_edges,
1308+
edges = list(set(edges)-set(edges_no_init))
1309+
1310+
nx.draw_networkx_edges(T, pos, edgelist=edges,
14251311
width=edge_width, arrowsize=arrow_size, alpha=0.9,
14261312
edge_color='black', node_size=size)
14271313

1428-
nx.draw_networkx_edges(T, pos, edgelist=or_edges_del,
1429-
width=(edge_width/2.), arrowsize=arrow_size, alpha=0.9,
1430-
edge_color='red', style='dashed', node_size=size)
1431-
nx.draw_networkx_edges(T, pos, edgelist=and_edges_del,
1432-
width=(edge_width/2.), arrowsize=arrow_size, alpha=0.9,
1433-
edge_color='red', node_size=size)
1434-
nx.draw_networkx_edges(T, pos, edgelist=single_edges_del,
1435-
width=(edge_width/2.), arrowsize=arrow_size, alpha=0.9,
1436-
edge_color='red', node_size=size)
1314+
#nx.draw_networkx_edges(T, pos, edgelist=edges_del,
1315+
# width=(edge_width/2.), arrowsize=arrow_size, alpha=0.9,
1316+
# edge_color='red', node_size=size)
14371317

14381318
nx.draw_networkx_labels(T, pos, labels=self.mark, font_size=fsize,
14391319
font_color=fcolor)
@@ -1461,31 +1341,19 @@ def print_graph(self, radius=None, initial_pos=None, fixed_nodes=None,
14611341
markeredgecolor='black', markersize=legend_fsize, linewidth=0.0,
14621342
label='SWITCH')
14631343
handles.append(switch_key)
1464-
pr_key = mlines.Line2D([], [], color='black', alpha=1.0, marker='o',
1465-
markeredgecolor='black', markersize=legend_fsize, linewidth=0.0,
1466-
label='Perturbation Resistant')
1467-
handles.append(pr_key)
1468-
del_node_key = mlines.Line2D([], [], color='red', alpha=1.0, marker='.',
1469-
markeredgecolor='white', markersize=legend_fsize, linewidth=0.0,
1470-
label='Broken node')
1471-
handles.append(del_node_key)
1472-
1473-
single_key = mlines.Line2D([], [], color='white',
1344+
#del_node_key = mlines.Line2D([], [], color='red', alpha=1.0,marker='.',
1345+
# markeredgecolor='white', markersize=legend_fsize, linewidth=0.0,
1346+
# label='Broken node')
1347+
#handles.append(del_node_key)
1348+
1349+
edge_key = mlines.Line2D([], [], color='white',
14741350
marker=r'$\rightarrow$', markeredgecolor='black',
1475-
markersize=legend_fsize, label='SINGLE')
1476-
handles.append(single_key)
1477-
or_key = mlines.Line2D([], [], color='white',
1478-
marker=r'$-\rightarrow$', markeredgecolor='brown',
1479-
markersize=legend_fsize, label='OR')
1480-
handles.append(or_key)
1481-
and_key = mlines.Line2D([], [], color='white',
1482-
marker=r'$\rightarrow$', markeredgecolor='violet',
1483-
markersize=legend_fsize, label='AND')
1484-
handles.append(and_key)
1485-
del_edge_key = mlines.Line2D([], [], color='white',
1486-
marker=r'$\rightarrow$', markeredgecolor='red',
1487-
markersize=legend_fsize, label='Broken edge')
1488-
handles.append(del_edge_key)
1351+
markersize=legend_fsize, label='EDGE')
1352+
handles.append(edge_key)
1353+
#del_edge_key = mlines.Line2D([], [], color='white',
1354+
# marker=r'$\rightarrow$', markeredgecolor='red',
1355+
# markersize=legend_fsize, label='Broken edge')
1356+
#handles.append(del_edge_key)
14891357

14901358
if legend:
14911359
plt.legend(handles=handles, loc=legend_loc, ncol=legend_ncol,

tests/TOY_graph.csv

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
mark,father_condition,father_mark,area,perturbation_resistant,init_status,description,type,weight,initial_service
2-
"1","ORPHAN","NULL","area1",,,,"SOURCE",1.0,1.0
3-
"2","SINGLE","1","area1",perturbation1,1,,"SWITCH",1.0,0.0
4-
"3","SINGLE","1","area1",perturbation1,1,,"SWITCH",1.0,0.0
5-
"4","SINGLE","2","area1",perturbation1,,,"HUB",1.0,0.0
6-
"5","SINGLE","3","area1",perturbation1,,,"HUB",1.0,0.0
7-
"6","SINGLE","4","area4",,,,"HUB",1.0,0.0
8-
"6","SINGLE","7","area4",,,,"HUB",1.0,0.0
9-
"7","SINGLE","6","area4",,,,"HUB",1.0,0.0
10-
"8","SINGLE","6","area4",,,,"HUB",1.0,0.0
11-
"6","SINGLE","8","area4",,,,"HUB",1.0,0.0
12-
"9","OR","8","area3",,,,"HUB",1.0,0.0
13-
"9","OR","15","area3",,,,"HUB",1.0,0.0
14-
"15","ORPHAN","NULL","area3",,,,"SOURCE",1.0,2.0
15-
"16","SINGLE","9","area3",,,,"HUB",1.0,0.0
16-
"16","SINGLE","17","area3",,,,"HUB",1.0,0.0
17-
"17","SINGLE","16","area3",,,,"HUB",1.0,0.0
18-
"10","SINGLE","17","area3",,,,"HUB",1.0,0.0
19-
"11","AND","10","area2",,,,"HUB",1.0,0.0
20-
"11","AND","5","area2",,,,"HUB",1.0,0.0
21-
"19","SINGLE","11","area2",,,,"HUB",1.0,0.0
22-
"19","SINGLE","12","area2",,,,"HUB",1.0,0.0
23-
"19","SINGLE","14","area2",,,,"HUB",1.0,0.0
24-
"12","SINGLE","19","area2",,,,"HUB",1.0,0.0
25-
"12","SINGLE","13","area2",,,,"HUB",1.0,0.0
26-
"13","SINGLE","14","area2",,,,"HUB",1.0,0.0
27-
"13","SINGLE","12","area2",,,,"HUB",1.0,0.0
28-
"14","SINGLE","19","area2",,,,"HUB",1.0,0.0
29-
"14","SINGLE","13","area2",,,,"HUB",1.0,0.0
30-
"18","SINGLE","14","area2",,,,"USER",1.0,0.0
1+
mark,father_mark,init_status,description,type,weight,initial_service
2+
"1","NULL",,,"SOURCE",1.0,1.0
3+
"2","1",1,,"SWITCH",1.0,0.0
4+
"3","1",1,,"SWITCH",1.0,0.0
5+
"4","2",,,"HUB",1.0,0.0
6+
"5","3",,,"HUB",1.0,0.0
7+
"6","4",,,"HUB",1.0,0.0
8+
"6","7",,,"HUB",1.0,0.0
9+
"7","6",,,"HUB",1.0,0.0
10+
"8","6",,,"HUB",1.0,0.0
11+
"6","8",,,"HUB",1.0,0.0
12+
"9","8",,,"HUB",1.0,0.0
13+
"9","15",,,"HUB",1.0,0.0
14+
"15","NULL",,,"SOURCE",1.0,2.0
15+
"16","9",,,"HUB",1.0,0.0
16+
"16","17",,,"HUB",1.0,0.0
17+
"17","16",,,"HUB",1.0,0.0
18+
"10","17",,,"HUB",1.0,0.0
19+
"11","10",,,"HUB",1.0,0.0
20+
"11","5",,,"HUB",1.0,0.0
21+
"19","11",,,"HUB",1.0,0.0
22+
"19","12",,,"HUB",1.0,0.0
23+
"19","14",,,"HUB",1.0,0.0
24+
"12","19",,,"HUB",1.0,0.0
25+
"12","13",,,"HUB",1.0,0.0
26+
"13","14",,,"HUB",1.0,0.0
27+
"13","12",,,"HUB",1.0,0.0
28+
"14","19",,,"HUB",1.0,0.0
29+
"14","13",,,"HUB",1.0,0.0
30+
"18","14",,,"USER",1.0,0.0

0 commit comments

Comments
 (0)