Skip to content
Snippets Groups Projects
Commit f335b0f8 authored by George Marchment's avatar George Marchment
Browse files

started implementing user view

parent a1312160
No related branches found
No related tags found
No related merge requests found
Pipeline #14033 passed with stage
in 2 minutes and 10 seconds
...@@ -27,55 +27,55 @@ class Graph(): ...@@ -27,55 +27,55 @@ class Graph():
def initialise(self, processes_2_remove = []): def initialise(self, processes_2_remove = []):
if(not self.is_initialised()):
def get_node_id(dico, process):
for node in dico["nodes"]:
if(node['name']==process):
return node['id']
for sub in dico['subworkflows']:
res = get_node_id(dico['subworkflows'][sub], process)
if(res!=-1):
return res
return -1
#This function removes the process -> by the simpliest way -> it doesn't create new links
def remove_node(dico, node_id):
#Remove nodes
nodes_to_remove = []
for node in dico["nodes"]:
if(node['id']==node_id):
nodes_to_remove.append(node)
for node in nodes_to_remove:
dico["nodes"].remove(node)
#Remove edges
edges_to_remove = []
for edge in dico["edges"]:
if(edge['A']==node_id):
edges_to_remove.append(edge)
if(edge['B']==node_id):
edges_to_remove.append(edge)
for edge in edges_to_remove:
dico["edges"].remove(edge)
for sub in dico['subworkflows']:
remove_node(dico['subworkflows'][sub], node_id)
for process in processes_2_remove:
node_id = get_node_id(self.full_dico, process)
remove_node(self.full_dico, node_id)
self.get_dependency_graph()
self.get_process_dependency_graph()
def get_node_id(dico, process):
for node in dico["nodes"]: #self.networkX_wo_operations = self.get_networkx_graph(self.dico_process_dependency_graph, self.networkX_wo_operations)
if(node['name']==process): self.dico_flattened["nodes"] = []
return node['id'] self.dico_flattened["edges"] = []
for sub in dico['subworkflows']: #This will stay empty -> it's just so we can use the same function
res = get_node_id(dico['subworkflows'][sub], process) self.dico_flattened["subworkflows"] = []
if(res!=-1): self.initialised = True
return res
return -1
#This function removes the process -> by the simpliest way -> it doesn't create new links
def remove_node(dico, node_id):
#Remove nodes
nodes_to_remove = []
for node in dico["nodes"]:
if(node['id']==node_id):
nodes_to_remove.append(node)
for node in nodes_to_remove:
dico["nodes"].remove(node)
#Remove edges
edges_to_remove = []
for edge in dico["edges"]:
if(edge['A']==node_id):
edges_to_remove.append(edge)
if(edge['B']==node_id):
edges_to_remove.append(edge)
for edge in edges_to_remove:
dico["edges"].remove(edge)
for sub in dico['subworkflows']:
remove_node(dico['subworkflows'][sub], node_id)
for process in processes_2_remove:
node_id = get_node_id(self.full_dico, process)
remove_node(self.full_dico, node_id)
self.get_dependency_graph()
self.get_process_dependency_graph()
#self.networkX_wo_operations = self.get_networkx_graph(self.dico_process_dependency_graph, self.networkX_wo_operations)
self.dico_flattened["nodes"] = []
self.dico_flattened["edges"] = []
#This will stay empty -> it's just so we can use the same function
self.dico_flattened["subworkflows"] = []
self.initialised = True
def is_initialised(self): def is_initialised(self):
return self.initialised return self.initialised
...@@ -286,12 +286,31 @@ class Graph(): ...@@ -286,12 +286,31 @@ class Graph():
generate_graph(self.get_output_dir()/'graphs'/filename, graph_dico_wo_orphan_operations(self.dico_wo_branch_operation), label_edge=False, label_node=False, render_graphs = render_graphs) generate_graph(self.get_output_dir()/'graphs'/filename, graph_dico_wo_orphan_operations(self.dico_wo_branch_operation), label_edge=False, label_node=False, render_graphs = render_graphs)
#============================
#GENERATE USER VIEW
#============================
def generate_user_view(self, relevant_processes = [], render_graphs = True):
#For now i'm only gonna work from the flattened dico
self.initialise_flattened_dico(self.dico_process_dependency_graph)
dico = self.dico_flattened
relev_user_view_builder(dico, relevant_modules=relevant_processes)
generate_graph(self.get_output_dir()/'graphs'/"temp", dico, label_edge=True, label_node=True, render_graphs = render_graphs)
#============================ #============================
#METADATA FROM GRAPH #METADATA FROM GRAPH
#============================ #============================
def initialise_flattened_dico(self, dico): def initialise_flattened_dico(self, dico):
self.dico_flattened = {}
self.dico_flattened["nodes"] = []
self.dico_flattened["edges"] = []
#This will stay empty -> it's just so we can use the same function
self.dico_flattened["subworkflows"] = []
flatten_dico(dico, self.dico_flattened) flatten_dico(dico, self.dico_flattened)
#for node in dico["nodes"]: #for node in dico["nodes"]:
# self.dico_flattened["nodes"].append(node) # self.dico_flattened["nodes"].append(node)
......
...@@ -693,13 +693,16 @@ class Nextflow_File(Nextflow_Building_Blocks): ...@@ -693,13 +693,16 @@ class Nextflow_File(Nextflow_Building_Blocks):
self.graph.get_dependency_graph_wo_labels(render_graphs = render_graphs) self.graph.get_dependency_graph_wo_labels(render_graphs = render_graphs)
self.graph.get_dependency_graph_wo_orphan_operations(render_graphs = render_graphs) self.graph.get_dependency_graph_wo_orphan_operations(render_graphs = render_graphs)
self.graph.get_dependency_graph_wo_orphan_operations_wo_labels(render_graphs = render_graphs) self.graph.get_dependency_graph_wo_orphan_operations_wo_labels(render_graphs = render_graphs)
#Generate the different metadata associated with the graphs #Generate the different metadata associated with the graphs
self.graph.get_metadata_specification_graph() self.graph.get_metadata_specification_graph()
self.graph.get_metadata_dependency_graph() self.graph.get_metadata_dependency_graph()
self.graph.get_metadata_process_dependency_graph() self.graph.get_metadata_process_dependency_graph()
def generate_user_view(self, relevant_processes = [], render_graphs = True, processes_2_remove = []):
self.graph.initialise(processes_2_remove = processes_2_remove)
self.graph.generate_user_view(relevant_processes = relevant_processes, render_graphs = render_graphs)
def get_graph(self): def get_graph(self):
return self.graph return self.graph
#def get_metadata_graph_wo_operations(self): #def get_metadata_graph_wo_operations(self):
......
...@@ -343,4 +343,112 @@ def flatten_dico(dico, dico_flattened): ...@@ -343,4 +343,112 @@ def flatten_dico(dico, dico_flattened):
dico_flattened["edges"].append(edge) dico_flattened["edges"].append(edge)
for subworkflow in dico["subworkflows"]: for subworkflow in dico["subworkflows"]:
flatten_dico(dico["subworkflows"][subworkflow], dico_flattened) flatten_dico(dico["subworkflows"][subworkflow], dico_flattened)
return dico_flattened return dico_flattened
\ No newline at end of file
#==================================================
#Get user view
#Je suppose que c'est un dico flatten (avec que des processes) -> process dependency graph
def get_id_from_name(dico, name):
ids = []
for n in dico["nodes"]:
if(n['name']==name):
ids.append(n['id'])
return ids
def get_name_from_id(dico, ID):
names = []
for n in dico["nodes"]:
if(n['id']==ID):
names.append(n['name'])
return names
def get_output_nodes(dico):
N = []
for n in dico["nodes"]:
N.append(n['id'])
none_outputs = []
for e in dico["edges"]:
none_outputs.append(e['A'])
outputs = list(set(N) - set(none_outputs))
outputs_names = []
for o in outputs:
outputs_names+=get_name_from_id(dico=dico, ID=o)
return outputs_names
def remove_edges_with_node(edges, nodes):
edges_without_node = []
for e in edges:
if(e['A'] not in nodes and e['B'] not in nodes):
edges_without_node.append(e)
return edges_without_node
def get_nodes_from_edges(edges):
N = []
for e in edges:
N.append(e['A'])
N.append(e['B'])
return list(set(N))
def get_neighbors(edges, A):
Bs = []
for e in edges:
if(e['A']==A):
Bs.append(e['B'])
return Bs
def exist_path(A, B, edges):
N = get_nodes_from_edges(edges=edges)
visited = {}
for n in N:
visited[n] = False
visited[A] = True
if(A==B):
return True
for neigh in get_neighbors(edges, A):
if(exist_path(neigh, B, edges)):
return True
return False
def nr_path(n, r, dico, R, outputs):
rest_of_R = set(R)-set([r])
rest_of_R_ids = []
for r_p in rest_of_R:
rest_of_R_ids+=get_id_from_name(dico, r_p)
edges = remove_edges_with_node(dico["edges"], rest_of_R_ids)
for n_ids in get_id_from_name(dico, n):
for r_ids in get_id_from_name(dico, r):
if(exist_path(n_ids, r_ids, edges)):
return True
return False
def rSucc(n, dico, R, outputs):
tab = []
for r in set(R).union(set(outputs)):
if(nr_path(n, r, dico, R, outputs)):
tab.append(r)
return tab
def relev_user_view_builder(dico, relevant_modules):
R = relevant_modules
outputs = get_output_nodes(dico)
U = []
markes_statues = {}
N = []
for n in dico["nodes"]:
# markes_statues[n['name']] = "marked"
N.append(n['name'])
N_minus_R = set(N) - set(R)
for n in N_minus_R:
markes_statues[n] = "unmarked"
#print(N_minus_R)
for r in R:
in_r = []
for n in set(N) - set(R):
if(rSucc(n, dico, R, outputs)==[r]):
in_r.append(n)
print(r, in_r)
\ No newline at end of file
...@@ -525,3 +525,11 @@ George Marchment, Bryan Brancotte, Marie Schmit, Frédéric Lemoine, Sarah Cohen ...@@ -525,3 +525,11 @@ George Marchment, Bryan Brancotte, Marie Schmit, Frédéric Lemoine, Sarah Cohen
for t in temp: for t in temp:
tab_processes_2_remove.append(t.strip()) tab_processes_2_remove.append(t.strip())
self.nextflow_file.generate_all_graphs(render_graphs = render_graphs, processes_2_remove = tab_processes_2_remove) self.nextflow_file.generate_all_graphs(render_graphs = render_graphs, processes_2_remove = tab_processes_2_remove)
def generate_user_view(self, relevant_processes = [], render_graphs = True):
tab_processes_2_remove = []
if(self.processes_2_remove!=None):
temp = self.processes_2_remove.split(",")
for t in temp:
tab_processes_2_remove.append(t.strip())
self.nextflow_file.generate_user_view(relevant_processes = relevant_processes, render_graphs = render_graphs, processes_2_remove = tab_processes_2_remove)
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment